네임스페이스 저장소에서 동기화 구성

구성 동기화를 설치할 때 루트 저장소를 구성합니다. 루트 저장소를 구성한 후 네임스페이스 저장소를 구성할 수 있습니다. 네임스페이스 저장소를 사용하면 관리자가 아닌 사용자에게 저장소 설정 및 제어 권한을 위임하는 등의 작업을 수행할 수 있습니다. 이러한 유형의 저장소에 대한 자세한 내용은 구성 동기화 개요의 저장소 섹션을 참조하세요.

네임스페이스 저장소에는 RepoSync API가 필요합니다. Google Cloud Console 또는 1.7.0 이상 버전의 gcloud 명령줄 도구를 사용하여 구성 동기화를 설치한 경우 이 API는 이미 사용 설정되어 있습니다. kubectl을 사용하여 구성 동기화를 설치하고 ConfigManagement 객체를 사용하여 Git 저장소를 구성하는 경우 ConfigManagement 객체를 마이그레이션하여 RepoSync API를 사용 설정하는 것이 좋습니다.

구성 동기화는 정보 소스의 변경사항을 자동으로 감지하지만 네임스페이스 저장소에 허용 웹훅을 추가하여 드리프트 감지 레이어를 추가할 수 있습니다. 이를 수행하는 방법에 대한 자세한 내용은 구성 드리프트 방지를 확인하세요.

시작하기 전에

  • 구성 동기화가 동기화하는 구성을 포함할 수 있는 구조화되지 않은 Git 저장소를 만들거나 액세스 권한이 있는지 확인합니다. 네임스페이스 저장소는 구조화되지 않은 형식을 사용해야 합니다.
  • Anthos가 지원되는 플랫폼 및 버전을 기반으로 한 클러스터를 만들거나 이 클러스터에 액세스할 수 있는지 확인합니다.
  • 구성 동기화 요구사항을 충족하는 GKE 클러스터를 만들거나 이 클러스터에 액세스할 수 있는지 확인합니다.

제한사항

  • NamespaceSelectors(선택기를 가리키는 주석 포함)는 루트 저장소에서만 작동합니다.

원하는 구성 방법 선택

네임스페이스 저장소를 구성하는 두 가지 방법 중 하나를 선택합니다.

루트 저장소의 네임스페이스 저장소 제어

이 방법을 통해 중앙 관리자는 루트 저장소에서 바로 네임스페이스 저장소 설정을 관리합니다. 구성 동기화가 네임스페이스 저장소 객체를 관리하기 때문에 이 방법은 네임스페이스 저장소 정의의 로컬 변경을 차단합니다.

