5.3. 최신 Operator SDK 버전용 프로젝트 업그레이드

OpenShift Container Platform 4.8에서는 Operator SDK v1.8.0을 지원합니다. 워크스테이션에 v1.3.0 CLI가 이미 설치되어 있는 경우 최신 버전을 설치하여 CLI를 v1.8.0으로 업그레이드할 수 있습니다.

그러나 기존 Operator 프로젝트에서 Operator SDK v1.8.0과의 호환성을 유지하려면 v1.3.0 이후의 중단된 변경 사항에 업그레이드 단계가 필요합니다. v1.3.0을 사용하여 이전에 생성하거나 유지 관리되는 Operator 프로젝트에서 업그레이드 단계를 수동으로 수행해야 합니다.

5.3.1. Operator SDK v1.8.0의 프로젝트 업그레이드

v1.8.0과의 호환성을 위해 기존 Operator 프로젝트를 업그레이드하려면 다음 업그레이드 단계를 수행해야 합니다.

사전 요구 사항

  • Operator SDK v1.8.0가 설치됨
  • Operator SDK v1.3.0을 사용하여 이전에 생성되거나 유지 관리되는 Operator 프로젝트

절차

  1. PROJECT 파일을 다음과 같이 변경합니다.

    1. manifestsscorecard 오브젝트를 사용하도록 PROJECT 파일 plugins 오브젝트를 업데이트합니다.

      OLM(Operator Lifecycle Manager) 및 스코어 카드 매니페스트 를 생성하는 매니페스트 및 스코어 카드 플러그인에 관련 파일을 생성하기 위해 create 하위 명령을 실행하기 위한 플러그인 오브젝트가 있습니다.

      • Go 기반 Operator 프로젝트의 경우 기존 Go 기반 플러그인 구성 오브젝트가 이미 있습니다. 이전 구성은 계속 지원되지만, 이러한 새 오브젝트는 해당 플러그인에 구성 옵션이 추가되므로 나중에 유용합니다.

        기존 설정

        version: 3-alpha
        ...
        plugins:
          go.sdk.operatorframework.io/v2-alpha: {}

        새 설정

        version: 3-alpha
        ...
        plugins:
          manifests.sdk.operatorframework.io/v2: {}
          scorecard.sdk.operatorframework.io/v2: {}

      • 선택 사항: Ansible 및 Helm 기반 Operator 프로젝트의 경우 이전에 플러그인 구성 오브젝트가 존재하지 않았습니다. 플러그인 구성 오브젝트를 추가할 필요는 없지만 이러한 새 오브젝트는 해당 플러그인에 구성 옵션이 추가되므로 나중에 유용합니다.

        version: 3-alpha
        ...
        plugins:
          manifests.sdk.operatorframework.io/v2: {}
          scorecard.sdk.operatorframework.io/v2: {}
    2. PROJECT 구성 버전 3-alpha3으로 업그레이드해야 합니다. PROJECT 파일의 version 키는 PROJECT 구성 버전을 나타냅니다.

      기존 PROJECT 파일

      version: 3-alpha
      resources:
      - crdVersion: v1
      ...

      버전 3-alpha버전 3으로 안정화되었으며 프로젝트를 완전히 설명하는 데 충분한 config 필드 세트를 포함합니다. 이 변경 사항은 해당 버전의 사양이 alpha이므로 기본적으로 operator-sdk 명령에서 사용되었으므로 중단으로 표시되고 편리한 업그레이드 경로가 있어야 하기 때문에 기술적으로 손상되지 않습니다.

      1. alpha config-3alpha-to-3 명령을 실행하여 PROJECT 파일을 버전 3alpha에서 3으로 변환합니다.

        $ operator-sdk alpha config-3alpha-to-3

        출력 예

        Your PROJECT config file has been converted from version 3-alpha to 3. Please make sure all config data is correct.

        또한 명령은 자동 변환을 수행할 수 없는 지침이 포함된 주석을 출력합니다.

      2. 변경 사항을 확인합니다.

        프로젝트 파일

        version: "3"
        resources:
        - api:
          crdVersion: v1
        ...

  2. config/manager/manager.yaml 파일을 다음과 같이 변경합니다.

    1. Ansible 및 Helm 기반 Operator 프로젝트의 경우 활성 및 준비 프로브를 추가합니다.

      Operator SDK로 빌드된 새 프로젝트에는 기본적으로 프로브가 구성되어 있습니다. 이제 제공된 이미지 기반에서 엔드포인트 /healthz 및 /readyz 를 사용할 수 있습니다. 최신 기본 이미지를 사용하도록 Dockerfile 을 업데이트하여 프로브를 사용하도록 기존 프로젝트를 업데이트한 다음 config/manager/manager.yaml 파일의 manager 컨테이너에 다음을 추가할 수 있습니다.

      예 5.1. Ansible 기반 Operator 프로젝트 구성

        livenessProbe:
          httpGet:
            path: /healthz
            port: 6789
          initialDelaySeconds: 15
          periodSeconds: 20
        readinessProbe:
          httpGet:
            path: /readyz
            port: 6789
          initialDelaySeconds: 5
          periodSeconds: 10

      예 5.2. Helm 기반 Operator 프로젝트에 대한 구성

        livenessProbe:
          httpGet:
            path: /healthz
            port: 8081
          initialDelaySeconds: 15
          periodSeconds: 20
        readinessProbe:
          httpGet:
            path: /readyz
            port: 8081
          initialDelaySeconds: 5
          periodSeconds: 10
    2. Ansible 및 Helm 기반 Operator 프로젝트의 경우 관리자의 배포에 보안 컨텍스트를 추가합니다.

      config/manager/manager.yaml 파일에서 다음 보안 컨텍스트를 추가합니다.

      예 5.3. config/manager/manager.yaml file

      spec:
        ...
        template:
          ...
          spec:
            securityContext:
              runAsNonRoot: true
            containers:
            - name: manager
              securityContext:
                allowPrivilegeEscalation: false
  3. Makefile 을 다음과 같이 변경합니다.

    1. Ansible 및 Helm 기반 Operator 프로젝트의 경우 Makefile 에서 helm-operatoransible-operator URL을 업데이트합니다.

      • Ansible 기반 Operator 프로젝트의 경우 다음을 변경합니다.

        https://github.com/operator-framework/operator-sdk/releases/download/v1.3.0/ansible-operator-v1.3.0-$(ARCHOPER)-$(OSOPER)

        다음으로 변경합니다.

        https://github.com/operator-framework/operator-sdk/releases/download/v1.8.0/ansible-operator_$(OS)_$(ARCH)
      • Helm 기반 Operator 프로젝트의 경우 다음과 같이 변경합니다.

        https://github.com/operator-framework/operator-sdk/releases/download/v1.3.0/helm-operator-v1.3.0-$(ARCHOPER)-$(OSOPER)

        다음으로 변경합니다.

        https://github.com/operator-framework/operator-sdk/releases/download/v1.8.0/helm-operator_$(OS)_$(ARCH)
    2. Ansible 및 Helm 기반 Operator 프로젝트의 경우 Makefile에서 helm-operator,ansible-operatorkustomize 규칙을 업데이트합니다. 이러한 규칙은 로컬 바이너리를 다운로드하지만 글로벌 바이너리가 있는 경우에는 사용하지 않습니다.

      예 5.4. Ansible 기반 Operator 프로젝트의 Makefile diff

       PATH  := $(PATH):$(PWD)/bin
       SHELL := env PATH=$(PATH) /bin/sh
      -OS := $(shell uname -s | tr '[:upper:]' '[:lower:]')
      -ARCH := $(shell uname -m | sed 's/x86_64/amd64/')
      +OS    = $(shell uname -s | tr '[:upper:]' '[:lower:]')
      +ARCH  = $(shell uname -m | sed 's/x86_64/amd64/')
      +OSOPER   = $(shell uname -s | tr '[:upper:]' '[:lower:]' | sed 's/darwin/apple-darwin/' | sed 's/linux/linux-gnu/')
      +ARCHOPER = $(shell uname -m )
      
      -# Download kustomize locally if necessary, preferring the $(pwd)/bin path over global if both exist.
      -.PHONY: kustomize
      -KUSTOMIZE = $(shell pwd)/bin/kustomize
       kustomize:
      -ifeq (,$(wildcard $(KUSTOMIZE)))
      -ifeq (,$(shell which kustomize 2>/dev/null))
      +ifeq (, $(shell which kustomize 2>/dev/null))
       	@{ \
       	set -e ;\
      -	mkdir -p $(dir $(KUSTOMIZE)) ;\
      -	curl -sSLo - https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v3.5.4/kustomize_v3.5.4_$(OS)_$(ARCH).tar.gz | \
      -	tar xzf - -C bin/ ;\
      +	mkdir -p bin ;\
      +	curl -sSLo - https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v3.5.4/kustomize_v3.5.4_$(OS)_$(ARCH).tar.gz | tar xzf - -C bin/ ;\
       	}
      +KUSTOMIZE=$(realpath ./bin/kustomize)
       else
      -KUSTOMIZE = $(shell which kustomize)
      -endif
      +KUSTOMIZE=$(shell which kustomize)
       endif
      
      -# Download ansible-operator locally if necessary, preferring the $(pwd)/bin path over global if both exist.
      -.PHONY: ansible-operator
      -ANSIBLE_OPERATOR = $(shell pwd)/bin/ansible-operator
       ansible-operator:
      -ifeq (,$(wildcard $(ANSIBLE_OPERATOR)))
      -ifeq (,$(shell which ansible-operator 2>/dev/null))
      +ifeq (, $(shell which ansible-operator 2>/dev/null))
       	@{ \
       	set -e ;\
      -	mkdir -p $(dir $(ANSIBLE_OPERATOR)) ;\
      -	curl -sSLo $(ANSIBLE_OPERATOR) https://github.com/operator-framework/operator-sdk/releases/download/v1.3.0/ansible-operator_$(OS)_$(ARCH) ;\
      -	chmod +x $(ANSIBLE_OPERATOR) ;\
      +	mkdir -p bin ;\
      +	curl -LO https://github.com/operator-framework/operator-sdk/releases/download/v1.8.0/ansible-operator-v1.8.0-$(ARCHOPER)-$(OSOPER) ;\
      +	mv ansible-operator-v1.8.0-$(ARCHOPER)-$(OSOPER) ./bin/ansible-operator ;\
      +	chmod +x ./bin/ansible-operator ;\
       	}
      +ANSIBLE_OPERATOR=$(realpath ./bin/ansible-operator)
       else
      -ANSIBLE_OPERATOR = $(shell which ansible-operator)
      -endif
      +ANSIBLE_OPERATOR=$(shell which ansible-operator)
       endif

      예 5.5. Helm 기반 Operator 프로젝트의 Makefile diff

       PATH  := $(PATH):$(PWD)/bin
       SHELL := env PATH=$(PATH) /bin/sh
      -OS := $(shell uname -s | tr '[:upper:]' '[:lower:]')
      -ARCH := $(shell uname -m | sed 's/x86_64/amd64/')
      +OS    = $(shell uname -s | tr '[:upper:]' '[:lower:]')
      +ARCH  = $(shell uname -m | sed 's/x86_64/amd64/')
      +OSOPER   = $(shell uname -s | tr '[:upper:]' '[:lower:]' | sed 's/darwin/apple-darwin/' | sed 's/linux/linux-gnu/')
      +ARCHOPER = $(shell uname -m )
      
      -# Download kustomize locally if necessary, preferring the $(pwd)/bin path over global if both exist.
      -.PHONY: kustomize
      -KUSTOMIZE = $(shell pwd)/bin/kustomize
       kustomize:
      -ifeq (,$(wildcard $(KUSTOMIZE)))
      -ifeq (,$(shell which kustomize 2>/dev/null))
      +ifeq (, $(shell which kustomize 2>/dev/null))
       	@{ \
       	set -e ;\
      -	mkdir -p $(dir $(KUSTOMIZE)) ;\
      -	curl -sSLo - https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v3.5.4/kustomize_v3.5.4_$(OS)_$(ARCH).tar.gz | \
      -	tar xzf - -C bin/ ;\
      +	mkdir -p bin ;\
      +	curl -sSLo - https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v3.5.4/kustomize_v3.5.4_$(OS)_$(ARCH).tar.gz | tar xzf - -C bin/ ;\
       	}
      +KUSTOMIZE=$(realpath ./bin/kustomize)
       else
      -KUSTOMIZE = $(shell which kustomize)
      -endif
      +KUSTOMIZE=$(shell which kustomize)
       endif
      
      -# Download helm-operator locally if necessary, preferring the $(pwd)/bin path over global if both exist.
      -.PHONY: helm-operator
      -HELM_OPERATOR = $(shell pwd)/bin/helm-operator
       helm-operator:
      -ifeq (,$(wildcard $(HELM_OPERATOR)))
      -ifeq (,$(shell which helm-operator 2>/dev/null))
      +ifeq (, $(shell which helm-operator 2>/dev/null))
       	@{ \
       	set -e ;\
      -	mkdir -p $(dir $(HELM_OPERATOR)) ;\
      -	curl -sSLo $(HELM_OPERATOR) https://github.com/operator-framework/operator-sdk/releases/download/v1.3.0/helm-operator_$(OS)_$(ARCH) ;\
      -	chmod +x $(HELM_OPERATOR) ;\
      +	mkdir -p bin ;\
      +	curl -LO https://github.com/operator-framework/operator-sdk/releases/download/v1.8.0/helm-operator-v1.8.0-$(ARCHOPER)-$(OSOPER) ;\
      +	mv helm-operator-v1.8.0-$(ARCHOPER)-$(OSOPER) ./bin/helm-operator ;\
      +	chmod +x ./bin/helm-operator ;\
       	}
      +HELM_OPERATOR=$(realpath ./bin/helm-operator)
       else
      -HELM_OPERATOR = $(shell which helm-operator)
      -endif
      +HELM_OPERATOR=$(shell which helm-operator)
       endif
    3. docker-buildmake target 에서 위치 디렉토리 인수를 이동합니다.

      디렉터리 인수입니다 . docker-build 대상에서 podman CLI 기대치에 맞추기 위해 마지막 위치 인수로 이동되어 대체가 더 명확해졌습니다.

      이전 대상

      docker-build:
        docker build . -t ${IMG}

      새 대상

      docker-build:
        docker build -t ${IMG} .

      다음 명령을 실행하여 이러한 변경을 수행할 수 있습니다.

      $ sed -i 's/docker build . -t ${IMG}/docker build -t ${IMG} ./' $(git grep -l 'docker.*build \. ')
    4. Ansible 및 Helm 기반 Operator 프로젝트의 경우 Makefilehelp 대상을 추가합니다.

      Ansible 및 Helm 기반 프로젝트에서 이제 --help 플래그와 유사하게 Makefilehelp 대상을 기본적으로 제공합니다. 다음 줄을 사용하여 이 대상을 Makefile 에 수동으로 추가할 수 있습니다.

      예 5.6. help 대상

      ##@ General
      
      # The help target prints out all targets with their descriptions organized
      # beneath their categories. The categories are represented by '##@' and the
      # target descriptions by '##'. The awk commands is responsible for reading the
      # entire set of makefiles included in this invocation, looking for lines of the
      # file as xyz: ## something, and then pretty-format the target and help. Then,
      # if there's a line with ##@ something, that gets pretty-printed as a category.
      # More info on the usage of ANSI control characters for terminal formatting:
      # https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters
      # More info on the awk command:
      # http://linuxcommand.org/lc3_adv_awk.php
      
      help: ## Display this help.
      	@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n  make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf "  \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
    5. opmcatalog-build 대상을 추가합니다. 이러한 대상을 사용하여 Operator에 대한 자체 카탈로그를 생성하거나 Operator 번들을 기존 카탈로그에 추가할 수 있습니다.

      1. 다음 줄을 추가하여 Makefile에 대상을 추가합니다.

        예 5.7. opmcatalog-build 대상

        .PHONY: opm
        OPM = ./bin/opm
        opm:
        ifeq (,$(wildcard $(OPM)))
        ifeq (,$(shell which opm 2>/dev/null))
        	@{ \
        	set -e ;\
        	mkdir -p $(dir $(OPM)) ;\
        	curl -sSLo $(OPM) https://github.com/operator-framework/operator-registry/releases/download/v1.15.1/$(OS)-$(ARCH)-opm ;\
        	chmod +x $(OPM) ;\
        	}
        else
        OPM = $(shell which opm)
        endif
        endif
        BUNDLE_IMGS ?= $(BUNDLE_IMG)
        CATALOG_IMG ?= $(IMAGE_TAG_BASE)-catalog:v$(VERSION) ifneq ($(origin CATALOG_BASE_IMG), undefined) FROM_INDEX_OPT := --from-index $(CATALOG_BASE_IMG) endif
        .PHONY: catalog-build
        catalog-build: opm
        	$(OPM) index add --container-tool docker --mode semver --tag $(CATALOG_IMG) --bundles $(BUNDLE_IMGS) $(FROM_INDEX_OPT)
        
        .PHONY: catalog-push
        catalog-push: ## Push the catalog image.
        	$(MAKE) docker-push IMG=$(CATALOG_IMG)
      2. Go 기반 Operator 프로젝트를 업데이트하는 경우 다음 Makefile 변수도 추가합니다.

        예 5.8. Makefile 변수

        OS = $(shell go env GOOS)
        ARCH = $(shell go env GOARCH)
    6. Go 기반 Operator 프로젝트의 경우 MakefileSHELL 변수를 시스템 bash 바이너리로 설정합니다.

      setup-envtest.sh 스크립트를 가져오려면 bash가 필요하므로 오류 옵션을 사용하여 SHELL 변수를 bash로 설정해야 합니다.

      예 5.9. Makefile diff

      else GOBIN=$(shell go env GOBIN)
      endif
      +# Setting SHELL to bash allows bash commands to be executed by recipes.
      +# This is a requirement for 'setup-envtest.sh' in the test target.
      +# Options are set to exit when a recipe line exits non-zero or a piped command fails.
      +SHELL = /usr/bin/env bash -o pipefail
      +.SHELLFLAGS = -ec
      + all: build
  4. Go 기반 Operator 프로젝트의 경우 go. mod 파일에서 다음 항목을 변경하여 controller-runtime 을 v0.8.3 및 Kubernetes 종속 항목을 v0.20. 2로 업그레이드한 다음 프로젝트를 다시 빌드합니다.

    예 5.10. go.mod 파일

    ...
    	k8s.io/api v0.20.2
    	k8s.io/apimachinery v0.20.2
    	k8s.io/client-go v0.20.2
    	sigs.k8s.io/controller-runtime v0.8.3
  5. system:controller-manager 서비스 계정을 프로젝트에 추가합니다. 이제 operator-sdk init 명령으로 기본이 아닌 서비스 계정 controller- manager 가 생성되어 공유 네임스페이스에 설치된 Operator의 보안을 강화할 수 있습니다. 이 서비스 계정을 기존 프로젝트에 추가하려면 다음 단계를 따르십시오.

    1. 파일에 ServiceAccount 정의를 생성합니다.

      예 5.11. config/rbac/service_account.yaml 파일

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: controller-manager
        namespace: system
    2. RBAC 리소스 목록에 서비스 계정을 추가합니다.

      $ echo "- service_account.yaml" >> config/rbac/kustomization.yaml
    3. Operator의 서비스 계정을 참조하는 모든 RoleBindingClusterRoleBinding 오브젝트를 업데이트합니다.

      $ find config/rbac -name *_binding.yaml -exec sed -i -E 's/  name: default/  name: controller-manager/g' {} \;
    4. manager 배포의 spec.template.spec.serviceAccountName 필드에 서비스 계정 이름을 추가합니다.

      $ sed -i -E 's/([ ]+)(terminationGracePeriodSeconds:)/\1serviceAccountName: controller-manager\n\1\2/g' config/manager/manager.yaml
    5. 변경 사항이 다음과 같은지 확인합니다.

      예 5.12. config/manager/manager.yaml file diff

      ...
                 requests:
                   cpu: 100m
                   memory: 20Mi
      +      serviceAccountName: controller-manager
             terminationGracePeriodSeconds: 10

      예 5.13. config/rbac/auth_proxy_role_binding.yaml file diff

      ...
         name: proxy-role
       subjects:
       - kind: ServiceAccount
      -  name: default
      +  name: controller-manager
         namespace: system

      예 5.14. config/rbac/kustomization.yaml file diff

       resources:
      +- service_account.yaml
       - role.yaml
       - role_binding.yaml
       - leader_election_role.yaml

      예 5.15. config/rbac/leader_election_role_binding.yaml 파일 diff

      ...
         name: leader-election-role
       subjects:
       - kind: ServiceAccount
      -  name: default
      +  name: controller-manager
         namespace: system

      예 5.16. config/rbac/role_binding.yaml file diff

      ...
         name: manager-role
       subjects:
       - kind: ServiceAccount
      -  name: default
      +  name: controller-manager
         namespace: system

      예 5.17. config/rbac/service_account.yaml file diff

      +apiVersion: v1
      +kind: ServiceAccount
      +metadata:
      +  name: controller-manager
      +  namespace: system
  6. config/manifests/kustomization.yaml 파일을 다음과 같이 변경합니다.

    1. Kustomize 패치를 추가하여 CSV(클러스터 서비스 버전)에서 cert-manager 볼륨 및 volume Mount 개체를 제거합니다.

      OLM(Operator Lifecycle Manager)은 아직 cert-manager를 지원하지 않기 때문에 이 볼륨을 제거하고 마운트하기 위해 JSON 패치가 추가되어 OLM에서 Operator의 인증서를 생성하고 관리할 수 있습니다.

      config/manifests/kustomization.yaml 파일에서 다음 행을 추가합니다.

      예 5.18. config/manifests/kustomization.yaml 파일

      patchesJson6902:
      - target:
          group: apps
          version: v1
          kind: Deployment
          name: controller-manager
          namespace: system
        patch: |-
          # Remove the manager container's "cert" volumeMount, since OLM will create and mount a set of certs.
          # Update the indices in this path if adding or removing containers/volumeMounts in the manager's Deployment.
          - op: remove
            path: /spec/template/spec/containers/1/volumeMounts/0
          # Remove the "cert" volume, since OLM will create and mount a set of certs.
          # Update the indices in this path if adding or removing volumes in the manager's Deployment.
          - op: remove
            path: /spec/template/spec/volumes/0
    2. 선택 사항: Ansible 및 Helm 기반 Operator 프로젝트의 경우 구성 요소 구성을 사용하여 ansible-operatorhelm-operator 를 구성합니다. 이 옵션을 추가하려면 다음 단계를 따르십시오.

      1. 다음 파일을 생성합니다.

        예 5.19. config/default/manager_config_patch.yaml 파일

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: controller-manager
          namespace: system
        spec:
          template:
            spec:
              containers:
              - name: manager
                args:
                - "--config=controller_manager_config.yaml"
                volumeMounts:
                - name: manager-config
                  mountPath: /controller_manager_config.yaml
                  subPath: controller_manager_config.yaml
              volumes:
              - name: manager-config
                configMap:
                  name: manager-config
      2. 다음 파일을 생성합니다.

        예 5.20. config/manager/controller_manager_config.yaml 파일

        apiVersion: controller-runtime.sigs.k8s.io/v1alpha1
        kind: ControllerManagerConfig
        health:
          healthProbeBindAddress: :6789
        metrics:
          bindAddress: 127.0.0.1:8080
        
        leaderElection:
          leaderElect: true
          resourceName: <resource_name>
      3. resources에 다음 변경 사항을 적용하여 config/default/kustomization.yaml 파일을 업데이트합니다.

        예 5.21. config/default/kustomization.yaml file

          resources:
          ...
          - manager_config_patch.yaml
      4. 다음 변경 사항을 적용하여 config/manager/kustomization.yaml 파일을 업데이트합니다.

        예 5.22. config/manager/kustomization.yaml file

          generatorOptions:
            disableNameSuffixHash: true
        
          configMapGenerator:
          - files:
            - controller_manager_config.yaml
            name: manager-config
          apiVersion: kustomize.config.k8s.io/v1beta1
          kind: Kustomization
          images:
          - name: controller
            newName: quay.io/example/memcached-operator
            newTag: v0.0.1
    3. 선택 사항: manager 구성 패치를 config/default/kustomization.yaml 파일에 추가합니다.

      구성 파일이 처음 추가된 경우 생성된 --config 플래그가 ansible -operator 또는 helm-operator 바이너리에 추가되지 않았으므로 현재 작동하지 않습니다. --config 플래그는 파일별 두 바이너리 구성을 모두 지원합니다. 이 구성 방법은 Operator 전체가 아닌 기본 컨트롤러 관리자에게 만 적용됩니다.

      선택적으로 config 파일을 사용하여 Operator 배포를 구성하려면 다음 diff에 표시된 대로 config/default/kustomization.yaml 파일을 변경합니다.

      예 5.23. config/default/kustomization.yaml file diff

      # If you want your controller-manager to expose the /metrics # endpoint w/o any authn/z, please comment the following line.
      \- manager_auth_proxy_patch.yaml
      +# Mount the controller config file for loading manager configurations
      +# through a ComponentConfig type
      +- manager_config_patch.yaml

      플래그를 그대로 사용하거나 구성 파일 값을 재정의할 수 있습니다.

  7. Ansible- 및 Helm 기반 Operator 프로젝트의 경우 config/rbac/leader_election_role.yaml 파일을 다음과 같이 변경하여 리더 선택을 위한 역할 규칙을 추가합니다.

    예 5.24. config/rbac/leader_election_role.yaml file

    - apiGroups:
      - coordination.k8s.io
      resources:
      - leases
      verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
  8. Ansible 기반 Operator 프로젝트의 경우 Ansible 컬렉션을 업데이트합니다.

    requirements.yml 파일에서 community.kubernetesversion 필드를 1.2.1 로 변경하고, operator_sdk.util의 version 필드를 0. 2.0 으로 변경합니다.

  9. config/default/manager_auth_proxy_patch.yaml 파일을 다음과 같이 변경합니다.

    • Ansible 기반 Operator 프로젝트의 경우 config/default/manager_auth_proxy_patch.yaml 파일에 --health-probe-bind-address=:6789 인수를 추가합니다.

      예 5.25. config/default/manager_auth_proxy_patch.yaml 파일

      spec:
        template:
          spec:
            containers:
            - name: manager
              args:
              - "--health-probe-bind-address=:6789"
              ...
    • Helm 기반 Operator 프로젝트의 경우 다음을 수행합니다.

      1. config/default/manager_auth_proxy_patch.yaml 파일에 --health-probe-bind-address=:8081 인수를 추가합니다.

        예 5.26. config/default/manager_auth_proxy_patch.yaml 파일

        spec:
          template:
            spec:
              containers:
              - name: manager
                args:
                - "--health-probe-bind-address=:8081"
                ...
      2. 더 이상 사용되지 않는 플래그 --enable-leader-election--leader-elect로 바꾸고 더 이상 사용되지 않는 플래그 --metrics-addr--metrics-bind-address로 바꿉니다.
  10. config/prometheus/monitor.yaml 파일을 다음과 같이 변경합니다.

    1. Prometheus ServiceMonitor 메트릭 엔드포인트에 스키마, 토큰 및 TLS 구성을 추가합니다.

      tlsConfig가 설정되지 않았기 때문에 관리자 포드에서 https 포트를 지정하는 동안 /metrics 엔드포인트가 HTTPS를 통해 제공하도록 구성되지 않았습니다. kube-rbac-proxy는 이 엔드포인트 관리자 사이드카로 보호하므로 기본적으로 Pod에 마운트된 서비스 계정 토큰을 사용하면 이 문제가 해결됩니다.

      다음 diff에 표시된 대로 config/prometheus/monitor.yaml 파일에 변경 사항을 적용합니다.

      예 5.27. config/prometheus/monitor.yaml 파일 diff

      spec:
         endpoints:
           - path: /metrics
             port: https
      +      scheme: https
      +      bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
      +      tlsConfig:
      +        insecureSkipVerify: true
         selector:
           matchLabels:
             control-plane: controller-manager
      참고

      프로젝트에서 kube-rbac-proxy를 제거한 경우 적절한 TLS 구성을 사용하여 /metrics 엔드포인트를 보호해야 합니다.

  11. 기존 종속 리소스에 소유자 주석이 있는지 확인합니다.

    Ansible 기반 Operator 프로젝트의 경우 클러스터 범위의 종속 리소스 및 다른 네임스페이스의 종속 리소스의 소유자 참조 주석이 올바르게 적용되지 않았습니다. 해결방법은 이러한 주석을 수동으로 추가하는 것이었습니다. 이 버그가 수정되었으므로 더 이상 필요하지 않습니다.

  12. 패키지 매니페스트에 대한 지원을 중단합니다.

    Operator Framework 는 향후 릴리스에서 Operator 패키지 매니페스트 형식에 대한 지원을 제거합니다. 지속적인 사용 중단 프로세스의 일부로 operator-sdk generate packagemanifestsoperator-sdk run packagemanifests 명령이 이제 더 이상 사용되지 않습니다. 패키지 매니페스트를 번들로 마이그레이션하려면 operator-sdk pkgman-to-bundle 명령을 사용할 수 있습니다.

    operator-sdk pkgman-to-bundle --help 명령을 실행하고 자세한 내용은 "패키지 매니페스트 프로젝트 번들 형식으로 마이그레이션"을 참조하십시오.

  13. Operator의 종료자 이름을 업데이트합니다.

    Kubernetes 문서에서 제안하는 종료자 이름 형식은 다음과 같습니다.

    <qualified_group>/<finalizer_name>

    이전에 Operator SDK용으로 문서화된 형식은 다음과 같습니다.

    <finalizer_name>.<qualified_group>

    Operator에서 잘못된 형식과 일치하는 이름으로 종료자를 사용하는 경우 공식 형식과 일치하도록 변경합니다. 예를 들어 finalizer.cache.example.comcache.example.com/finalizer 로 변경해야 합니다.

Operator 프로젝트가 Operator SDK v1.8.0과 호환됩니다.

5.3.2. 추가 리소스