계층적 저장소에 동기화

이 튜토리얼에서는 구성 동기화 계층적 루트 저장소를 사용하여 2개의 서로 다른 팀인 team-1team-2에서 공유되는 Kubernetes 클러스터의 구성을 관리하는 방법을 보여줍니다.

목표

  • 계층적 저장소 사용에 관한 권장사항을 알아봅니다.
  • 예시 계층적 저장소에 클러스터를 동기화합니다.

비용

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

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

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

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

시작하기 전에

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

    프로젝트 선택기로 이동

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

  3. 구성 동기화가 이미 설치된 클러스터에 대해 액세스 권한을 얻습니다. 이러한 클러스터가 없으면 Anthos용 빠른 시작 또는 GKE용 빠른 시작의 '시작하기 전에' 및 '환경 준비' 섹션의 안내를 따르세요.
  4. 다음 명령어를 실행하여 kubectl 명령줄 액세스를 구성합니다.

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone ZONE \
        --project PROJECT_ID
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 이 구성을 적용할 등록된 클러스터의 이름입니다.
    • ZONE: 클러스터를 만든 영역입니다.
    • PROJECT_ID: 프로젝트 ID입니다.

저장소 아키텍처 살펴보기

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

├── cluster
│   ├── clusterrolebinding-namespace-reader.yaml
│   ├── clusterrole-namespace-reader.yaml
│   ├── clusterrole-secret-admin.yaml
│   ├── clusterrole-secret-reader.yaml
│   └── crontab-crd.yaml
├── namespaces
│   ├── limit-range.yaml
│   ├── team-1
│   │   ├── crontab.yaml
│   │   ├── namespace.yaml
│   │   ├── network-policy-default-deny-egress.yaml
│   │   ├── resource-quota-pvc.yaml
│   │   ├── rolebinding-secret-reader.yaml
│   │   └── sa.yaml
│   └── team-2
│       ├── crontab.yaml
│       ├── namespace.yaml
│       ├── network-policy-default-deny-all.yaml
│       ├── resource-quota-pvc.yaml
│       ├── rolebinding-secret-admin.yaml
│       └── sa.yaml
├── README.md
└── system
    └── repo.yaml

유효한 구성 동기화 계층 루트 저장소에는 3개의 하위 디렉터리인 cluster/,namespaces/, system/이 포함되어야 합니다.

cluster/ 디렉터리에는 네임스페이스가 아닌 전체 클러스터(예: CRDs, ClusterRoles, ClusterRoleBindings)에 적용되는 구성이 포함됩니다.

namespaces/ 디렉터리에는 네임스페이스 객체의 구성과 네임스페이스 범위 객체의 구성이 포함됩니다. namespaces/ 아래의 하위 디렉터리마다 네임스페이스 객체의 구성과 네임스페이스 아래의 모든 네임스페이스 범위 객체의 구성이 포함됩니다. 하위 디렉터리 이름은 네임스페이스 객체 이름과 동일해야 합니다. 네임스페이스마다 객체를 만들어야 하는 네임스페이스 범위 객체를 namespaces/(예: namespaces/limit- range.yaml) 아래에 직접 넣을 수 있습니다.

이 튜토리얼에서 각 팀에는 자체 Kubernetes 네임스페이스, Kubernetes 서비스 계정, 리소스 할당량, 네트워크 정책, rolebinding이 있습니다. 클러스터 관리자는 namespaces/limit-range.yaml에서 정책을 설정하여 두 네임스페이스의 리소스 할당(pod 또는 컨테이너)을 제한합니다. 또한 클러스터 관리자는 ClusterRole 및 ClusterRoleBinidng을 설정합니다.

system/ 디렉터리에는 구성 동기화 연산자에 대한 구성이 포함됩니다.


compiled/ 디렉터리(구성 동기화 사용에 필요하지 않음)에는 nomos hydrate의 출력이 포함됩니다. 이것은 적용할 APIServer에 전송되는 정확한 양식으로 cluster/, namespaces/, system/ 디렉터리 아래의 구성을 컴파일합니다. 클러스터 범위 리소스는 이 디렉터리 바로 아래에 있습니다. 각 하위 디렉터리에는 네임스페이스 아래의 리소스에 대한 모든 구성이 포함되어 있습니다. compiled/ 디렉터리에는 다음 디렉터리 및 파일이 포함됩니다.

