5.4.2. Operator SDK를 사용하여 Ansible 기반 Operator 빌드
이 절차에서는 Operator SDK에서 제공하는 툴 및 라이브러리를 사용하여 Ansible 플레이북 및 모듈에서 제공하는 간단한 Memcached Operator를 구축하는 예제를 설명합니다.
사전 요구 사항
- 개발 워크스테이션에 Operator SDK v0.19.4 CLI가 설치되어 있습니다.
-
cluster
-admin
권한이 있는 계정을 사용하여 Kubernetes 기반 클러스터 v1.11.3 이상(예: OpenShift Container Platform 4.6)에 대한 액세스 -
OpenShift CLI (
oc
) v4.6 이상이 설치됨 -
ansible
v2.9.0+ -
ansible-runner
v1.1.0+ -
ansible-runner-http
v1.0.0+
프로세스
새 Operator 프로젝트를 생성합니다. 네임스페이스 범위의 Operator는 단일 네임스페이스에서 리소스를 감시하고 관리합니다. 유연성으로 인해 네임스페이스 범위의 Operator가 선호됩니다. 이를 통해 분리된 업그레이드, 장애 및 모니터링을 위한 네임스페이스 격리, 다양한 API 정의를 사용할 수 있습니다.
새 Ansible 기반 네임스페이스 범위의
memcached-operator
프로젝트를 생성하고 새 디렉터리로 변경하려면 다음 명령을 사용합니다.$ operator-sdk new memcached-operator \ --api-version=cache.example.com/v1alpha1 \ --kind=Memcached \ --type=ansible
$ cd memcached-operator
이렇게 하면 API 버전
example.com/v1apha1
및 종류Memcached가 있는 Memcached
리소스를 조사하기 위해memcached-operator
프로젝트가 생성됩니다.
Operator 논리를 사용자 지정합니다.
이 예에서는
memcached-operator
에서 각Memcached
CR(사용자 정의 리소스)에 대해 다음 조정 논리를 실행합니다.-
memcached
배포가 없는 경우 해당 배포를 생성합니다. -
배포 크기가
Memcached
CR에서 지정한 것과 같은지 확인합니다.
기본적으로
memcached-operator
는watches.yaml
파일에 표시된 대로Memcached
리소스 이벤트를 감시하고 Ansible 역할Memcached
를 실행합니다.- version: v1alpha1 group: cache.example.com kind: Memcached
선택적으로
watches.yaml 파일에서 다음 논리를 사용자 지정할 수 있습니다.
역할
옵션을 지정하면 Ansible 역할로ansible-runner
를 시작할 때 이 지정된 경로를 사용하도록 Operator가 구성됩니다. 기본적으로operator-sdk new
명령은 역할이 이동해야 하는 절대 경로를 채웁니다.- version: v1alpha1 group: cache.example.com kind: Memcached role: /opt/ansible/roles/memcached
watches.yaml
파일에서플레이북
옵션을 지정하면 Ansible 플레이북으로ansible-runner
를 시작할 때 이 지정된 경로를 사용하도록 Operator가 구성됩니다.- version: v1alpha1 group: cache.example.com kind: Memcached playbook: /opt/ansible/playbook.yaml
-
Memcached Ansible 역할을 빌드합니다.
roles/memcached/
디렉터리에서 생성된 Ansible 역할을 수정합니다. 이 Ansible 역할은 리소스를 수정할 때 실행되는 논리를 제어합니다.Memcached
사양을 정의합니다.Ansible 기반 Operator에 대한 사양 정의는 Ansible에서 완전히 수행할 수 있습니다. Ansible Operator는 CR 사양 필드에 나열된 모든 키-값 쌍을 Ansible에 변수로 전달합니다. spec 필드에 있는 모든 변수의 이름은 Ansible을 실행하기 전에 Operator에서 snake 케이스(하위 코어의 소문자)로 변환됩니다. 예를 들어 사양의
serviceAccount
는 Ansible에서service_account
로 변환됩니다.작은 정보애플리케이션에 예상되는 입력을 수신하려면 변수에 대해 Ansible에서 일부 유형 검증을 수행해야 합니다.
사용자가
spec
필드를 설정하지 않는 경우roles/memcached/defaults/main.yml 파일을 수정하여 기본값을 설정합니다.
size: 1
Memcached
배포를 정의합니다.Memcached
사양을 정의하면 리소스 변경 시 Ansible이 실제로 실행되는 것을 정의할 수 있습니다. Ansible 역할이므로 기본 동작은roles/memcached/tasks/main.yml
파일의 작업을 실행합니다.목표는
memcached:1.4.36-alpine
이미지를 실행하는 경우 Ansible에서 배포를 생성하는 것입니다. Ansible 2.7+는 배포 정의를 제어하는 데 이 예제를 활용하는 k8s Ansible 모듈을 지원합니다.roles/memcached/tasks/main.yml
을 다음과 일치하도록 수정합니다.- name: start memcached k8s: definition: kind: Deployment apiVersion: apps/v1 metadata: name: '{{ meta.name }}-memcached' namespace: '{{ meta.namespace }}' spec: replicas: "{{size}}" selector: matchLabels: app: memcached template: metadata: labels: app: memcached spec: containers: - name: memcached command: - memcached - -m=64 - -o - modern - -v image: "docker.io/memcached:1.4.36-alpine" ports: - containerPort: 11211
참고이 예제에서는
size
변수를 사용하여Memcached
배포의 복제본 수를 제어합니다. 이 예제에서는 기본값을1
로 설정하지만 모든 사용자는 기본값을 덮어쓰는 CR을 생성할 수 있습니다.
CRD를 배포합니다.
Operator를 실행하기 전에 Kubernetes는 Operator가 모니터링할 새 CRD(사용자 정의 리소스 정의)를 알아야 합니다.
Memcached
CRD를 배포합니다.$ oc create -f deploy/crds/cache.example.com_memcacheds_crd.yaml
Operator를 빌드하고 실행합니다.
Operator를 빌드하고 실행하는 방법은 다음 두 가지가 있습니다.
- Kubernetes 클러스터 내부의 포드로 사용됩니다.
-
operator-sdk up
명령을 사용하여 클러스터 외부의 Go 프로그램으로.
다음 방법 중 하나를 선택합니다.
Kubernetes 클러스터 내에서 포드로 실행합니다. 이 방법이 프로덕션에 사용하는 데 선호되는 방법입니다.
memcached-operator
이미지를 빌드하여 레지스트리로 내보냅니다.$ operator-sdk build quay.io/example/memcached-operator:v0.0.1
$ podman push quay.io/example/memcached-operator:v0.0.1
배포 매니페스트는
deploy/operator.yaml
파일에 생성됩니다. 이 파일의 배포 이미지는 플레이스 홀더REPLACE_IMAGE
에서 이전 빌드 이미지로 수정해야 합니다. 이를 수행하려면 다음을 실행합니다.$ sed -i 's|REPLACE_IMAGE|quay.io/example/memcached-operator:v0.0.1|g' deploy/operator.yaml
memcached-operator
매니페스트를 배포합니다.$ oc create -f deploy/service_account.yaml
$ oc create -f deploy/role.yaml
$ oc create -f deploy/role_binding.yaml
$ oc create -f deploy/operator.yaml
memcached-operator
배포가 시작되어 실행 중인지 확인합니다.$ oc get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE memcached-operator 1 1 1 1 1m
클러스터 외부에서 실행합니다. 이 방법은 배포 및 테스트 속도를 높이기 위해 개발 주기 동안 선호됩니다.
Ansible Runner 및 Ansible Runner HTTP 플러그인이 설치되어 있는지 확인합니다. 그렇지 않으면 CR이 생성될 때 Ansible Runner에서 예기치 않은 오류가 발생합니다.
또한
watches.yaml
파일에서 참조되는 역할 경로가 시스템에 있어야 합니다. 일반적으로 컨테이너가 디스크에 배치되는 위치이므로 이 역할을 구성된 Ansible 역할 경로(예:/etc/ansible/roles
)에 수동으로 복사해야 합니다.$HOME/.kube/config에 있는 기본 Kubernetes 구성 파일을 사용하여 Operator를 로컬로 실행하려면 다음을 수행합니다.
$ operator-sdk run --local
제공된 Kubernetes 구성 파일을 사용하여 Operator를 로컬로 실행하려면 다음을 수행합니다.
$ operator-sdk run --local --kubeconfig=config
Memcached
CR을 생성합니다.표시된 대로
deploy/crds/cache_v1alpha1_memcached_cr.yaml
파일을 수정하고Memcached
CR을 생성합니다.$ cat deploy/crds/cache_v1alpha1_memcached_cr.yaml
출력 예
apiVersion: "cache.example.com/v1alpha1" kind: "Memcached" metadata: name: "example-memcached" spec: size: 3
$ oc apply -f deploy/crds/cache_v1alpha1_memcached_cr.yaml
memcached-operator
가 CR에 대한 배포를 생성하는지 확인합니다.$ oc get deployment
출력 예
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE memcached-operator 1 1 1 1 2m example-memcached 3 3 3 3 1m
Pod에서 세 개의 복제본이 생성되었는지 확인합니다.
$ oc get pods
NAME READY STATUS RESTARTS AGE example-memcached-6fd7c98d8-7dqdr 1/1 Running 0 1m example-memcached-6fd7c98d8-g5k7v 1/1 Running 0 1m example-memcached-6fd7c98d8-m7vn7 1/1 Running 0 1m memcached-operator-7cc7cfdf86-vvjqk 1/1 Running 0 2m
크기를 업데이트합니다.
memcached
CR의spec.size
필드를3
에서4
로 변경하고 변경 사항을 적용합니다.$ cat deploy/crds/cache_v1alpha1_memcached_cr.yaml
출력 예
apiVersion: "cache.example.com/v1alpha1" kind: "Memcached" metadata: name: "example-memcached" spec: size: 4
$ oc apply -f deploy/crds/cache_v1alpha1_memcached_cr.yaml
Operator에서 배포 크기를 변경하는지 확인합니다.
$ oc get deployment
출력 예
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE example-memcached 4 4 4 4 5m
리소스를 정리합니다.
$ oc delete -f deploy/crds/cache_v1alpha1_memcached_cr.yaml
$ oc delete -f deploy/operator.yaml
$ oc delete -f deploy/role_binding.yaml
$ oc delete -f deploy/role.yaml
$ oc delete -f deploy/service_account.yaml
$ oc delete -f deploy/crds/cache_v1alpha1_memcached_crd.yaml