저장소를 여러 저장소로 분할

이 페이지에서는 하나의 루트 저장소를 둘 이상의 루트 저장소로 안전하게 분할하는 방법을 보여줍니다. 이 단계는 또한 네임스페이스 저장소에 적용할 수 있습니다.

구성 동기화로 동기화된 저장소는 Git 저장소, 브랜치, 버전 및 디렉터리 조합을 참조합니다.

루트 저장소에 리소스가 많을 경우(예: 5,000개 이상) 다음 두 가지 이유로 인해 구성 동기화가 제대로 작동하지 않을 수 있습니다.

  1. ResourceGroup 객체는 etcd 객체 크기 제한을 초과할 수 있습니다. ResourceGroup 객체는 모든 리소스의 그룹, 종류, 네임스페이스, 이름을 Git 저장소에 기록합니다. 리소스가 많으면 ResourceGroup 객체가 커집니다.
  2. 리소스가 적은 저장소보다 모든 리소스를 동기화하는 것이 더 오래 걸립니다. 구성 동기화는 클러스터에 순차적으로 리소스를 적용합니다. 일부 경우에는 처음에 리소스를 성공적으로 적용할 수 없고 구성 동기화가 리소스 적용을 재시도해야 합니다.

이러한 문제가 발생하면 각 루트 저장소에 리소스가 적게 포함되도록 루트 저장소를 여러 루트 저장소로 분할하면 됩니다.

구조화되지 않은 루트 저장소 분할

RootSync 객체를 사용해 이 단계를 설명합니다. 이 단계는 RepoSync 객체에도 적용할 수 있습니다.

이 방법은 해당 출시에서 추가된 파이널라이저로 인해 구성 동기화 버전 1.21.0 이상에서 작동합니다. 이 파이널라이저는 RootSync 또는 RepoSync 객체가 삭제될 때 객체 관리를 중지합니다. 이전에는 고아 객체에 영구 메타데이터가 있어 다른 클라이언트나 새 RootSync 또는 RepoSync 객체에서 관리할 수 없었습니다.

루트 저장소가 RootSync single-root-sync 객체에 의해 동기화된다고 가정합니다. 저장소를 분할하면 두 개의 루트 저장소가 생성됩니다. 하나는 root-sync-1 RootSync 객체에 의해 동기화되고 다른 하나는 root-sync-2 RootSync 객체에 의해 동기화됩니다.

저장소를 분할하려면 다음 단계를 따르세요.

  1. RootSync single-root-syncOrphanconfigsync.gke.io/deletion-propagation-policy 주석 값이 있거나 설정되지 않았는지 확인합니다. 설정하지 않은 경우 기본값은 '고아'와 동일합니다. 이 설정을 사용하면 객체가 삭제되지 않습니다.

  2. RootSync single-root-sync를 삭제합니다.

    kubectl delete rootsync single-root-sync -n config-management-system
    
  3. 다음 단계에 따라 새 저장소를 설정합니다.

    1. 기존 Git 저장소에 새 저장소 또는 새 디렉터리를 만듭니다.
    2. 리소스를 새 저장소 또는 새 디렉터리로 이동합니다.
    3. 루트 저장소를 2개 넘는 저장소로 분할하려면 필요에 따라 이 단계를 반복합니다.
  4. 커밋하고 변경사항을 푸시합니다.

    git commit -am 'add configuration for the new root repository'
    
  5. root-sync-1root-sync-2 RootSync 객체를 적용합니다. 이렇게 하면 클러스터의 기존 객체가 새 RootSync 객체 root-sync-1root-sync-2에서 관리되도록 새 저장소 또는 디렉터리가 동기화됩니다.

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: ROOT_SYNC_NAME
       namespace: config-management-system
     spec:
       sourceFormat: unstructured
       git:
         repo: NEW_ROOT_REPOSITORY
         revision: NEW_ROOT_REVISION
         branch: NEW_ROOT_BRANCH
         dir: "NEW_ROOT_DIRECTORY"
         auth: ROOT_AUTH_TYPE
         gcpServiceAccountEmail: ROOT_EMAIL
         # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount.
         secretRef:
           name: git-creds
    

    다음을 바꿉니다.

    • NEW_ROOT_REPOSITORY: 새 루트 저장소로 사용할 Git 저장소의 URL입니다. HTTPS 또는 SSH 프로토콜을 사용하여 URL을 입력할 수 있습니다. 예를 들어 https://github.com/GoogleCloudPlatform/anthos-config-management-samples는 HTTPS 프로토콜을 사용합니다. 프로토콜을 입력하지 않으면 URL이 HTTPS URL로 취급됩니다.
    • NEW_ROOT_REVISION: (선택사항) 체크아웃할 새 루트 저장소의 Git 버전 (태그 또는 해시)입니다.
    • NEW_ROOT_BRANCH: (선택사항) 동기화할 새 루트 저장소의 브랜치입니다.
    • NEW_ROOT_DIRECTORY: (선택사항) 동기화하려는 구성이 포함된 새 루트 디렉터리에 대한 Git 저장소의 경로입니다.
    • ROOT_AUTH_TYPE: 이 값은 기존 RootSync/root-sync 객체와 동일해야 합니다.
    • ROOT_EMAIL: 이 값은 기존 RootSync/root-sync 객체와 동일해야 합니다.
  6. root-sync-1 RootSync 객체가 동기화될 때까지 기다립니다. 다음 명령어를 사용하여 상태를 확인할 수 있습니다.

    nomos status
    

모든 버전

