이 페이지에서는 하나의 루트 저장소를 둘 이상의 루트 저장소로 안전하게 분할하는 방법을 보여줍니다. 이 단계는 또한 네임스페이스 저장소에 적용할 수 있습니다.
구성 동기화로 동기화된 저장소는 Git 저장소, 브랜치, 버전 및 디렉터리 조합을 참조합니다.
루트 저장소에 리소스가 많을 경우(예: 5,000개 이상) 다음 두 가지 이유로 인해 구성 동기화가 제대로 작동하지 않을 수 있습니다.
- ResourceGroup 객체는 etcd 객체 크기 제한을 초과할 수 있습니다. ResourceGroup 객체는 모든 리소스의 그룹, 종류, 네임스페이스, 이름을 Git 저장소에 기록합니다. 리소스가 많으면 ResourceGroup 객체가 커집니다.
- 리소스가 적은 저장소보다 모든 리소스를 동기화하는 것이 더 오래 걸립니다. 구성 동기화는 클러스터에 순차적으로 리소스를 적용합니다. 일부 경우에는 처음에 리소스를 성공적으로 적용할 수 없고 구성 동기화가 리소스 적용을 재시도해야 합니다.
이러한 문제가 발생하면 각 루트 저장소에 리소스가 적게 포함되도록 루트 저장소를 여러 루트 저장소로 분할하면 됩니다.
구조화되지 않은 루트 저장소 분할
RootSync 객체를 사용해 이 단계를 설명합니다. 이 단계는 RepoSync 객체에도 적용할 수 있습니다.
1.21.0 이상 (권장)
이 방법은 해당 출시에서 추가된 파이널라이저로 인해 구성 동기화 버전 1.21.0 이상에서 작동합니다. 이 파이널라이저는 RootSync 또는 RepoSync 객체가 삭제될 때 객체 관리를 중지합니다. 이전에는 고아 객체에 영구 메타데이터가 있어 다른 클라이언트나 새 RootSync 또는 RepoSync 객체에서 관리할 수 없었습니다.
루트 저장소가 RootSync single-root-sync
객체에 의해 동기화된다고 가정합니다.
저장소를 분할하면 두 개의 루트 저장소가 생성됩니다. 하나는 root-sync-1
RootSync 객체에 의해 동기화되고 다른 하나는 root-sync-2
RootSync 객체에 의해 동기화됩니다.
저장소를 분할하려면 다음 단계를 따르세요.
RootSync
single-root-sync
에Orphan
의configsync.gke.io/deletion-propagation-policy
주석 값이 있거나 설정되지 않았는지 확인합니다. 설정하지 않은 경우 기본값은 '고아'와 동일합니다. 이 설정을 사용하면 객체가 삭제되지 않습니다.RootSync
single-root-sync
를 삭제합니다.kubectl delete rootsync single-root-sync -n config-management-system
다음 단계에 따라 새 저장소를 설정합니다.
- 기존 Git 저장소에 새 저장소 또는 새 디렉터리를 만듭니다.
- 리소스를 새 저장소 또는 새 디렉터리로 이동합니다.
- 루트 저장소를 2개 넘는 저장소로 분할하려면 필요에 따라 이 단계를 반복합니다.
커밋하고 변경사항을 푸시합니다.
git commit -am 'add configuration for the new root repository'
root-sync-1
및root-sync-2
RootSync 객체를 적용합니다. 이렇게 하면 클러스터의 기존 객체가 새 RootSync 객체root-sync-1
및root-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 객체와 동일해야 합니다.
새
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 객체에 의해 동기화됩니다.
저장소를 분할하려면 다음 단계를 따르세요.
기존 루트 저장소에서 다른 저장소 또는 디렉터리로 이동할 리소스를 선택하고 여기에
configmanagement.gke.io/managed: disabled
주석을 추가합니다. 이 주석을 사용하면 구성을 한 저장소에서 다른 저장소로 이동할 때 클러스터의 기존 객체가 영향을 받지 않습니다. Kustomize 형식 또는 helm 차트를 사용하는 경우 다음 예시와 같이 기준의 약 절반을 선택하고kustomization.yaml
파일에 공통 주석을 추가합니다.# kustomization.yaml commonAnnotations: configmanagement.gke.io/managed: disabled
커밋하고 변경사항을 푸시합니다.
sh git commit -am 'disable Config Sync management on subset of the configuration'
다음 명령어를 사용하여 기존
root-sync
RootSync 객체가 동기화될 때까지 기다립니다.nomos status
다음 단계에 따라 두 번째 저장소를 설정합니다.
- 기존 Git 저장소에 새 저장소 또는 새 디렉터리를 만듭니다.
configmanagement.gke.io/managed: disabled
주석이 포함된 리소스를 새 저장소 또는 새 디렉터리에 복사합니다.- 새 저장소 또는 디렉터리에서
configmanagement.gke.io/managed: disabled
주석을 삭제합니다. - 루트 저장소를 2개 넘는 저장소로 분할하려면 필요에 따라 이 단계를 반복합니다.
커밋하고 변경사항을 푸시합니다.
git commit -am 'add configuration for the new root repository'
클러스터의 기존 객체가 새
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 객체와 동일해야 합니다.
새
root-sync-1
RootSync 객체가 동기화될 때까지 기다립니다. 다음 명령어를 사용하여 상태를 확인할 수 있습니다.nomos status
원래 저장소에서
configmanagement.gke.io/managed: disabled
주석이 있는 리소스를 삭제합니다. 커밋하고 변경사항을 푸시합니다.git commit -am 'remove configuration managed by the new root repository'
다음 명령어를 사용하여 기존
root-sync
RootSync 객체가 동기화될 때까지 기다립니다.nomos status
계층적 루트 저장소 분할
계층적 저장소를 분할하는 단계는 구조화되지 않은 저장소를 분할하는 단계와 비슷합니다.
다음 세 가지 주요 차이점이 있습니다.
새 루트 저장소(또는 새 디렉터리)도 계층적이어야 합니다. 기존 디렉터리
system/
및clusterregistry/
디렉터리를 새 루트 저장소(또는 새 디렉터리)에 복사해야 합니다.네임스페이스의 리소스를 여러 저장소에 분산할 수 없습니다. 그렇지 않으면 여러 조정자가 네임스페이스 관리를 위해 경합하게 됩니다.
root-sync-1
RootSync 객체에서spec.sourceFormat: hierarchical
을 사용해야 합니다.
구조화되지 않은 저장소를 사용하는 것이 좋으므로 분할하기 전에 계층적 저장소를 구조화되지 않은 저장소로 변환하는 것도 고려해 볼 수 있습니다.