This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.5.5.2. Operator SDK를 사용하여 Helm 기반 Operator 빌드
이 절차에서는 Operator SDK에서 제공하는 툴 및 라이브러리를 사용하여 Helm 차트에 의해 구동되는 간단한 Nginx Operator를 빌드하는 예를 설명합니다.
					각 차트에 대해 새 Operator를 빌드하는 것이 좋습니다. 이를 통해 Go에 완전히 확장된 Operator를 작성하여 Helm 기반 Operator에서 마이그레이션하려는 경우 더 많은 기본 제공 Kubernetes API(예: oc get Nginx) 및 유연성을 허용할 수 있습니다.
				
사전 요구 사항
- 개발 워크스테이션에 Operator SDK v0.19.4 CLI가 설치되어 있습니다.
 - 
							cluster 
-admin권한이 있는 계정을 사용하여 Kubernetes 기반 클러스터 v1.11.3 이상(예: OpenShift Container Platform 4.6)에 대한 액세스 - 
							OpenShift CLI (
oc) v4.6 이상이 설치됨 
절차
새 Operator 프로젝트를 생성합니다. 네임스페이스 범위의 Operator는 단일 네임스페이스에서 리소스를 감시하고 관리합니다. 유연성으로 인해 네임스페이스 범위의 Operator가 선호됩니다. 이를 통해 분리된 업그레이드, 장애 및 모니터링을 위한 네임스페이스 격리, 다양한 API 정의를 사용할 수 있습니다.
새 Helm 기반 네임스페이스 범위
nginx-operator프로젝트를 생성하려면 다음 명령을 사용합니다.operator-sdk new nginx-operator \ --api-version=example.com/v1alpha1 \ --kind=Nginx \ --type=helm
$ operator-sdk new nginx-operator \ --api-version=example.com/v1alpha1 \ --kind=Nginx \ --type=helmCopy to Clipboard Copied! Toggle word wrap Toggle overflow cd nginx-operator
$ cd nginx-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 그러면 API 버전
example.com/v1apha1및 종류 Nginx를 사용하여 Nginx 리소스를 조사하기 위해 특별히nginx-operator프로젝트가 생성됩니다.Operator 논리를 사용자 지정합니다.
이 예에서
nginx-operator는 각NginxCR(사용자 정의 리소스)에 대해 다음 조정 논리를 실행합니다.- Nginx 배포가 없는 경우 해당 배포를 생성합니다.
 - Nginx 서비스가 없는 경우 해당 서비스를 생성합니다.
 - Nginx 수신이 활성화되어 있지만 없는 경우 해당 수신을 생성합니다.
 - 배포, 서비스 및 선택적 수신이 Nginx CR에 지정된 대로 원하는 구성(예: 복제본 수, 이미지, 서비스 유형)과 일치하는지 확인합니다.
 
