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의 노드 유사성을 설정합니다.
중요

Operator 프로젝트의 관련 스캐폴딩 및 테스트 툴을 포함한 Red Hat 지원 버전의 Operator SDK CLI 툴은 더 이상 사용되지 않으며 향후 OpenShift Container Platform 릴리스에서 제거될 예정입니다. Red Hat은 현재 릴리스 라이프사이클 동안 이 기능에 대한 버그 수정 및 지원을 제공하지만 이 기능은 더 이상 개선 사항을 받지 않으며 향후 OpenShift Container Platform 릴리스에서 제거됩니다.

새 Operator 프로젝트를 생성하는 데 Red Hat 지원 버전의 Operator SDK는 권장되지 않습니다. 기존 Operator 프로젝트가 있는 Operator 작성자는 OpenShift Container Platform 4.17과 함께 릴리스된 Operator SDK CLI 툴 버전을 사용하여 프로젝트를 유지 관리하고 최신 버전의 OpenShift Container Platform을 대상으로 하는 Operator 릴리스를 생성할 수 있습니다.

Operator 프로젝트의 다음과 같은 관련 기본 이미지는 더 이상 사용되지 않습니다. 이러한 기본 이미지의 런타임 기능 및 구성 API는 버그 수정 및 CVE 문제를 해결하는 데 계속 지원됩니다.

  • Ansible 기반 Operator 프로젝트의 기본 이미지
  • Helm 기반 Operator 프로젝트의 기본 이미지

OpenShift Container Platform에서 더 이상 사용되지 않거나 삭제된 주요 기능의 최신 목록은 OpenShift Container Platform 릴리스 노트에서 더 이상 사용되지 않고 삭제된 기능 섹션을 참조하십시오.

지원되지 않는 커뮤니티 유지 관리 버전에 대한 자세한 내용은 Operator SDK(Operator Framework) 를 참조하십시오.

5.16.1. Operator에서 지원하는 플랫폼의 매니페스트 목록 빌드

make docker-buildx 명령을 사용하여 Operator 및 피연산자에서 지원하는 플랫폼의 매니페스트 목록을 빌드할 수 있습니다. 매니페스트 목록은 하나 이상의 아키텍처에 대한 특정 이미지 매니페스트를 참조합니다. 이미지 매니페스트는 이미지가 지원하는 플랫폼을 지정합니다.

자세한 내용은 OpenContainers Image Index Spec 또는 Image Manifest v2, Schema 2 를 참조하십시오.

중요

Operator 프로젝트에서 애플리케이션 또는 기타 워크로드 리소스를 배포하는 경우 다음 절차에서는 애플리케이션 릴리스 프로세스 중에 애플리케이션의 멀티 플랫폼 이미지가 빌드되었다고 가정합니다.

사전 요구 사항

  • Operator SDK 버전 1.36.1 이상을 사용하여 빌드된 Operator 프로젝트
  • Docker가 설치됨

프로세스

  1. 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
            },
    ...
        ]
    }

  2. 이전 명령에서 플랫폼 정보를 출력하지 않으면 지정된 기본 이미지가 이미지 매니페스트 대신 단일 이미지일 수 있습니다. 다음 명령을 실행하여 이미지에서 지원하는 아키텍처를 찾을 수 있습니다.

    $ docker inspect <image>
  3. 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 로 변경합니다.
  4. Operator 프로젝트의 makefile은 PLATFORMS 환경 변수를 정의합니다. Operator의 이미지가 기본적으로 설정된 모든 플랫폼을 지원하지 않는 경우 변수를 편집하여 지원되는 플랫폼을 지정합니다. 다음 예제에서는 지원되는 플랫폼을 linux/arm64linux/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 변수에서 지정한 각 플랫폼에 대한 이미지 매니페스트를 생성합니다.

  5. 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.36.1 이상을 사용하여 Operator 프로젝트를 생성하거나 유지 관리합니다.
  • Operator에서 지원하는 플랫폼을 정의하는 매니페스트 목록입니다.

프로세스

  1. 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>

  2. 다음 예와 유사하게 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

    1
    필요한 규칙을 정의합니다.
    2
    nodeAffinity 유형과 연결된 nodeSelectorTerms를 여러 개 지정하는 경우 nodeSelectorTerms 중 하나를 충족하면 Pod를 노드에 예약할 수 있습니다.
    3
    nodeSelectorTerms와 연결된 matchExpressions를 여러 개 지정하는 경우 모든 matchExpressions를 충족할 때만 Pod를 노드에 예약할 수 있습니다.
    4
    매니페스트 목록에 정의된 아키텍처를 지정합니다.
    5
    매니페스트 목록에 정의된 운영 체제를 지정합니다.
  3. 동적으로 생성된 워크로드를 사용하는 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.36.1 이상을 사용하여 Operator 프로젝트를 생성하거나 유지 관리합니다.
  • Operator에서 지원하는 플랫폼을 정의하는 매니페스트 목록입니다.
  • Operator 프로젝트에 필요한 노드 유사성 규칙이 설정됩니다.

프로세스

  1. Pod 사양 및 Pod 템플릿 사양 오브젝트를 정의하는 Kubernetes 매니페스트에서 Operator 프로젝트를 검색합니다.

    Kubernetes 매니페스트의 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: s1
    spec:
      containers:
        - name: <container_name>
          image: docker.io/<org>/<image_name>

  2. 다음 예와 같이 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 입니다. 가중치가 높은 노드가 우선합니다.

5.16.3. 다음 단계

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.