이 방법은 버전 1.21.0을 포함한 모든 구성 동기화 버전에서 작동하지만 단계가 더 적은 버전 1.21.0 이상의 방법을 사용하는 것이 좋습니다. 구성 동기화 버전이 1.21.0 이전인 경우 이 방법을 대신 사용할 수 있습니다.

루트 저장소가 RootSync root-sync 객체에 의해 동기화된다고 가정합니다. 저장소를 분할하면 두 개의 루트 저장소가 생성됩니다. 하나는 root-sync RootSync 객체에 의해 동기화되고 다른 하나는 root-sync-1 RootSync 객체에 의해 동기화됩니다.

저장소를 분할하려면 다음 단계를 따르세요.

  1. 기존 루트 저장소에서 다른 저장소 또는 디렉터리로 이동할 리소스를 선택하고 여기에 configmanagement.gke.io/managed: disabled 주석을 추가합니다. 이 주석을 사용하면 구성을 한 저장소에서 다른 저장소로 이동할 때 클러스터의 기존 객체가 영향을 받지 않습니다. Kustomize 형식 또는 helm 차트를 사용하는 경우 다음 예시와 같이 기준의 약 절반을 선택하고 kustomization.yaml 파일에 공통 주석을 추가합니다.

    # kustomization.yaml
    commonAnnotations:
      configmanagement.gke.io/managed: disabled
    
  2. 커밋하고 변경사항을 푸시합니다. sh git commit -am 'disable Config Sync management on subset of the configuration'

  3. 다음 명령어를 사용하여 기존 root-sync RootSync 객체가 동기화될 때까지 기다립니다.

    nomos status
    
  4. 다음 단계에 따라 두 번째 저장소를 설정합니다.

    1. 기존 Git 저장소에 새 저장소 또는 새 디렉터리를 만듭니다.
    2. configmanagement.gke.io/managed: disabled 주석이 포함된 리소스를 새 저장소 또는 새 디렉터리에 복사합니다.
    3. 새 저장소 또는 디렉터리에서 configmanagement.gke.io/managed: disabled 주석을 삭제합니다.
    4. 루트 저장소를 2개 넘는 저장소로 분할하려면 필요에 따라 이 단계를 반복합니다.
  5. 커밋하고 변경사항을 푸시합니다.

    git commit -am 'add configuration for the new root repository'
    
  6. 클러스터의 기존 객체가 새 root-sync-1 RootSync 객체에서 관리되도록 root-sync-1 RootSync 객체를 적용하여 새 저장소 또는 디렉터리를 동기화합니다.

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: root-sync-1
       namespace: config-management-system
     spec:
       sourceFormat: unstructured
       git:
         repo: NEW_ROOT_REPOSITORY
         revision: NEW_ROOT_REVISION
         branch: NEW_ROOT_BRANCH
         dir: "NEW_ROOT_DIRECTORY"
         auth: ROOT_AUTH_TYPE
         gcpServiceAccountEmail: ROOT_EMAIL
         # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount.
         secretRef:
           name: git-creds
    

    다음을 바꿉니다.

    • NEW_ROOT_REPOSITORY: 새 루트 저장소로 사용할 Git 저장소의 URL입니다. HTTPS 또는 SSH 프로토콜을 사용하여 URL을 입력할 수 있습니다. 예를 들어 https://github.com/GoogleCloudPlatform/anthos-config-management-samples는 HTTPS 프로토콜을 사용합니다. 프로토콜을 입력하지 않으면 URL이 HTTPS URL로 취급됩니다.
    • NEW_ROOT_REVISION: (선택사항) 체크아웃할 새 루트 저장소의 Git 버전 (태그 또는 해시)입니다.
    • NEW_ROOT_BRANCH: (선택사항) 동기화할 새 루트 저장소의 브랜치입니다.
    • NEW_ROOT_DIRECTORY: (선택사항) 동기화하려는 구성이 포함된 새 루트 디렉터리에 대한 Git 저장소의 경로입니다.
    • ROOT_AUTH_TYPE: 이 값은 기존 RootSync/root-sync 객체와 동일해야 합니다.
    • ROOT_EMAIL: 이 값은 기존 RootSync/root-sync 객체와 동일해야 합니다.
  7. root-sync-1 RootSync 객체가 동기화될 때까지 기다립니다. 다음 명령어를 사용하여 상태를 확인할 수 있습니다.

    nomos status
    
  8. 원래 저장소에서 configmanagement.gke.io/managed: disabled 주석이 있는 리소스를 삭제합니다. 커밋하고 변경사항을 푸시합니다.

    git commit -am 'remove configuration managed by the new root repository'
    
  9. 다음 명령어를 사용하여 기존 root-sync RootSync 객체가 동기화될 때까지 기다립니다.

    nomos status
    

계층적 루트 저장소 분할

계층적 저장소를 분할하는 단계는 구조화되지 않은 저장소를 분할하는 단계와 비슷합니다.

다음 세 가지 주요 차이점이 있습니다.

  1. 새 루트 저장소(또는 새 디렉터리)도 계층적이어야 합니다. 기존 디렉터리 system/clusterregistry/ 디렉터리를 새 루트 저장소(또는 새 디렉터리)에 복사해야 합니다.

  2. 네임스페이스의 리소스를 여러 저장소에 분산할 수 없습니다. 그렇지 않으면 여러 조정자가 네임스페이스 관리를 위해 경합하게 됩니다.

  3. root-sync-1 RootSync 객체에서 spec.sourceFormat: hierarchical을 사용해야 합니다.

구조화되지 않은 저장소를 사용하는 것이 좋으므로 분할하기 전에 계층적 저장소를 구조화되지 않은 저장소로 변환하는 것도 고려해 볼 수 있습니다.