5.16. 다중 플랫폼 지원을 위한 Operator 프로젝트 구성
단일 플랫폼만 지원하는 Operator 프로젝트보다 여러 아키텍처 및 운영 체제 또는 플랫폼을 지원하는 Operator 프로젝트는 Kubernetes 및 OpenShift Container Platform 클러스터에서 더 많은 Kubernetes 및 OpenShift Container Platform 클러스터에서 실행할 수 있습니다. 아키텍처의 예는 amd64
,arm64
,ppc64le
, s390x
입니다. 운영 체제의 예로는 Linux 및 Windows가 있습니다.
Operator 프로젝트를 여러 OpenShift Container Platform 플랫폼에서 실행할 수 있도록 다음 작업을 수행합니다.
- Operator에서 지원하는 플랫폼을 지정하는 매니페스트 목록을 빌드합니다.
- 다중 아키텍처 컴퓨팅 머신을 지원하도록 Operator의 노드 유사성을 설정합니다.
5.16.1. Operator에서 지원하는 플랫폼의 매니페스트 목록 빌드
make docker-buildx
명령을 사용하여 Operator 및 피연산자에서 지원하는 플랫폼의 매니페스트 목록을 빌드할 수 있습니다. 매니페스트 목록은 하나 이상의 아키텍처에 대한 특정 이미지 매니페스트를 참조합니다. 이미지 매니페스트는 이미지가 지원하는 플랫폼을 지정합니다.
자세한 내용은 OpenContainers Image Index Spec 또는 Image Manifest v2, Schema 2 를 참조하십시오.
Operator 프로젝트에서 애플리케이션 또는 기타 워크로드 리소스를 배포하는 경우 다음 절차에서는 애플리케이션 릴리스 프로세스 중에 애플리케이션의 멀티 플랫폼 이미지가 빌드되었다고 가정합니다.
사전 요구 사항
- Operator SDK 버전 1.31.0 이상을 사용하여 빌드된 Operator 프로젝트
- Docker가 설치됨
프로세스
Operator 및 피연산자의 이미지 매니페스트를 검사하여 Operator 프로젝트에서 지원할 수 있는 플랫폼을 찾습니다. 다음 명령을 실행하여 이미지 매니페스트를 검사합니다.
$ docker manifest inspect <image_manifest> 1
- 1
redhat/ubi9:latest
와 같은 이미지 매니페스트를 지정합니다.
Operator와 피연산자가 함께 지원하는 플랫폼은 Operator 프로젝트의 플랫폼 호환성을 결정합니다.
출력 예
{ "manifests": [ { "digest": "sha256:c0669ef34cdc14332c0f1ab0c2c01acb91d96014b172f1a76f3a39e63d1f0bda", "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "platform": { "architecture": "amd64", "os": "linux" }, "size": 528 }, ... { "digest": "sha256:30e6d35703c578ee703230b9dc87ada2ba958c1928615ac8a674fcbbcbb0f281", "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "platform": { "architecture": "arm64", "os": "linux", "variant": "v8" }, "size": 528 }, ...
이전 명령에서 플랫폼 정보를 출력하지 않으면 지정된 기본 이미지가 이미지 매니페스트 대신 단일 이미지일 수 있습니다. 다음 명령을 실행하여 이미지에서 지원하는 아키텍처를 찾을 수 있습니다.
$ docker inspect <image>
Go 기반 Operator 프로젝트의 경우 Operator SDK는 프로젝트의 Dockerfile의
amd64
아키텍처를 명시적으로 참조합니다. Dockerfile을 다음과 같이 변경하여 플랫폼 플래그에서 지정한 값으로 환경 변수를 설정합니다.Dockerfile 예
FROM golang:1.19 as builder ARG TARGETOS ARG TARGETARCH ... RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager main.go 1
- 1
GOARCH
필드를amd64
에서$TARGETARCH
로 변경합니다.
Operator 프로젝트의 makefile은
PLATFORMS
환경 변수를 정의합니다. Operator의 이미지가 기본적으로 설정된 모든 플랫폼을 지원하지 않는 경우 변수를 편집하여 지원되는 플랫폼을 지정합니다. 다음 예제에서는 지원되는 플랫폼을linux/arm64
및linux/amd64
로 정의합니다.makefile의 예
# ... PLATFORMS ?= linux/arm64,linux/amd64 1 .PHONY: docker-buildx # ...
- 1
- 다음
PLATFORMS
값은 기본적으로 설정됩니다.linux/arm64
,linux/amd64
,linux/s390x
,linux/ppc64le
.
make docker buildx
명령을 실행하여 매니페스트 목록을 생성할 때 Operator SDK는PLATFORMS
변수에서 지정한 각 플랫폼에 대한 이미지 매니페스트를 생성합니다.Operator 프로젝트 디렉터리에서 다음 명령을 실행하여 관리자 이미지를 빌드합니다. 명령을 실행하면 멀티 플랫폼 지원이 포함된 관리자 이미지가 빌드되고 매니페스트 목록을 레지스트리로 푸시합니다.
$ make docker-buildx \ IMG=<image_registry>/<organization_name>/<repository_name>:<version_or_sha>
5.16.2. 다중 아키텍처 컴퓨팅 머신 및 Operator 워크로드의 노드 유사성 규칙 정보
Operator 워크로드를 다중 아키텍처 컴퓨팅 머신에서 실행할 수 있도록 노드 유사성 규칙을 설정해야 합니다. 노드 유사성은 스케줄러에서 Pod 배치를 정의하는 데 사용하는 규칙 세트입니다. 노드 유사성 규칙을 설정하면 Operator의 워크로드가 호환되는 아키텍처가 있는 컴퓨팅 머신에 예약됩니다.
Operator가 특정 아키텍처에서 더 잘 수행하는 경우 기본 노드 유사성 규칙을 설정하여 지정된 아키텍처가 있는 머신에 Pod를 예약할 수 있습니다.
자세한 내용은 "다중 아키텍처 컴퓨팅 머신이 있는 클러스터 수락" 및 "노드 선호도 규칙을 사용하여 노드에 Pod 배치 제어"를 참조하십시오.
5.16.2.1. Operator 프로젝트에 필요한 노드 유사성 규칙을 사용하여 다중 아키텍처 컴퓨팅 머신 지원
Operator에서 다중 아키텍처 컴퓨팅 머신을 지원하려면 Operator의 필수 노드 유사성 규칙을 정의해야 합니다.
사전 요구 사항
- Operator SDK 1.31.0 이상을 사용하여 Operator 프로젝트를 생성하거나 유지 관리합니다.
- Operator에서 지원하는 플랫폼을 정의하는 매니페스트 목록입니다.
프로세스
Pod 사양 및 Pod 템플릿 사양 오브젝트를 정의하는 Kubernetes 매니페스트에서 Operator 프로젝트를 검색합니다.
중요오브젝트 유형 이름은 YAML 파일에 선언되지 않으므로 Kubernetes 매니페스트에서 필수
컨테이너
필드를 찾습니다. Pod 사양 및 Pod 템플릿 사양 오브젝트를 둘 다 지정하는 경우containers
필드가 필요합니다.Pod ,
Deployment
,DaemonSet
,StatefulSet
과 같은 오브젝트를 포함하여 Pod 사양 또는Pod
템플릿 사양을 정의하는 모든 Kubernetes 매니페스트에서 노드 유사성 규칙을 설정해야 합니다.Kubernetes 매니페스트의 예
apiVersion: v1 kind: Pod metadata: name: s1 spec: containers: - name: <container_name> image: docker.io/<org>/<image_name>
다음 예와 유사하게 Pod 사양 및 Pod 템플릿 사양 오브젝트를 정의하는 Kubernetes 매니페스트에 필요한 노드 유사성 규칙을 설정합니다.
Kubernetes 매니페스트의 예
apiVersion: v1 kind: Pod metadata: name: s1 spec: containers: - name: <container_name> image: docker.io/<org>/<image_name> affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: 1 nodeSelectorTerms: 2 - matchExpressions: 3 - key: kubernetes.io/arch 4 operator: In values: - amd64 - arm64 - ppc64le - s390x - key: kubernetes.io/os 5 operator: In values: - linux
동적으로 생성된 워크로드를 사용하는 Go 기반 Operator 프로젝트는 Operator 논리에 Pod 사양 및 Pod 템플릿 사양 오브젝트를 포함할 수 있습니다.
프로젝트에 Operator 논리에 Pod 사양 또는 Pod 템플릿 사양 오브젝트가 포함된 경우 다음 예와 유사한 Operator의 논리를 편집합니다. 다음 예제에서는 Go API를 사용하여
PodSpec
오브젝트를 업데이트하는 방법을 보여줍니다.Template: corev1.PodTemplateSpec{ ... Spec: corev1.PodSpec{ Affinity: &corev1.Affinity{ NodeAffinity: &corev1.NodeAffinity{ RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ NodeSelectorTerms: []corev1.NodeSelectorTerm{ { MatchExpressions: []corev1.NodeSelectorRequirement{ { Key: "kubernetes.io/arch", Operator: "In", Values: []string{"amd64","arm64","ppc64le","s390x"}, }, { Key: "kubernetes.io/os", Operator: "In", Values: []string{"linux"}, }, }, }, }, }, }, }, SecurityContext: &corev1.PodSecurityContext{ ... }, Containers: []corev1.Container{{ ... }}, },
다음과 같습니다.
RequiredDuringSchedulingIgnoredDuringExecution
- 필요한 규칙을 정의합니다.
NodeSelectorTerms
-
nodeAffinity
유형과 연결된nodeSelectorTerms
를 여러 개 지정하는 경우nodeSelectorTerms
중 하나를 충족하면 Pod를 노드에 예약할 수 있습니다. matchExpressions
-
nodeSelectorTerms
와 연결된matchExpressions
를 여러 개 지정하는 경우 모든matchExpressions
를 충족할 때만 Pod를 노드에 예약할 수 있습니다. kubernetes.io/arch
- 매니페스트 목록에 정의된 아키텍처를 지정합니다.
kubernetes.io/os
- 매니페스트 목록에 정의된 운영 체제를 지정합니다.
노드 유사성 규칙을 설정하지 않고 컨테이너가 호환되지 않는 아키텍처가 있는 컴퓨팅 머신에 예약된 경우 Pod가 실패하고 다음 이벤트 중 하나를 트리거합니다.
CrashLoopBackOff
-
이미지 매니페스트의 진입점이 실행되지 않고 로그에
exec 형식 오류
메시지가 출력되는 경우 발생합니다. ImagePullBackOff
- 매니페스트 목록에 Pod가 예약되거나 노드 유사성 용어가 잘못된 값으로 설정된 아키텍처에 대한 매니페스트가 포함되지 않은 경우 발생합니다.
추가 리소스
5.16.2.2. 기본 노드 유사성 규칙을 사용하여 Operator 프로젝트의 다중 아키텍처 컴퓨팅 머신 지원 구성
Operator가 특정 아키텍처에서 더 잘 수행하는 경우 기본 노드 유사성 규칙을 구성하여 지정된 아키텍처에 Pod를 예약할 수 있습니다.
사전 요구 사항
- Operator SDK 1.31.0 이상을 사용하여 Operator 프로젝트를 생성하거나 유지 관리합니다.
- Operator에서 지원하는 플랫폼을 정의하는 매니페스트 목록입니다.
- Operator 프로젝트에 필요한 노드 유사성 규칙이 설정됩니다.
프로세스
Pod 사양 및 Pod 템플릿 사양 오브젝트를 정의하는 Kubernetes 매니페스트에서 Operator 프로젝트를 검색합니다.
Kubernetes 매니페스트의 예
apiVersion: v1 kind: Pod metadata: name: s1 spec: containers: - name: <container_name> image: docker.io/<org>/<image_name>
다음 예와 같이 Pod 사양 및 Pod 템플릿 사양 오브젝트를 정의하는 Kubernetes 매니페스트에서 Operator의 기본 노드 유사성 규칙을 설정합니다.
Kubernetes 매니페스트의 예
apiVersion: v1 kind: Pod metadata: name: s1 spec: containers: - name: <container_name> image: docker.io/<org>/<image_name> affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: 1 - preference: matchExpressions: 2 - key: kubernetes.io/arch 3 operator: In 4 values: - amd64 - arm64 weight: 90 5
- 1
- 기본 규칙을 정의합니다.
- 2
nodeSelectorTerms
와 연결된matchExpressions
를 여러 개 지정하는 경우 모든matchExpressions
를 충족할 때만 Pod를 노드에 예약할 수 있습니다.- 3
- 매니페스트 목록에 정의된 아키텍처를 지정합니다.
- 4
연산자
를 지정합니다. Operator는In
,NotIn
,Exists
또는DoesNotExist
일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우In
값을 사용합니다.- 5
- 노드의 가중치를 지정하고 유효한 값은
1
-100
입니다. 가중치가 높은 노드가 우선합니다.
추가 리소스