Kustomize 및 Helm에 구성 동기화 사용

이 튜토리얼에서는 Helm 차트를 참조하는 Kustomize 구성을 저장소에 추가한 후 구성 동기화를 사용하여 저장소에 클러스터를 동기화합니다.

구성 동기화를 사용할 때는 Git 저장소에 배치하는 Kustomize 구성 및 Helm 차트가 자동으로 렌더링됩니다. 자동화된 렌더링은 다음과 같은 이점을 제공합니다.

  • 더 이상 외부 하이드레이션 파이프라인이 필요하지 않습니다. 자동화된 렌더링을 사용하지 않으면 워크스테이션에서 Kustomize 및 Helm을 사용하여 구성을 수동으로 렌더링하거나 CI 시스템에서 하이드레이션 프로세스를 트리거하는 단계를 설정해야 합니다. 자동화된 렌더링을 사용하면 구성 동기화가 이 작업 실행을 처리합니다.

  • 유지보수 비용이 줄어듭니다. 자동화된 렌더링을 사용하지 않으면, 하나의 Git 저장소를 원본 Kustomize 구성 및 Helm 차트를 사용하여 유지보수하고 다른 Git 저장소는 외부 하이드레이션으로 생성된 출력을 사용해서 유지보수해야 합니다. 그런 후 렌더링된 출력을 사용해서 Git 저장소로부터 동기화하도록 구성 동기화를 구성해야 합니다. 자동 렌더링을 사용하면 원본 구성을 사용하여 하나의 저장소만 유지보수하면 됩니다.

  • 개발 워크플로가 간소화됩니다. 자동화된 렌더링을 사용하지 않으면 원본 구성에 변경된 항목을 병합하기 전 원본 저장소에서 한 번 그리고 렌더링된 저장소에서 한 번, 총 두 번 검토해야 합니다. 자동 렌더링을 사용하면 렌더링된 구성이 구성 동기화에서 생성되며, 원본 구성에 대한 변경 사항만 검토하면 됩니다.

저장소 구성

다음 태스크는 Kustomize 구성을 Helm 차트와 조합하는 구성을 사용하여 Git 저장소를 준비하는 방법을 보여줍니다.

  1. Git 저장소를 만들거나 Git 저장소를 이용할 수 있는지 확인합니다. 저장소에 Kustomize 및 Helm이 사용되기 때문에 구조화되지 않은 저장소여야 합니다.

  2. Git 저장의 루트에서 kustomization.yaml이라는 파일을 만들고 다음 코드를 여기에 붙여넣습니다.

    # ./kustomization.yaml
    resources:
    - base
    
    patches:
    - path: ignore-deployment-mutation-patch.yaml
      target:
        kind: Deployment
    

    이 파일은 Kustomize 기본 항목을 가리키는 Kustomize 오버레이입니다. 이 오버레이에는 client.lifecycle.config.k8s.io/mutation: ignore 주석을 모든 배포 객체에 추가하는 Helm 차트 기본 항목의 패치가 포함됩니다. 이 주석은 생성 후 구성 동기화가 클러스터에서 이 객체에 대한 모든 충돌하는 변경사항을 무시하도록 만듭니다.

  3. Git 저장소에서 base라는 디렉터리를 만듭니다.

    mkdir base
    
  4. base 디렉터리에서 kustomization.yaml이라는 또 다른 파일을 만들고 여기에 다음 코드를 붙여넣습니다.

    # ./base/kustomization.yaml
    helmCharts:
    - name: cert-manager
      repo: https://charts.jetstack.io
      version: v1.5.3
      releaseName: my-cert-manager
      namespace: cert-manager
    

    이 파일은 원격 Helm 차트를 렌더링하는 Kustomize 기본 항목입니다.

  5. Git 저장소의 루트로 다시 돌아가서 ignore-deployment-mutation-patch.yaml이라는 파일을 만들고 여기에 다음 코드를 붙여넣습니다.

    # ./ignore-deployment-mutation-patch.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: any
     annotations:
       client.lifecycle.config.k8s.io/mutation: ignore
    

    이 파일은 기본 Helm 차트에 적용되는 패치입니다. 기본 디렉터리에서 모든 배포에 client.lifecycle.config.k8s.io/mutation: ignore 주석을 추가합니다.

  6. 변경 사항을 저장소에 커밋합니다.

    git add .
    git commit -m 'Set up manifests.'
    git push
    