기본적으로
nginx-operator는watches.yaml파일에 표시된Nginx리소스 이벤트를 감시하고 지정된 차트를 사용하여 Helm 릴리스를 실행합니다.- version: v1alpha1 group: example.com kind: Nginx chart: /opt/helm/helm-charts/nginx
- version: v1alpha1 group: example.com kind: Nginx chart: /opt/helm/helm-charts/nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow Nginx Helm 차트를 검토합니다.
Helm Operator 프로젝트가 생성되면 Operator SDK는 간단한 Nginx 릴리스에 대한 템플릿 세트가 포함된 Helm 차트 예제를 생성합니다.
이 예제에서는 Helm 차트 개발자가 릴리스에 대한 유용한 정보를 전달하는 데 사용하는
NOTES.txt템플릿과 함께 배포, 서비스, 수신 리소스에 대해 템플릿을 사용할 수 있습니다.Helm 차트에 익숙하지 않은 경우 Helm 차트 개발자 설명서 를 검토하십시오.
Nginx CR 사양을 이해합니다.
Helm은 값이라는 개념을 사용하여
values.yaml파일에 정의된 Helm 차트 기본값에 대한 사용자 정의 기능을 제공합니다.CR 사양에 원하는 값을 설정하여 이러한 기본값을 재정의합니다. 예를 들어 복제본 수를 사용할 수 있습니다.
먼저
helm-charts/nginx/values.yaml파일을 검사하여 차트에replicaCount라는 값이 있으며 기본적으로1로 설정되어 있는지 확인합니다. 배포에 Nginx 인스턴스 2개가 있으려면 CR 사양에replicaCount가 포함되어야 합니다. 2.deploy/crds/example.com_v1alpha1_nginx_cr.yaml파일을 다음과 같이 업데이트합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 마찬가지로 기본 서비스 포트는
80으로 설정됩니다.8080을 대신 사용하려면 서비스 포트 덮어쓰기를 추가하여deploy/crds/example.com_v1alpha1_nginx_cr.yaml파일을 다시 업데이트합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Helm Operator는
helm install -f ./overrides.yaml명령과 마찬가지로 값 파일의 콘텐츠인 것처럼 전체 사양을 적용합니다.
CRD를 배포합니다.
Operator를 실행하기 전에 Kubernetes는 Operator가 모니터링할 새 CRD(사용자 정의 리소스 정의)에 대해 알아야 합니다. 다음 CRD를 배포합니다.
oc create -f deploy/crds/example_v1alpha1_nginx_crd.yaml
$ oc create -f deploy/crds/example_v1alpha1_nginx_crd.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Operator를 빌드하고 실행합니다.
Operator를 빌드하고 실행하는 방법은 다음 두 가지가 있습니다.
- Kubernetes 클러스터 내부의 포드로 사용됩니다.
 - 
									