이 기능을 사용하려면 다음 작업을 완료합니다.

  1. 루트 저장소에서 namespace 구성을 선언합니다.

    # ROOT_REPO/namespaces/NAMESPACE/namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    

    NAMESPACE를 네임스페이스 이름으로 바꿉니다.

  2. 루트 저장소에서 동일한 네임스페이스에 RepoSync 객체를 만듭니다.

    # ROOT_REPO/namespaces/NAMESPACE/repo-sync.yaml
     # If you are using a Config Sync version earlier than 1.8.0,
     # use: apiVersion: configsync.gke.io/v1alpha1
    apiVersion: configsync.gke.io/v1beta1
    kind: RepoSync
    metadata:
      name: repo-sync
      namespace: NAMESPACE
    spec:
      # Since this is for a namespace repository, the format should be unstructured
      sourceFormat: unstructured
      git:
       repo: NAMESPACE_REPOSITORY
       revision: NAMESPACE_REVISION
       branch: NAMESPACE_BRANCH
       dir: "NAMESPACE_DIRECTORY"
       auth: NAMESPACE_AUTH_TYPE
       gcpServiceAccountEmail: NAMESPACE_EMAIL
       secretRef:
         name: NAMESPACE_SECRET_NAME
       # The `noSSLVerify` field is supported in Anthos Config Management version 1.8.2 and later.
       noSSLVerify: NAMESPACE_NO_SSL_VERIFY
    

    다음을 바꿉니다.

    • NAMESPACE: 네임스페이스 이름을 추가합니다.
    • NAMESPACE_REPOSITORY: 네임스페이스 저장소로 사용할 Git 저장소의 URL을 추가합니다. HTTPS 또는 SSH 프로토콜을 사용하여 URL을 입력할 수 있습니다. 예를 들어 https://github.com/GoogleCloudPlatform/anthos-config-management-samples는 HTTPS 프로토콜을 사용합니다. 프로토콜을 입력하지 않으면 URL이 HTTPS URL로 취급됩니다. 필수 필드입니다.
    • NAMESPACE_REVISION: Git 버전(태그 또는 해시)을 추가하여 체크아웃합니다. 이 필드는 선택사항이며 기본값은 HEAD입니다.
    • NAMESPACE_BRANCH: 동기화할 저장소의 분기를 추가합니다. 이 필드는 선택사항이며 기본값은 master입니다.
    • NAMESPACE_DIRECTORY: 동기화하려는 구성이 포함된 루트 디렉터리에 Git 저장소의 경로를 추가합니다. 이 필드는 선택사항이며 기본값은 저장소의 루트 디렉터리(/)입니다.
    • NAMESPACE_AUTH_TYPE: 다음 인증 유형 중 하나를 추가합니다.

      • none: 인증 사용 안함
      • ssh: SSH 키 쌍 사용
      • cookiefile: cookiefile 사용
      • token: 토큰 사용
      • gcpserviceaccount: Google 서비스 계정을 사용하여 Cloud Source Repositories의 저장소에 액세스합니다.
      • gcenode: Google 서비스 계정을 사용하여 Cloud Source Repositories의 저장소에 액세스합니다. 워크로드 아이덴티티가 클러스터에 사용 설정되지 않은 경우에만 이 옵션을 선택합니다.

        이러한 인증 유형에 대한 자세한 내용은 Git에 대한 읽기 전용 액세스 권한을 구성 동기화에 부여를 참조하세요.

      필수 필드입니다.

    • NAMESPACE_EMAIL: gcpserviceaccountAUTH_TYPE으로 추가한 경우 Google 서비스 계정 이메일 주소를 추가합니다. 예를 들면 acm@PROJECT_ID.iam.gserviceaccount.com입니다.

    • NAMESPACE_SECRET_NAME: 보안 비밀에 지정할 이름을 추가합니다. 이 필드는 선택사항입니다.

    • NAMESPACE_NO_SSL_VERIFY: SSL 인증서 확인을 중지하려면 이 필드를 true로 설정합니다. 기본값은 false입니다.

    필드에 대한 설명과 spec 필드에 추가할 수 있는 전체 필드 목록은 RepoSync 필드를 참조하세요.

    네임스페이스당 최대 1개의 RepoSync 객체가 있을 수 있습니다. 이 제한을 적용하려면 name 객체가 repo-sync여야 합니다. RepoSync에서 참조하는 디렉터리에 포함된 모든 구성은 RepoSync 객체와 동일한 네임스페이스에 있어야 합니다.

  3. 루트 저장소에서 ns-reconciler-NAMESPACE 서비스 계정에 네임스페이스의 객체를 관리할 수 있는 권한을 부여하는 RoleBinding 구성을 선언합니다. RepoSync 구성이 클러스터에 동기화되면 구성 동기화는 자동으로 ns-reconciler-NAMESPACE 서비스 계정을 생성합니다.

    RoleBinding를 선언하려면 다음 객체를 만듭니다.

    # ROOT_REPO/namespaces/NAMESPACE/sync-rolebinding.yaml
     kind: RoleBinding
     apiVersion: rbac.authorization.k8s.io/v1
     metadata:
       name: syncs-repo
       namespace: NAMESPACE
     subjects:
     - kind: ServiceAccount
       name: ns-reconciler-NAMESPACE
       namespace: config-management-system
     roleRef:
       kind: ClusterRole
       name: RECONCILER_ROLE
       apiGroup: rbac.authorization.k8s.io
    

    다음을 바꿉니다.

    • NAMESPACE: 네임스페이스 이름을 추가합니다.
    • RECONCILER_ROLE: 중앙 관리자로서 RECONCILER_ROLE을 설정하여 네임스페이스 저장소에서 동기화할 수 있는 구성 유형을 적용할 수 있습니다. 다음 역할 중 하나를 선택할 수 있습니다.

      • 기본 ClusterRole:

        • admin
        • edit

        자세한 내용은 사용자에게 표시되는 역할을 참조하세요.

      • 루트 저장소에 선언된 사용자 정의된 ClusterRole 또는 Role입니다. 이 역할은 세분화된 권한을 허용합니다.

  4. 변경사항을 루트 저장소에 커밋합니다.

     git add .
     git commit -m 'Setting up new namespace repository.'
     git push
    
  5. 필요한 경우 원하는 인증 방법을 기준으로 보안 비밀을 만듭니다. none을 인증 유형으로 사용한 경우 이 단계를 건너뛸 수 있습니다.

    보안 비밀은 다음 요구사항을 충족해야 합니다.

    • RepoSync와 동일한 네임스페이스에 보안 비밀을 만듭니다.
    • 보안 비밀의 이름은 repo-sync.yaml에 정의된 spec.git.secretRef 이름과 일치해야 합니다.
    • 보안 비밀의 공개 키를 Git 제공업체에 추가해야 합니다.
  6. 구성을 확인하려면 네임스페이스 저장소의 객체 중 하나에서 kubectl get을 사용합니다. 예를 들면 다음과 같습니다.

    kubectl get rolebindings -n NAMESPACE
    