샘플 저장소는 이러한 저장소 모양의 예시를 보여줍니다.

렌더링된 구성 미리보기 및 검증

구성 동기화가 구성을 렌더링하고 이를 클러스터에 동기화하기 전 nomos hydrate를 실행해서 렌더링된 구성을 미리보고, nomos vet를 실행해서 형식이 올바른지 검증하여 구성이 올바른지 확인합니다.

  1. 다음 플래그와 함께 다음 nomos hydrate를 실행합니다.

    nomos hydrate \
        --source-format=unstructured \
        --output=OUTPUT_DIRECTORY
    

    이 명령어에서 각 항목의 의미는 다음과 같습니다.

    • --source-format=unstructurednomos hydrate가 구조화되지 않은 저장소에서 작동하도록 합니다. Kustomize 구성 및 Helm 차트를 사용하기 때문에 구조화되지 않은 저장소를 사용하고 이 플래그를 추가해야 합니다.
    • --output=OUTPUT_DIRECTORY를 사용하면 렌더링된 구성에 대한 경로를 정의할 수 있습니다. OUTPUT_DIRECTORY는 출력을 저장하려는 위치로 바꿉니다.
  2. 다음 플래그와 함께 nomos vet를 실행하여 구성의 구문 및 유효성을 확인합니다.

    nomos vet \
        --source-format=unstructured \
        --keep-output=true \
        --output=OUTPUT_DIRECTORY
    

    이 명령어에서 각 항목의 의미는 다음과 같습니다.

    • --source-format=unstructurednomos vet가 구조화되지 않은 저장소에서 작동하도록 합니다.
    • --keep-output=true는 렌더링된 구성을 저장합니다.
    • --output=OUTPUT_DIRECTORY는 렌더링된 구성에 대한 경로입니다.

Git 저장소에서 구성 동기화

이제 사용하려는 구성으로 저장소를 만들었으므로, 클러스터에서 저장소로의 동기화를 구성할 수 있습니다.

  1. RootSync 객체를 구성하려면 root-sync.yaml 파일을 만드세요.

    # root-sync.yaml
    apiVersion: configsync.gke.io/v1beta1
    kind: RootSync
    metadata:
      name: root-sync
      namespace: config-management-system
    spec:
      sourceFormat: unstructured
      git:
        repo: YOUR_GIT_REPOSITORY
        branch: main
        auth: none
      override:
        enableShellInRendering: true
    

    YOUR_GIT_REPOSITORY을 Git 저장소의 URL로 바꿉니다.

  2. 클러스터에 root-sync.yaml 파일을 적용합니다.

    kubectl apply -f root-sync.yaml
    

설치 확인

구성 동기화를 설치하고 구성한 후에는 설치가 성공적으로 완료되었는지 확인할 수 있습니다.

  1. nomos status를 사용하여 다른 오류가 없는지 확인합니다.

    nomos status
    

    출력 예시:

    *CLUSTER_NAME
    --------------------
    <root>   https:/github.com/GoogleCloudPlatform/anthos-config-management-samples.git/helm-component/manifests@init
    SYNCED   fd17dd5a
    
  2. Helm 구성요소가 성공적으로 설치되었는지 확인합니다.

    kubectl get all -n cert-manager
    

    출력 예시:

    NAME                                              READY   STATUS    RESTARTS   AGE
    pod/my-cert-manager-54f5ccf74-wfzs4               1/1     Running   0          10m
    pod/my-cert-manager-cainjector-574bc8678c-rh7mq   1/1     Running   0          10m
    pod/my-cert-manager-webhook-7454f4c77d-rkct8      1/1     Running   0          10m
    
    NAME                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    service/my-cert-manager           ClusterIP   10.76.9.35     <none>        9402/TCP   10m
    service/my-cert-manager-webhook   ClusterIP   10.76.11.205   <none>        443/TCP    10m
    
    NAME                                         READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/my-cert-manager              1/1     1            1           10m
    deployment.apps/my-cert-manager-cainjector   1/1     1            1           10m
    deployment.apps/my-cert-manager-webhook      1/1     1            1           10m
    
    NAME                                                    DESIRED   CURRENT   READY   AGE
    replicaset.apps/my-cert-manager-54f5ccf74               1         1         1       10m
    replicaset.apps/my-cert-manager-cainjector-574bc8678c   1         1         1       10m
    replicaset.apps/my-cert-manager-webhook-7454f4c77d      1         1         1       10m