Kustomize 및 Helm에 구성 동기화 사용

구성 동기화를 사용하여 바로 구매할 수 있는 Helm 구성요소를 사용하는 방법을 알아봅니다.

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

목표

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

비용

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

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

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  2. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  3. 구성 동기화 요구사항을 충족하고 버전이 1.9.0 이상인 클러스터를 만들거나 이러한 클러스터에 액세스할 수 있는지 확인합니다.
  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
    

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

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

구성 동기화가 구성을 렌더링하고 이를 클러스터에 동기화하기 전 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 저장소에서 동기화 구성

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

Console

Google Cloud Console에서 동기화를 구성하려면 다음 태스트를 완료합니다.

  1. Google Cloud Console에서 Anthos Config Management 페이지로 이동합니다.

    Anthos Config Management로 이동

  2. 클러스터를 선택하고 구성을 클릭합니다.

  3. ACM의 Git 저장소 인증 드롭다운 목록에서 인증 유형을 선택합니다.

  4. Google Cloud Console의 안내에 따라 구성 동기화에 Git에 대한 읽기 전용 액세스 권한을 부여하고 계속을 클릭합니다.

  5. 클러스터의 ACM 설정 섹션에서 다음을 완료합니다.

    1. 버전 필드에서 버전을 선택합니다.
    2. 구성 동기화 사용 체크박스를 선택합니다.
    3. 표시되는 드롭다운 목록에서 다음을 완료합니다.

      1. URL 필드에서 Git 저장소의 URL을 추가합니다. HTTPS 또는 SSH 프로토콜을 사용하여 URL을 입력할 수 있습니다. 예를 들어 https://github.com/GoogleCloudPlatform/anthos-config-management-samples/는 HTTPS 프로토콜을 사용합니다. 프로토콜을 입력하지 않으면 URL이 HTTPS URL로 취급됩니다.
      2. (선택사항): 분기 필드에 동기화할 저장소의 분기를 추가합니다. 기본 분기는 master입니다.
      3. (선택사항): 태그/커밋 필드에서 확인할 Git 버전(태그 또는 해시)을 추가합니다. 기본값은 HEAD입니다.
      4. (선택사항): 정책 디렉터리 필드에서 동기화할 정책 계층 구조의 맨 위에 저장소 내 경로를 추가합니다. 기본값은 저장소의 루트 디렉터리입니다.
      5. (선택사항): 동기화 대기 필드에서 연속 동기화 간격(초)을 추가합니다. 기본값은 15초입니다.
      6. (선택사항): Git 프록시 필드에 Git 저장소와 통신할 때 사용될 HTTPS 프록시의 URL을 입력합니다. 이 필드는 선택사항이며 비워 두면 프록시가 사용되지 않습니다.
      7. 소스 형식 드롭다운 목록에서 구조화되지 않음을 선택합니다. 저장소에 Helm이 사용되므로 구조화되지 않은 저장소를 사용해야 합니다.
  6. 완료를 클릭합니다. Anthos Config Management 메뉴로 돌아갑니다.

gcloud

gcloud 명령줄 도구를 사용하여 동기화를 구성하려면 다음 태스크를 완료합니다.

  1. apply-spec.yaml 파일을 만들고 이 파일에 다음 YAML 파일을 복사합니다.

    # apply-spec.yaml
    
    applySpecVersion: 1
    spec:
      configSync:
        enabled: true
        # Since your repository is using Helm, you need to use an unstructured repository.
        sourceFormat: unstructured
        syncRepo: REPO
        syncBranch: BRANCH
        secretType: TYPE
        policyDir: "DIRECTORY"
    

    다음을 바꿉니다.

    • REPO: Git 저장소의 URL을 추가합니다. HTTPS 또는 SSH 프로토콜을 사용하여 URL을 입력할 수 있습니다. 예를 들어 https://github.com/GoogleCloudPlatform/anthos-config-management-samples/는 HTTPS 프로토콜을 사용합니다. 프로토콜을 입력하지 않으면 URL이 HTTPS URL로 취급됩니다.
    • BRANCH: 동기화할 저장소의 분기입니다. 기본 분기는 master입니다.
    • TYPE: 다음 SecretTypes 중 하나입니다.

      • none
      • ssh
      • cookiefile
      • token
      • gcenode

      none 이외에 secretType을 추가한 경우 구성 동기화에 Git 저장소에 대한 액세스 권한을 부여합니다.

    • DIRECTORY: 동기화하려는 구성이 포함된 Git 저장소의 루트 디렉터리 경로입니다. 기본값은 저장소의 루트 디렉터리입니다.

    예를 들어 다음 apply-spec.yaml 파일은 Anthos Config Management 샘플 저장소의 helm-component/manifests 디렉터리에 있는 구성에 동기화됩니다.

    # apply-spec.yaml
    
    applySpecVersion: 1
    spec:
      configSync:
        enabled: true
        sourceFormat: unstructured
        syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
        syncBranch: main
        secretType: none
        policyDir: helm-component/manifests
    
  2. apply-spec.yaml 파일을 적용합니다.

     gcloud alpha container hub config-management apply \
         --membership=MEMBERSHIP_NAME \
         --config=CONFIG_YAML_PATH \
         --project=PROJECT_ID
    

    다음을 바꿉니다.

    • MEMBERSHIP_NAME: 클러스터를 등록할 때 선택한 멤버십 이름입니다. Google Cloud Console을 사용하여 클러스터를 등록한 경우 멤버십 이름이 클러스터 이름과 동일합니다.
    • CONFIG_YAML_PATH: apply-spec.yaml 파일에 대한 경로입니다.
    • PROJECT_ID: 프로젝트 ID입니다.

설치 확인

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

  1. 설치가 동기화되었는지 확인합니다.

    Console

    1. Cloud Console에서 Anthos Config Management 페이지로 이동합니다.

      Anthos Config Management로 이동

    2. 상태 열을 확인합니다. 설치에 성공한 경우 동기화됨 상태가 표시됩니다.

    gcloud

    다음 명령어를 실행합니다.

    gcloud alpha container hub config-management status \
        --project=PROJECT_ID
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

    설치에 성공한 경우 SYNCED 상태가 표시됩니다.

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

    nomos status
    

    출력 예시:

    *CLUSTER_NAME
    --------------------
    <root>   https:/github.com/GoogleCloudPlatform/anthos-config-management-samples.git/helm-component/manifests@init
    SYNCED   fd17dd5a
    
  3. 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. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

개별 리소스 삭제

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

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

  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
    

클러스터 삭제

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

Console

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

  1. Cloud Console에서 GKE 페이지로 이동합니다.

    GKE로 이동

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

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

gcloud

gcloud 명령줄 도구를 사용하여 클러스터를 삭제하려면 다음 명령어를 실행하세요.

gcloud container clusters delete CLUSTER_NAME

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

다음 단계