자동 렌더링을 사용하여 여러 환경에서 구성 동기화 사용


이 튜토리얼에서는 구성 동기화 권장사항에 따라 개발 및 프로덕션을 위한 두 환경 간에 Google Kubernetes Engine(GKE) Enterprise 버전용 구성 동기화를 설정하는 방법을 보여줍니다.

이 시나리오는 귀하가 Foo Corp의 플랫폼 관리자라고 가정합니다. Foo Corp 애플리케이션은 GKE Enterprise에 배포되어 있으며, 리소스가 devprod의 두 프로젝트에 분할되어 있습니다. dev 프로젝트에는 개발 GKE Enterprise 클러스터가 있고 prod 프로젝트에는 프로덕션 GKE Enterprise 클러스터가 있습니다. 귀하는 플랫폼 관리자로서 두 환경이 모두 Foo Corp 정책의 규정 준수 범위 내에 있는지 확인하고 Kubernetes 네임스페이스 및 서비스 계정과 같은 기본 수준의 리소스가 두 환경 모두에서 일관되게 유지되는지 확인해야 합니다.

다음 다이어그램은 이 튜토리얼에서 설정하는 환경의 개요를 보여줍니다.

이 튜토리얼에서 설정하는 환경의 개요를 보여줍니다.

이 튜토리얼에서는 구성 동기화의 자동 렌더링 기능을 활용하여 클러스터에서 리소스를 렌더링합니다. 각 클러스터는 Kustomization 구성 파일이 포함된 디렉터리에서 동기화되도록 구성되므로 구성 동기화에서 렌더링 프로세스가 자동으로 트리거됩니다. 자세한 내용은 Kustomize 구성 및 Helm 차트에 저장소 사용을 참조하세요.

앞의 다이어그램에 표시된 것처럼 이 튜토리얼에서는 다음 리소스를 만듭니다.

  • 개발 및 프로덕션 환경을 나타내는 2개의 Google Cloud 프로젝트
  • 구성 동기화가 설치된 개별 프로젝트에 있는 2개의 GKE Enterprise 클러스터(devprod)

저장소 아키텍처

이 튜토리얼에서는 샘플 저장소의 config-source/ 디렉터리에 있는 구성에 동기화되도록 구성 동기화를 구성합니다. 이 디렉터리에는 다음 디렉터리 및 파일이 포함됩니다.

config-source/
├── base
│   ├── foo
│   │   ├── kustomization.yaml
│   │   ├── namespace.yaml
│   │   └── serviceaccount.yaml
│   ├── kustomization.yaml
│   ├── pod-creator-clusterrole.yaml
│   └── pod-creator-rolebinding.yaml
├── cloudbuild.yaml
├── overlays
│   ├── dev
│   │   └── kustomization.yaml
│   └── prod
│       └── kustomization.yaml
└── README.md

config-source 디렉터리에는 base/ 매니페스트와 dev/prod/ Kustomize 오버레이가 포함됩니다. 각 디렉터리에는 Kustomize가 관리하고 클러스터에 적용해야 하는 파일을 나열하는 kustomization.yaml 파일이 있습니다. dev/kustomization.yamlprod/kustomization.yaml에서 일련의 패치가 정의됩니다. 이러한 패치는 해당 환경에 대해 base/ 리소스를 조작합니다.

예를 들어 dev RoleBinding은 모든 Foo Corp 개발자가 dev 클러스터에 포드를 배포할 수 있도록 하는 반면 prod RoleBinding은 지속적 배포 에이전트인 deploy-bot@foo-corp.com만 포드를 프로덕션에 배포할 수 있도록 허용합니다.

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patches:
# ServiceAccount - make name unique per environ
- target:
    kind: ServiceAccount
    name: foo-ksa
  patch: |-
    - op: replace
      path: /metadata/name
      value: foo-ksa-dev
    - op: replace
      path: /metadata/namespace
      value: foo-dev
# Pod creators - give all Foo Corp developers access
- target:
    kind: RoleBinding
    name: pod-creators
  patch: |-
    - op: replace
      path: /subjects/0/name
      value: developers-all@foo-corp.com
commonLabels:
  environment: dev

목표

  • 두 가지 개별 환경에 대한 구성을 자동으로 렌더링하고 동기화하도록 구성 동기화를 설정합니다.

비용

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

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

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

시작하기 전에

이 튜토리얼을 시작하기 전에 다음 단계를 완료했는지 확인합니다.

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

    프로젝트 선택기로 이동

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

  3. Google Cloud CLI를 최신 버전으로 업그레이드하세요.

  4. nomos 명령어 설치 또는 업그레이드

클러스터 만들기 및 등록

