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+

프로세스

  1. 새 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 프로젝트가 생성됩니다 .

  2. Operator 논리를 사용자 지정합니다.

    이 예에서는 memcached-operator 에서 각 Memcached CR(사용자 정의 리소스)에 대해 다음 조정 논리를 실행합니다.

    • memcached 배포가 없는 경우 해당 배포를 생성합니다.
    • 배포 크기가 Memcached CR에서 지정한 것과 같은지 확인합니다.

    기본적으로 memcached-operatorwatches.yaml 파일에 표시된 대로 Memcached 리소스 이벤트를 감시하고 Ansible 역할 Memcached 를 실행합니다.

    - version: v1alpha1
      group: cache.example.com
      kind: Memcached

    선택적으로 watches.yaml 파일에서 다음 논리를 사용자 지정할 수 있습니다.

    1. 역할 옵션을 지정하면 Ansible 역할로 ansible-runner 를 시작할 때 이 지정된 경로를 사용하도록 Operator가 구성됩니다. 기본적으로 operator-sdk new 명령은 역할이 이동해야 하는 절대 경로를 채웁니다.

      - version: v1alpha1
        group: cache.example.com
        kind: Memcached
        role: /opt/ansible/roles/memcached
    2. watches.yaml 파일에서 플레이북 옵션을 지정하면 Ansible 플레이북으로 ansible-runner 를 시작할 때 이 지정된 경로를 사용하도록 Operator가 구성됩니다.

      - version: v1alpha1
        group: cache.example.com
        kind: Memcached
        playbook: /opt/ansible/playbook.yaml
  3. Memcached Ansible 역할을 빌드합니다.

    roles/memcached/ 디렉터리에서 생성된 Ansible 역할을 수정합니다. 이 Ansible 역할은 리소스를 수정할 때 실행되는 논리를 제어합니다.

    1. 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
    2. 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을 생성할 수 있습니다.

  4. CRD를 배포합니다.

    Operator를 실행하기 전에 Kubernetes는 Operator가 모니터링할 새 CRD(사용자 정의 리소스 정의)를 알아야 합니다. Memcached CRD를 배포합니다.

    $ oc create -f deploy/crds/cache.example.com_memcacheds_crd.yaml
  5. Operator를 빌드하고 실행합니다.

    Operator를 빌드하고 실행하는 방법은 다음 두 가지가 있습니다.

    • Kubernetes 클러스터 내부의 포드로 사용됩니다.
    • operator-sdk up 명령을 사용하여 클러스터 외부의 Go 프로그램으로.

    다음 방법 중 하나를 선택합니다.

    1. Kubernetes 클러스터 내에서 포드로 실행합니다. 이 방법이 프로덕션에 사용하는 데 선호되는 방법입니다.

      1. memcached-operator 이미지를 빌드하여 레지스트리로 내보냅니다.

        $ operator-sdk build quay.io/example/memcached-operator:v0.0.1
        $ podman push quay.io/example/memcached-operator:v0.0.1
      2. 배포 매니페스트는 deploy/operator.yaml 파일에 생성됩니다. 이 파일의 배포 이미지는 플레이스 홀더 REPLACE_IMAGE 에서 이전 빌드 이미지로 수정해야 합니다. 이를 수행하려면 다음을 실행합니다.

        $ sed -i 's|REPLACE_IMAGE|quay.io/example/memcached-operator:v0.0.1|g' deploy/operator.yaml
      3. 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
      4. memcached-operator 배포가 시작되어 실행 중인지 확인합니다.

        $ oc get deployment
        NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
        memcached-operator       1         1         1            1           1m
    2. 클러스터 외부에서 실행합니다. 이 방법은 배포 및 테스트 속도를 높이기 위해 개발 주기 동안 선호됩니다.

      Ansible Runner 및 Ansible Runner HTTP 플러그인이 설치되어 있는지 확인합니다. 그렇지 않으면 CR이 생성될 때 Ansible Runner에서 예기치 않은 오류가 발생합니다.

      또한 watches.yaml 파일에서 참조되는 역할 경로가 시스템에 있어야 합니다. 일반적으로 컨테이너가 디스크에 배치되는 위치이므로 이 역할을 구성된 Ansible 역할 경로(예: /etc/ansible/roles)에 수동으로 복사해야 합니다.

      1. $HOME/.kube/config에 있는 기본 Kubernetes 구성 파일을 사용하여 Operator를 로컬로 실행하려면 다음을 수행합니다.

        $ operator-sdk run --local

        제공된 Kubernetes 구성 파일을 사용하여 Operator를 로컬로 실행하려면 다음을 수행합니다.

        $ operator-sdk run --local --kubeconfig=config
  6. Memcached CR을 생성합니다.

    1. 표시된 대로 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
    2. 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

    3. 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
  7. 크기를 업데이트합니다.

    1. 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
    2. Operator에서 배포 크기를 변경하는지 확인합니다.

      $ oc get deployment

      출력 예

      NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
      example-memcached    4         4         4            4           5m

  8. 리소스를 정리합니다.

    $ 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