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

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

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

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

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

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

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

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

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

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

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

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

  3. gcloud alpha anthos config sync repo describe 명령어를 사용해서 기존 RootSync 객체 root-sync가 동기화되도록 기다립니다.

    # gcloud command
    gcloud alpha anthos config sync repo describe --cluster MEMBERSHIP_NAME \
      --sync-namespace config-management-system  --sync-name root-sync
    

    MEMBERSHIP_NAME을 등록된 클러스터의 멤버십 이름으로 바꿉니다.

  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. 클러스터의 기존 객체가 새 RootSync 객체 root-split에서 관리되도록 RootSync 객체 root-split를 적용하여 새 저장소 또는 디렉터리를 동기화합니다.

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: root-split
       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. 새 RootSync 객체 root-split이 동기화될 때까지 기다립니다. 이 작업은 gcloud alpha anthos config sync repo describe 명령어를 사용하여 수행할 수 있습니다.

    $ gcloud alpha anthos config sync repo describe --cluster MEMBERSHIP_NAME \
      --sync-namespace config-management-system  --sync-name root-split
    

    MEMBERSHIP_NAME을 등록된 클러스터의 멤버십 이름으로 바꿉니다. 루트 저장소가 동기화됩니다.

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

    git commit -am 'remove configuration managed by the new root repository'
    
  9. gcloud 명령어를 사용해서 기존 RootSync 객체 root-sync가 동기화되도록 기다립니다.

    $ gcloud alpha anthos config sync repo describe --cluster MEMBERSHIP_NAME \
     --sync-namespace config-management-system  --sync-name root-sync
    

    MEMBERSHIP_NAME을 등록된 클러스터의 멤버십 이름으로 바꿉니다.

계층적 루트 저장소 분할

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

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

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

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

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

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