.
├── clusterrolebinding_namespace-reader.yaml
├── clusterrole_namespace-reader.yaml
├── clusterrole_secret-admin.yaml
├── clusterrole_secret-reader.yaml
├── customresourcedefinition_crontabs.stable.example.com.yaml
├── namespace_team-1.yaml
├── namespace_team-2.yaml
├── team-1
│   ├── crontab_my-new-cron-object.yaml
│   ├── limitrange_limits.yaml
│   ├── networkpolicy_default-deny-egress.yaml
│   ├── resourcequota_pvc.yaml
│   ├── rolebinding_secret-reader.yaml
│   └── serviceaccount_sa.yaml
└── team-2
    ├── crontab_my-new-cron-object.yaml
    ├── limitrange_limits.yaml
    ├── networkpolicy_default-deny-all.yaml
    ├── resourcequota_pvc.yaml
    ├── rolebinding_secret-admin.yaml
    └── serviceaccount_sa.yaml

구성 동기화를 사용하여 클러스터를 루트 저장소에 동기화

이 섹션에서는 구성 동기화 및 gcloud 명령줄 도구를 사용하여 계층적 저장소에 클러스터를 동기화합니다.

  1. apply-spec.yaml이라는 파일을 만들고 다음 텍스트를 붙여넣습니다.

    # apply-spec.yaml
    
    applySpecVersion: 1
    spec:
      configSync:
        enabled: true
        sourceFormat: hierarchy
        syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples/
        syncBranch: init
        secretType: none
        policyDir: hierarchical-format/config
    
  2. gcloud 명령줄 도구를 사용하여 apply-spec.yaml 파일을 적용합니다.

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

    다음을 바꿉니다.

    • CLUSTER_NAME: 이 구성을 적용할 등록된 클러스터의 이름입니다.
    • CONFIG_YAML_PATH: apply-spec.yaml 파일에 대한 경로입니다.
    • PROJECT_ID: 프로젝트 ID입니다.
  3. 구성 동기화가 모든 구성을 클러스터에 성공적으로 동기화하는지 확인합니다.

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

    출력 예시:

    Name          Status  Last_Synced_Token  Sync_Branch  Last_Synced_Time      Policy_Controller                          Hierarchy_Controller
    CLUSTER_NAME  SYNCED  6bfc9be            init         2021-06-08T17:26:32Z  GatekeeperControllerManager NOT_INSTALLED  PENDING
    

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

구성 검토

config/ 디렉터리에는 다음 리소스가 포함됩니다.

  • ClusterRoles
  • ClusterRoleBindings
  • CRDs
  • Namespaces
  • RoleBindings
  • ServiceAccounts
  • ResourceQuotas
  • NetworkPolicies
  • LimitRanges
  • CRs

이 구성은 구성 동기화가 저장소에서 읽도록 구성되는 즉시 적용됩니다. 이 섹션에서는 구성 동기화가 디렉터리에서 namespaces, CRDs, rolebindings를 관리하는지 확인합니다.

구성 동기화로 관리되는 모든 객체에는 app.kubernetes.io/managed-by 라벨이 configmanagement.gke.io로 설정되어 있으며, 이 라벨을 사용하여 리소스를 쿼리할 수 있습니다.

  1. 구성 동기화가 관리하는 네임스페이스를 나열합니다.

    kubectl get ns -l app.kubernetes.io/managed-by=configmanagement.gke.io
    

    출력 예시:

    NAME        STATUS   AGE
    team-1      Active   28m
    team-2      Active   28m
    
  2. 구성 동기화로 관리되는 CRD를 나열합니다.

    kubectl get crds -A -l app.kubernetes.io/managed-by=configmanagement.gke.io
    

    출력 예시:

    NAME                          CREATED AT
    crontabs.stable.example.com   2021-05-04T14:58:14Z
    
  3. 구성 동기화로 관리되는 rolebindings를 나열합니다.

    kubectl get rolebindings -A -l app.kubernetes.io/managed-by=configmanagement.gke.io
    

    출력 예시:

    NAMESPACE   NAME                            ROLE                        AGE
    team-1      secret-reader                   ClusterRole/secret-reader   29m
    team-2      secret-admin                    ClusterRole/secret-admin    29m
    

삭제

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

프로젝트 삭제

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

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

개별 리소스 삭제

구성 동기화가 클러스터를 관리하지 않도록 하려면 다음 명령어를 실행합니다.

gcloud alpha container hub config-management unmanage \
    --project=PROJECT_ID \
    --membership=CLUSTER_NAME

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

gcloud container clusters delete CLUSTER_NAME

다음 단계