Kubernetes API를 사용하여 네임스페이스 저장소 제어

이 방식을 사용하면 중앙 관리자는 루트 저장소의 네임스페이스만 선언하고 RepoSync 객체의 선언을 애플리케이션 연산자에 위임합니다.

중앙 관리자 작업

중앙 관리자는 다음 작업을 완료합니다.

  1. 루트 저장소에서 namespace 구성을 선언합니다.

    # ROOT_REPO/namespaces/NAMESPACE/namespace.yaml
     apiVersion: v1
     kind: Namespace
     metadata:
       name: NAMESPACE
    

    NAMESPACE를 네임스페이스 이름으로 바꿉니다.

  2. 루트 저장소에서 RoleBinding를 선언하여 애플리케이션 연산자에 권한을 부여합니다. RBAC 에스컬레이션 방지를 사용하여 애플리케이션 연산자가 나중에 이 역할 결합에서 부여하지 않은 권한으로 역할 결합을 적용할 수 없도록 합니다.

    RoleBinding을 선언하려면 다음 매니페스트를 만듭니다.

    # ROOT_REPO/namespaces/NAMESPACE/operator-rolebinding.yaml
     kind: RoleBinding
     # Add RBAC escalation prevention
     apiVersion: rbac.authorization.k8s.io/v1
     metadata:
       name: operator
       namespace: NAMESPACE
     subjects:
     - kind: User
       name: USERNAME
       apiGroup: rbac.authorization.k8s.io
     roleRef:
       kind: ClusterRole
       name: OPERATOR_ROLE
       apiGroup: rbac.authorization.k8s.io
    

    다음을 바꿉니다.

    • NAMESPACE: 루트 저장소에서 만든 네임스페이스를 추가합니다.
    • USERNAME: 애플리케이션 연산자의 사용자 이름을 추가합니다.
    • OPERATOR_ROLE: 중앙 관리자로서 OPERATOR_ROLE을 설정하여 네임스페이스 저장소에서 동기화할 수 있는 구성 유형을 적용할 수 있습니다. 다음 역할 중 하나를 선택할 수 있습니다.

      • 기본 ClusterRole:

        • admin
        • edit

        자세한 내용은 사용자에게 표시되는 역할을 참조하세요.

      • 루트 저장소에 선언된 사용자 정의 ClusterRole 또는 역할입니다. 이 역할은 세분화된 권한을 허용합니다.

  3. 변경사항을 루트 저장소에 커밋합니다.

     git add .
     git commit -m 'Setting up new namespace repository.'
     git push
    

애플리케이션 연산자 작업