operator-sdk up명령을 사용하여 클러스터 외부의 Go 프로그램으로. 
다음 방법 중 하나를 선택합니다.
Kubernetes 클러스터 내에서 포드로 실행합니다. 이 방법이 프로덕션에 사용하는 데 선호되는 방법입니다.
nginx-operator이미지를 빌드하여 레지스트리로 내보냅니다.operator-sdk build quay.io/example/nginx-operator:v0.0.1
$ operator-sdk build quay.io/example/nginx-operator:v0.0.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow podman push quay.io/example/nginx-operator:v0.0.1
$ podman push quay.io/example/nginx-operator:v0.0.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 배포 매니페스트는
deploy/operator.yaml파일에 생성됩니다. 이 파일의 배포 이미지는 플레이스 홀더REPLACE_IMAGE에서 이전 빌드 이미지로 수정해야 합니다. 이를 수행하려면 다음을 실행합니다.sed -i 's|REPLACE_IMAGE|quay.io/example/nginx-operator:v0.0.1|g' deploy/operator.yaml
$ sed -i 's|REPLACE_IMAGE|quay.io/example/nginx-operator:v0.0.1|g' deploy/operator.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow nginx-operator매니페스트를 배포합니다.oc create -f deploy/service_account.yaml
$ oc create -f deploy/service_account.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f deploy/role.yaml
$ oc create -f deploy/role.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f deploy/role_binding.yaml
$ oc create -f deploy/role_binding.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc create -f deploy/operator.yaml
$ oc create -f deploy/operator.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow nginx-operator배포가 실행 중인지 확인합니다.oc get deployment
$ oc get deploymentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-operator 1 1 1 1 1m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-operator 1 1 1 1 1mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 
클러스터 외부에서 실행합니다. 이 방법은 배포 및 테스트 속도를 높이기 위해 개발 주기 동안 선호됩니다.
watches.yaml파일에서 참조되는 차트 경로가 시스템에 있어야 합니다. 기본적으로watches.yaml파일은operator-sdk build 명령으로 빌드된 Operator 이미지를 사용하도록 스캐폴드됩니다.operator-sdk run --local명령을 사용하여 Operator를 개발하고 테스트할 때 SDK는 이 경로를 위해 로컬 파일 시스템에서 찾습니다.Helm 차트 경로를 가리키도록 이 위치에 심볼릭 링크를 생성합니다.
sudo mkdir -p /opt/helm/helm-charts
$ sudo mkdir -p /opt/helm/helm-chartsCopy to Clipboard Copied! Toggle word wrap Toggle overflow sudo ln -s $PWD/helm-charts/nginx /opt/helm/helm-charts/nginx
$ sudo ln -s $PWD/helm-charts/nginx /opt/helm/helm-charts/nginxCopy to Clipboard Copied! Toggle word wrap Toggle overflow $HOME/.kube/config에 있는 기본 Kubernetes 구성 파일을 사용하여 Operator를 로컬로 실행하려면 다음을 수행합니다.operator-sdk run --local
$ operator-sdk run --localCopy to Clipboard Copied! Toggle word wrap Toggle overflow 제공된 Kubernetes 구성 파일을 사용하여 Operator를 로컬로 실행하려면 다음을 수행합니다.
operator-sdk run --local --kubeconfig=<path_to_config>
$ operator-sdk run --local --kubeconfig=<path_to_config>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 
NginxCR을 배포합니다.이전에 수정한
NginxCR을 적용합니다.oc apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml
$ oc apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow nginx-operator가 CR에 대한 배포를 생성하는지 확인합니다.oc get deployment
$ oc get deploymentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1 2 2 2 2 1m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1 2 2 2 2 1mCopy to Clipboard Copied! Toggle word wrap Toggle overflow Pod에서 두 개의 복제본이 생성되었는지 확인합니다.
oc get pods
$ oc get podsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME READY STATUS RESTARTS AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1-f8f9c875d-fjcr9 1/1 Running 0 1m example-nginx-b9phnoz9spckcrua7ihrbkrt1-f8f9c875d-ljbzl 1/1 Running 0 1m
NAME READY STATUS RESTARTS AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1-f8f9c875d-fjcr9 1/1 Running 0 1m example-nginx-b9phnoz9spckcrua7ihrbkrt1-f8f9c875d-ljbzl 1/1 Running 0 1mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 서비스 포트가
8080으로 설정되어 있는지 확인합니다.oc get service
$ oc get serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1 ClusterIP 10.96.26.3 <none> 8080/TCP 1m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1 ClusterIP 10.96.26.3 <none> 8080/TCP 1mCopy to Clipboard Copied! Toggle word wrap Toggle overflow replicaCount를 업데이트하고 포트를 제거합니다.spec.replicaCount필드를2에서3으로 변경하고,spec.service필드를 제거한 다음, 변경 사항을 적용합니다.cat deploy/crds/example.com_v1alpha1_nginx_cr.yaml
$ cat deploy/crds/example.com_v1alpha1_nginx_cr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml
$ oc apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Operator에서 배포 크기를 변경하는지 확인합니다.
oc get deployment
$ oc get deploymentCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1 3 3 3 3 1m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1 3 3 3 3 1mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 서비스 포트가 기본
80으로 설정되어 있는지 확인합니다.oc get service
$ oc get serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1 ClusterIP 10.96.26.3 <none> 80/TCP 1m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-nginx-b9phnoz9spckcrua7ihrbkrt1 ClusterIP 10.96.26.3 <none> 80/TCP 1mCopy to Clipboard Copied! Toggle word wrap Toggle overflow 리소스를 정리합니다.
oc delete -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml
$ oc delete -f deploy/crds/example.com_v1alpha1_nginx_cr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete -f deploy/operator.yaml
$ oc delete -f deploy/operator.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete -f deploy/role_binding.yaml
$ oc delete -f deploy/role_binding.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete -f deploy/role.yaml
$ oc delete -f deploy/role.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete -f deploy/service_account.yaml
$ oc delete -f deploy/service_account.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete -f deploy/crds/example_v1alpha1_nginx_crd.yaml
$ oc delete -f deploy/crds/example_v1alpha1_nginx_crd.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow