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 이상이 설치됨

절차

  1. 새 Operator 프로젝트를 생성합니다. 네임스페이스 범위의 Operator는 단일 네임스페이스에서 리소스를 감시하고 관리합니다. 유연성으로 인해 네임스페이스 범위의 Operator가 선호됩니다. 이를 통해 분리된 업그레이드, 장애 및 모니터링을 위한 네임스페이스 격리, 다양한 API 정의를 사용할 수 있습니다.

    새 Helm 기반 네임스페이스 범위 nginx-operator 프로젝트를 생성하려면 다음 명령을 사용합니다.

    $ operator-sdk new nginx-operator \
      --api-version=example.com/v1alpha1 \
      --kind=Nginx \
      --type=helm
    $ cd nginx-operator

    그러면 API 버전 example.com/v1apha1 및 종류 Nginx를 사용하여 Nginx 리소스를 조사하기 위해 특별히 nginx-operator 프로젝트가 생성됩니다 .

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

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

    • Nginx 배포가 없는 경우 해당 배포를 생성합니다.
    • Nginx 서비스가 없는 경우 해당 서비스를 생성합니다.
    • Nginx 수신이 활성화되어 있지만 없는 경우 해당 수신을 생성합니다.
    • 배포, 서비스 및 선택적 수신이 Nginx CR에 지정된 대로 원하는 구성(예: 복제본 수, 이미지, 서비스 유형)과 일치하는지 확인합니다.

    기본적으로 nginx-operatorwatches.yaml 파일에 표시된 Nginx 리소스 이벤트를 감시하고 지정된 차트를 사용하여 Helm 릴리스를 실행합니다.

    - version: v1alpha1
      group: example.com
      kind: Nginx
      chart: /opt/helm/helm-charts/nginx
    1. Nginx Helm 차트를 검토합니다.

      Helm Operator 프로젝트가 생성되면 Operator SDK는 간단한 Nginx 릴리스에 대한 템플릿 세트가 포함된 Helm 차트 예제를 생성합니다.

      이 예제에서는 Helm 차트 개발자가 릴리스에 대한 유용한 정보를 전달하는 데 사용하는 NOTES.txt 템플릿과 함께 배포, 서비스, 수신 리소스에 대해 템플릿을 사용할 수 있습니다.

      Helm 차트에 익숙하지 않은 경우 Helm 차트 개발자 설명서 를 검토하십시오.

    2. Nginx CR 사양을 이해합니다.

      Helm은 이라는 개념을 사용하여 values.yaml 파일에 정의된 Helm 차트 기본값에 대한 사용자 정의 기능을 제공합니다.

      CR 사양에 원하는 값을 설정하여 이러한 기본값을 재정의합니다. 예를 들어 복제본 수를 사용할 수 있습니다.

      1. 먼저 helm-charts/nginx/values.yaml 파일을 검사하여 차트에 replicaCount 라는 값이 있으며 기본적으로 1 로 설정되어 있는지 확인합니다. 배포에 Nginx 인스턴스 2개가 있으려면 CR 사양에 replicaCount가 포함되어야 합니다. 2.

        deploy/crds/example.com_v1alpha1_nginx_cr.yaml 파일을 다음과 같이 업데이트합니다.

        apiVersion: example.com/v1alpha1
        kind: Nginx
        metadata:
          name: example-nginx
        spec:
          replicaCount: 2
      2. 마찬가지로 기본 서비스 포트는 80으로 설정됩니다. 8080 을 대신 사용하려면 서비스 포트 덮어쓰기를 추가하여 deploy/crds/example.com_v1alpha1_nginx_cr.yaml 파일을 다시 업데이트합니다.

        apiVersion: example.com/v1alpha1
        kind: Nginx
        metadata:
          name: example-nginx
        spec:
          replicaCount: 2
          service:
            port: 8080

        Helm Operator는 helm install -f ./overrides.yaml 명령과 마찬가지로 값 파일의 콘텐츠인 것처럼 전체 사양을 적용합니다.

  3. CRD를 배포합니다.

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

    $ oc create -f deploy/crds/example_v1alpha1_nginx_crd.yaml
  4. Operator를 빌드하고 실행합니다.

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

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

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

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

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

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

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

        $ oc get deployment

        출력 예

        NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
        nginx-operator       1         1         1            1           1m

    2. 클러스터 외부에서 실행합니다. 이 방법은 배포 및 테스트 속도를 높이기 위해 개발 주기 동안 선호됩니다.

      watches.yaml 파일에서 참조되는 차트 경로가 시스템에 있어야 합니다. 기본적으로 watches.yaml 파일은 operator-sdk build 명령으로 빌드 된 Operator 이미지를 사용하도록 스캐폴드됩니다. operator-sdk run --local 명령을 사용하여 Operator를 개발하고 테스트할 때 SDK는 이 경로를 위해 로컬 파일 시스템에서 찾습니다.

      1. Helm 차트 경로를 가리키도록 이 위치에 심볼릭 링크를 생성합니다.

        $ sudo mkdir -p /opt/helm/helm-charts
        $ sudo ln -s $PWD/helm-charts/nginx /opt/helm/helm-charts/nginx
      2. $HOME/.kube/config에 있는 기본 Kubernetes 구성 파일을 사용하여 Operator를 로컬로 실행하려면 다음을 수행합니다.

        $ operator-sdk run --local

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

        $ operator-sdk run --local --kubeconfig=<path_to_config>
  5. Nginx CR을 배포합니다.

    이전에 수정한 Nginx CR을 적용합니다.

    $ oc apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml

    nginx-operator 가 CR에 대한 배포를 생성하는지 확인합니다.

    $ oc get deployment

    출력 예

    NAME                                           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    example-nginx-b9phnoz9spckcrua7ihrbkrt1        2         2         2            2           1m

    Pod에서 두 개의 복제본이 생성되었는지 확인합니다.

    $ oc get pods

    출력 예

    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

    서비스 포트가 8080 으로 설정되어 있는지 확인합니다.

    $ oc get service

    출력 예

    NAME                                      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
    example-nginx-b9phnoz9spckcrua7ihrbkrt1   ClusterIP   10.96.26.3   <none>        8080/TCP   1m

  6. replicaCount 를 업데이트하고 포트를 제거합니다.

    spec.replicaCount 필드를 2 에서 3 으로 변경하고, spec.service 필드를 제거한 다음, 변경 사항을 적용합니다.

    $ cat deploy/crds/example.com_v1alpha1_nginx_cr.yaml

    출력 예

    apiVersion: "example.com/v1alpha1"
    kind: "Nginx"
    metadata:
      name: "example-nginx"
    spec:
      replicaCount: 3

    $ oc apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml

    Operator에서 배포 크기를 변경하는지 확인합니다.

    $ oc get deployment

    출력 예

    NAME                                           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    example-nginx-b9phnoz9spckcrua7ihrbkrt1        3         3         3            3           1m

    서비스 포트가 기본 80 으로 설정되어 있는지 확인합니다.

    $ oc get service

    출력 예

    NAME                                      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)  AGE
    example-nginx-b9phnoz9spckcrua7ihrbkrt1   ClusterIP   10.96.26.3   <none>        80/TCP   1m

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

    $ oc delete -f deploy/crds/example.com_v1alpha1_nginx_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/example_v1alpha1_nginx_crd.yaml
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.