애플리케이션 연산자는 다음 작업을 수행합니다.

  1. ns-reconciler-NAMESPACE 서비스 계정에 네임스페이스의 객체를 관리할 수 있는 권한을 부여하는 RoleBinding 구성을 선언합니다. RepoSync 구성이 클러스터에 동기화되면 구성 동기화는 자동으로 ns-reconciler-NAMESPACE 서비스 계정을 생성합니다.

    RoleBinding을 선언하려면 다음 매니페스트를 만듭니다.

    # sync-rolebinding.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: syncs-repo
      namespace: NAMESPACE
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-NAMESPACE
      namespace: config-management-system
    roleRef:
      kind: ClusterRole
      name: RECONCILER_ROLE
      apiGroup: rbac.authorization.k8s.io
    

    다음을 바꿉니다.

    • NAMESPACE: 루트 저장소에서 만든 네임스페이스를 추가합니다.
    • RECONCILER_ROLE: 애플리케이션 연산자로서 RECONCILER_ROLE을 설정하여 네임스페이스 저장소에서 동기화할 수 있는 구성 유형을 적용할 수 있습니다. 중앙 관리자가 부여한 권한 집합만 추가로 제한할 수 있습니다. 따라서 이 역할은 이전 섹션에서 중앙 관리자가 이전에 선언한 OPERATOR_ROLE보다 많은 권한을 가질 수 없습니다.
  2. RoleBinding 구성을 적용합니다.

    kubectl apply -f sync-rolebinding.yaml
    
  3. 필요한 경우 원하는 인증 방법을 기준으로 보안 비밀을 만듭니다. none을 인증 유형으로 사용한 경우 이 단계를 건너뛸 수 있습니다.

    보안 비밀은 다음 요구사항을 충족해야 합니다.

    • RepoSync와 동일한 네임스페이스에 보안 비밀을 만듭니다.
    • 보안 비밀의 이름은 root-sync.yaml에 정의된 spec.git.secretRef 이름과 일치해야 합니다.
    • 보안 비밀의 공개 키를 Git 제공업체에 추가해야 합니다.
  4. RepoSync 구성을 선언합니다.

    # repo-sync.yaml
    # If you are using a Config Sync version earlier than 1.8.0,
    # use: apiVersion: configsync.gke.io/v1alpha1
    apiVersion: configsync.gke.io/v1beta1
    kind: RepoSync
    metadata:
      name: repo-sync
      namespace: NAMESPACE
    spec:
      # Since this is for a namespace repository, the format should be unstructured
      sourceFormat: unstructured
      git:
       repo: NAMESPACE_REPOSITORY
       revision: NAMESPACE_REVISION
       branch: NAMESPACE_BRANCH
       dir: "NAMESPACE_DIRECTORY"
       auth: NAMESPACE_AUTH_TYPE
       gcpServiceAccountEmail: NAMESPACE_EMAIL
       secretRef:
         name: NAMESPACE_SECRET_NAME
       # The `noSSLVerify` field is supported in Anthos Config Management version 1.8.2 and later.
       noSSLVerify: REPO_SSL_VERIFY
    

    다음을 바꿉니다.

    • NAMESPACE_REPOSITORY: 네임스페이스 저장소로 사용할 Git 저장소의 URL을 추가합니다. HTTPS 또는 SSH 프로토콜을 사용하여 URL을 입력할 수 있습니다. 예를 들어 https://github.com/GoogleCloudPlatform/anthos-config-management-samples는 HTTPS 프로토콜을 사용합니다. 프로토콜을 입력하지 않으면 URL이 HTTPS URL로 취급됩니다. 필수 필드입니다.
    • NAMESPACE_REVISION: Git 버전(태그 또는 해시)을 추가하여 체크아웃합니다. 이 필드는 선택사항이며 기본값은 HEAD입니다.
    • NAMESPACE_BRANCH: 동기화할 저장소의 분기를 추가합니다. 이 필드는 선택사항이며 기본값은 master입니다.
    • NAMESPACE_DIRECTORY: 동기화하려는 구성이 포함된 루트 디렉터리에 Git 저장소의 경로를 추가합니다. 이 필드는 선택사항이며 기본값은 저장소의 루트 디렉터리(/)입니다.
    • NAMESPACE_AUTH_TYPE: 다음 인증 유형 중 하나를 추가합니다.

      • none: 인증 사용 안함
      • ssh: SSH 키 쌍 사용
      • cookiefile: cookiefile 사용
      • token: 토큰 사용
      • gcpserviceaccount: Google 서비스 계정을 사용하여 Cloud Source Repositories의 저장소에 액세스합니다.
      • gcenode: Google 서비스 계정을 사용하여 Cloud Source Repositories의 저장소에 액세스합니다. 워크로드 아이덴티티가 클러스터에 사용 설정되지 않은 경우에만 이 옵션을 선택합니다.

        이러한 인증 유형에 대한 자세한 내용은 Git에 대한 읽기 전용 액세스 권한을 구성 동기화에 부여를 참조하세요.

      필수 필드입니다.

    • NAMESPACE_EMAIL: gcpserviceaccountAUTH_TYPE으로 추가한 경우 Google 서비스 계정 이메일 주소를 추가합니다. 예를 들면 acm@PROJECT_ID.iam.gserviceaccount.com입니다.

    • NAMESPACE_SECRET_NAME: 보안 비밀에 지정할 이름을 추가합니다. 이 필드는 선택사항입니다.

    • NAMESPACE_NO_SSL_VERIFY: SSL 인증서 확인을 중지하려면 이 필드를 true로 설정합니다. 기본값은 false입니다.

    필드에 대한 설명과 spec 필드에 추가할 수 있는 전체 필드 목록은 RepoSync 필드를 참조하세요.

    네임스페이스당 최대 1개의 RepoSync 객체가 있을 수 있습니다. 이를 적용하려면 객체의 namerepo-sync여야 합니다. RepoSync에서 참조하는 디렉터리에 포함된 모든 구성은 RepoSync 객체와 동일한 네임스페이스에 있어야 합니다.

  5. RepoSync 구성을 적용합니다.

    kubectl apply -f repo-sync.yaml
    
  6. 구성을 확인하려면 네임스페이스 저장소의 객체 중 하나에서 kubectl get을 사용합니다. 예를 들면 다음과 같습니다.

    kubectl get rolebindings -n NAMESPACE
    