여러 환경에 대해 구성 동기화를 구성할 때 사용해야 하는 워크플로에 집중할 수 있도록 multi-environments-kustomize 디렉터리에는 구성 동기화의 구성을 자동화하는 데 사용할 수 있는 스크립트가 포함되어 있습니다.

  1. 샘플 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples.git
    
  2. 이 튜토리얼에 필요한 리소스가 포함된 폴더로 이동합니다.

    cd anthos-config-management-samples/multi-environments-kustomize/
    
  3. 이 튜토리얼에 사용된 스크립트를 실행하기 위해 다음 변수를 설정합니다.

    export DEV_PROJECT="DEV_PROJECT_ID"
    export PROD_PROJECT="PROD_PROJECT_ID"
    export DEV_CLUSTER_ZONE="DEV_CLUSTER_ZONE"
    export PROD_CLUSTER_ZONE="PROD_CLUSTER_ZONE"
    export CM_CONFIG_DIR="config-sync-rendering"
    

    다음을 바꿉니다.

    • DEV_PROJECT_ID: 개발 프로젝트로 사용하려는 Google Cloud 프로젝트의 프로젝트 ID입니다.
    • PROD_PROJECT_ID: 프로덕션 프로젝트로 사용하려는 Google Cloud 프로젝트의 프로젝트 ID입니다.
    • DEV_CLUSTER_ZONE: 개발 클러스터를 만들려는 Compute Engine 영역입니다. 예를 들면 us-central1-c입니다.
    • PROD_CLUSTER_ZONE: 프로덕션 클러스터를 만들려는 Compute Engine 영역입니다.
  4. 2개의 클러스터를 만들기 위해 ./create-clusters.sh 스크립트를 실행합니다.

    ./create-clusters.sh
    

    이 스크립트는 개발 프로젝트에 dev라는 하나의 GKE Enterprise 클러스터를 만들고 프로덕션 프로젝트에 prod라는 하나의 GKE Enterprise 클러스터를 만듭니다. 또한 이 스크립트는 GKE Enterprise API를 사용 설정하고 kubectl로 해당 API에 액세스할 수 있도록 devprod 클러스터에 연결합니다.

    출력 예시:

    kubeconfig entry generated for dev.
    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for prod.
    ⭐️ Done creating clusters.
    
  5. 클러스터를 개별 Fleet 2개에 등록하려면 register-clusters.sh 스크립트를 실행합니다.

    ./register-clusters.sh
    

    이 스크립트는 GKE Enterprise 클러스터 등록을 위해 Google Cloud 서비스 계정과 키를 만든 후 gcloud container fleet memberships register 명령어를 사용하여 devprod 클러스터를 고유한 프로젝트의 GKE Enterprise에 등록합니다.

    출력 예시:

    Waiting for Feature Config Management to be created...done.
    ⭐️ Done registering clusters.
    

Config Sync 설정

클러스터를 만들고 등록했으므로 이제 구성 동기화를 설치하고 설치를 확인할 수 있습니다.

Config Sync 설치

구성 동기화를 설치하려면 dev 및 prod 클러스터에 install-config-sync.sh 스크립트를 실행합니다.

./install-config-sync.sh

예상 출력:

🔁 Installing ConfigSync on the dev cluster...
Updated property [core/project].
Switched to context "DEV_CLUSTER".
Waiting for Feature Config Management to be updated...done.
🔁 Installing ConfigSync on the prod cluster...
Updated property [core/project].
Switched to context "PROD_CLUSTER".
Waiting for Feature Config Management to be updated...done.

구성 동기화가 이제 저장소 구성과 동기화됩니다.

구성 확인

이 섹션에서는 클러스터가 저장소의 구성과 동기화되는지 확인합니다.

  1. 구성 동기화 설치 상태를 확인하려면 nomos status 명령어를 실행합니다.

    nomos status
    

    이제 개발 및 프로덕션 클러스터가 모두 각각의 저장소에 동기화되었는지 확인합니다.

    gke_DEV_PROJECT_ID_us-central1-c_dev
      --------------------
      <root>   https://github.com/GoogleCloudPlatform/anthos-config-management-samples/multi-environments-kustomize/config-source/overlays/dev@main
      SYNCED   8f2e196f
      Managed resources:
         NAMESPACE   NAME                                                 STATUS
                     clusterrole.rbac.authorization.k8s.io/pod-creator    Current
                     namespace/default                                    Current
                     namespace/foo                                        Current
         default     rolebinding.rbac.authorization.k8s.io/pod-creators   Current
         foo         serviceaccount/foo-ksa-dev                           Current
    
    *gke_PROD_PROJECT_ID_us-central1-c_prod
       --------------------
       <root>   https://github.com/GoogleCloudPlatform/anthos-config-management-samples/multi-environments-kustomize/config-source/overlays/prod@main
       SYNCED   c91502ee
       Managed resources:
          NAMESPACE   NAME                                                 STATUS
                      clusterrole.rbac.authorization.k8s.io/pod-creator    Current
                      namespace/default                                    Current
                      namespace/foo                                        Current
          default     rolebinding.rbac.authorization.k8s.io/pod-creators   Current
          foo         serviceaccount/foo-ksa-prod                          Current
    
      ```
    
  2. kubectl을 사용하여 개발 클러스터로 전환합니다.

    kubectl config use-context "gke_${DEV_PROJECT}_${DEV_CLUSTER_ZONE}_dev"
    
  3. 리소스가 동기화되었는지 확인하기 위해 네임스페이스를 가져옵니다. foo 네임스페이스가 표시됩니다.

    kubectl get namespace
    

    출력 예시:

    NAME                           STATUS   AGE
    config-management-monitoring   Active   9m38s
    config-management-system       Active   9m38s
    default                        Active   47h
    foo                            Active   9m5s
    kube-node-lease                Active   47h
    kube-public                    Active   47h
    kube-system                    Active   47h
    resource-group-system          Active   9m30s
    

    이제 여러 Google Cloud 프로젝트 및 환경 간에 개발 및 프로덕션 환경을 위한 자동화된 구성 렌더링이 설정되었습니다.

삭제

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

모든 리소스 삭제

이 튜토리얼에서 만든 리소스를 삭제하지만 개발 및 프로덕션 프로젝트를 모두 그대로 두려면 삭제 스크립트를 실행합니다.

./cleanup.sh

프로젝트 삭제

  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.

다음 단계