Kustomize 및 Helm에 구성 동기화 사용


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

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

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

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

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

목표

  • cert-manager용 상용 Helm 차트를 참조하는 Kustomize 구성으로 저장소를 구성합니다 cert-manager는 인증서 관리를 도와주는 Kubernetes용 도구입니다.
  • 만든 구성을 미리보거나 검증합니다.
  • 구성 동기화를 사용하여 차트를 자동으로 렌더링하고 클러스터를 저장소에 동기화합니다.
  • 설치가 성공했는지 확인합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  3. 구성 동기화 요구사항을 충족하고 다음 구성 동기화 설정을 사용하는 클러스터를 만들거나 이 클러스터에 액세스할 수 있는지 확인합니다.
  4. Fleet클러스터를 등록합니다.
  5. nomos 명령줄 도구를 설치합니다. 이미 nomos 도구를 설치했으면 버전 1.9.0 이상으로 업그레이드해야 합니다.
  6. Helm을 설치합니다.

또한 Git, Kustomize, Helm 관련 내용을 숙지하는 것도 도움이 됩니다.

저장소 구성

다음 태스크는 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. Google Cloud 콘솔에서 GKE Hub API를 사용 설정합니다.

    GKE Hub API로 이동

  2. Google Cloud 콘솔에서 기능 섹션 아래의 구성 페이지로 이동합니다.

    구성으로 이동

  3. 구성 동기화 설치를 클릭합니다.

  4. 자동 업그레이드를 선택하여 구성 동기화가 버전을 자동으로 업그레이드하도록 사용 설정합니다.

  5. 설치 옵션에서 개별 클러스터에 구성 동기화 설치를 선택합니다.

  6. 사용 가능한 클러스터 테이블에서 cs-cluster를 선택하고 구성 동기화 설치를 클릭합니다. 몇 분 후에 설정 탭에서 cs-cluster 상태가 사용 설정됨으로 표시됩니다.

  7. 구성 동기화 대시보드에서 패키지 배포를 클릭합니다.

  8. 패키지 배포에 사용할 클러스터 선택 테이블에서 cs-cluster를 선택한 후 계속을 클릭합니다.

  9. Git에서 호스팅되는 패키지를 선택한 상태로 두고 계속을 클릭합니다.

  10. 패키지 이름 필드에 sample-repository를 입력합니다.

  11. 저장소 URL 필드에 https://github.com/GoogleCloudPlatform/anthos-config-management-samples를 입력합니다.

  12. 경로 필드에 config-sync-quickstart/multirepo/root를 입력합니다.

  13. 다른 필드는 기본값 그대로 둡니다.

  14. 패키지 배포를 클릭합니다.

    몇 분 후 cs-cluster동기화 상태 열에 동기화됨이 표시됩니다.

설치 확인

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

  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
    

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

개별 리소스 삭제

저장소에서 매니페스트 삭제

실수로 인한 삭제를 방지하기 위해 구성 동기화에서는 단일 커밋으로 모든 네임스페이스나 클러스터 범위 리소스를 삭제할 수 없습니다. 다음 안내에 따라 구성요소를 정상적으로 제거하고 개별 커밋으로 네임스페이스를 삭제합니다.

  1. 저장소에서 cert-manager 구성요소를 삭제합니다.

    git rm -rf manifests/cert-manager \
        && git commit -m "uninstall cert-manager" \
        && git push origin BRANCH
    

    BRANCH를 저장소를 만든 브랜치로 바꿉니다.

  2. cert-manager 네임스페이스를 삭제합니다.

    git rm manifests/namespace-cert-manager.yaml \
        && git commit -m "remove the cert-manager namespace" \
        && git push origin BRANCH
    
  3. cert-manager 네임스페이스가 없는지 확인합니다.

    kubectl get namespace cert-namespace
    

    출력 예시:

    Error from server (NotFound): namespaces "cert-namespace" not found
    

클러스터 삭제

클러스터를 삭제하려면 다음 명령어를 완료합니다.

콘솔

Google Cloud 콘솔을 사용하여 클러스터를 삭제하려면 다음 태스크를 완료합니다.

  1. Google Cloud 콘솔에서 GKE 페이지로 이동합니다.

    GKE로 이동

  2. 삭제하려는 클러스터 옆에 있는 작업을 클릭한 다음 삭제를 클릭합니다.

  3. 확인 메시지가 나타나면 삭제를 다시 클릭합니다.

gcloud

Google Cloud CLI를 사용하여 클러스터를 삭제하려면 다음 명령어를 실행합니다.

gcloud container clusters delete CLUSTER_NAME

자세한 내용은 gcloud container clusters delete 문서를 참조하세요.

다음 단계