네임스페이스 저장소의 동기화 상태 확인

nomos status 명령어를 사용하여 네임스페이스 저장소의 동기화 상태를 검사할 수 있습니다.

nomos status

다음과 비슷한 출력이 표시됩니다.

my_managed_cluster-1
  --------------------
  <root>   git@github.com:foo-corp/acme/admin@main
  SYNCED   f52a11e4
  --------------------
  bookstore  git@github.com:foo-corp/acme/bookstore@v1
  SYNCED     34d1a8c8

이 예시 출력에서 네임스페이스 저장소는 bookstore라는 네임스페이스에 대해 구성됩니다.

RepoSync 설치 확인

RepoSync 객체를 만들 때 구성 동기화는 ns-reconciler-NAMESPACE라는 조정자를 만듭니다. 여기서 NAMESPACE는 RepoSync 객체를 만든 네임스페이스입니다.

ns-reconciler-NAMESPACE 배포 상태를 확인하여 RepoSync 객체가 올바르게 작동하는지 확인할 수 있습니다.

kubectl get -n config-management-system deployment/ns-reconciler-NAMESPACE

NAMESPACE를 네임스페이스 저장소를 만든 네임스페이스로 바꿉니다.

RepoSync 객체 상태를 확인하는 추가 방법은 RootSync 및 RepoSync 객체 탐색을 참조하세요.

네임스페이스 저장소 삭제

루트 저장소 방식 또는 Kubernetes API 방식 탭을 선택하여 관련 안내를 확인합니다.

루트 저장소 방식

루트 저장소의 네임스페이스 저장소 제어 방식을 사용한 경우에는 중앙 관리자가 다음 두 단계에 따라 네임스페이스 저장소를 삭제할 수 있습니다.

  1. 문제 해결 안내에 따라 RepoSync 객체에서 관리되는 리소스를 관리 해제 또는 삭제합니다.

  2. Git 저장소에서 RepoSync 객체를 제거합니다.

Kubernetes API 방식

Kubernetes API로 네임스페이스 저장소 제어 방식이 사용된 경우에는 애플리케이션 운영자가 다음 두 단계에 따라 네임스페이스 저장소를 삭제할 수 있습니다.

  1. 문제 해결 안내에 따라 RepoSync 객체에서 관리되는 리소스를 관리 해제 또는 삭제합니다.

  2. 다음 명령어를 실행하여 RepoSync 객체를 삭제합니다.

    kubectl delete -f repo-sync.yaml
    

다음 단계