구성 동기화는 드리프트를 관리하는 두 가지 방법을 제공합니다.
- 구성 동기화의 기본 제공 자가 복구 사용 (권장, 구성 불필요): 구성 동기화가 드리프트를 자동으로 감지하고 되돌립니다. 구성 동기화의 자가 복구는 사용 중지할 수 없습니다. 자가 복구는 성능에 미치는 영향이 최소화됩니다.
- 드리프트 방지 기능 사용 설정 (이 페이지): 드리프트 방지는 허용 웹훅을 사용하여 충돌하는 변경사항을 차단합니다. 이 기능은 특히 CustomResourceDefinition (CRD)이 많은 클러스터에서 메모리 사용량이 많아지고 메모리 부족 (OOM) 오류가 발생할 수 있습니다.
드리프트 방지가 권장되지 않는 이유
허용 웹훅에는 요청을 검증하기 위해 구성 동기화가 Kubernetes OpenAPI 스키마를 로드해야 합니다. 리소스나 CRD가 많은 클러스터에서 이 스키마 처리가 메모리 한도를 초과하여 구성요소 오류가 발생할 수 있습니다. 대부분의 사용 사례에서 구성 동기화의 내장 자가 복구는 웹훅의 안정성 위험 없이 드리프트 보호를 제공합니다.
사용 설정된 경우 드리프트 방지는 기본적으로 RootSync 객체를 보호합니다. RepoSync 객체를 보호하도록 기능을 구성할 수 있습니다. 드리프트 방지를 사용하려면 RootSync 및 RepoSync API를 사용 설정해야 합니다.
시작하기 전에
이전에 Google Cloud CLI를 설치한 경우 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다.
드리프트 방지 사용 설정
gcloud CLI를 사용하여 드리프트 방지를 사용 설정할 수 있습니다. Google Cloud 콘솔에서는 드리프트 방지를 사용 설정할 수 없습니다.
드리프트 방지를 사용 설정하려면 다음 단계를 완료하세요.
spec.configSync.preventDrift필드를true로 설정하도록 적용 사양 매니페스트를 업데이트합니다.applySpecVersion: 1 spec: configSync: enabled: true ... existing content ... preventDrift: true업데이트된 매니페스트를 적용합니다.
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_ID다음을 바꿉니다.
MEMBERSHIP_NAME: 클러스터를 등록할 때 선택한 Fleet 멤버십 이름입니다.gcloud container fleet memberships list명령어를 사용하여 이름을 가져옵니다.MANIFEST_NAME: 적용 사양 매니페스트의 이름입니다(일반적으로apply-spec.yaml).PROJECT_ID: 프로젝트 ID입니다.
ConfigManagement Operator에서 구성 동기화
ValidateWebhookConfiguration객체를 만들 때까지 기다립니다.kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io다음과 비슷한 출력이 표시됩니다.
NAME WEBHOOKS AGE admission-webhook.configsync.gke.io 0 2m15sroot-reconciler배포가 웹훅을 구성 동기화 ValidatingWebhookConfiguration 객체에 추가할 수 있도록 새 변경사항을 동기화할 정보 소스에 커밋합니다. 다른 방법은root-reconcilier배포를 삭제하여 조정을 트리거하는 것입니다. 새root-reconciler배포는 구성 동기화 ValidatingWebhookConfiguration 객체를 업데이트합니다.웹훅 서버가 준비될 때까지 기다립니다. 구성 동기화 허용 웹훅 배포 로그에는
serving webhook server가 포함되어야 합니다. 몇 분 정도 걸릴 수 있습니다.kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"다음과 비슷한 출력이 표시됩니다.
I1201 18:05:41.805531 1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server" "host"="" "port"=10250 I1201 18:07:04.626199 1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server" "host"="" "port"=10250
드리프트 방지 중지
드리프트 방지를 사용 중지하면 구성 동기화는 모든 구성 동기화 허용 웹훅 리소스를 삭제합니다.
구성 동기화 ValidatingWebhookConfiguration 객체가 더 이상 존재하지 않으므로 구성 동기화 조정자는 더 이상 관리형 리소스의 웹훅 구성을 생성하지 않습니다.
드리프트 방지를 사용 중지하려면 다음 단계를 완료하세요.
spec.configSync.preventDrift필드를false로 설정하도록 적용 사양 매니페스트를 업데이트합니다.applySpecVersion: 1 spec: configSync: enabled: false ... existing content ... preventDrift: false업데이트된 매니페스트를 적용합니다.
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_ID다음을 바꿉니다.
MEMBERSHIP_NAME: 클러스터를 등록할 때 선택한 Fleet 멤버십 이름입니다.gcloud container fleet memberships list명령어를 사용하여 이름을 가져옵니다.MANIFEST_NAME: 적용 사양 매니페스트의 이름입니다(일반적으로apply-spec.yaml).PROJECT_ID: 프로젝트 ID입니다.
네임스페이스 범위의 소스에서 허용 웹훅 사용 설정
네임스페이스 범위의 정보 소스는 웹훅에서 완벽하게 보호되지 않습니다. 각 네임스페이스 소스의 구성 동기화 조정자는 클러스터 수준에서 ValidatingWebhookConfiguration 객체를 읽거나 업데이트할 권한이 없습니다.
이러한 권한이 없으면 다음 예시와 유사하게 네임스페이스 조정자 로그에 대한 오류가 발생합니다.
Failed to update admission webhook: KNV2013: applying changes to
admission webhook: Insufficient permission. To fix, make sure the reconciler has
sufficient permissions.:
validatingwebhookconfigurations.admissionregistration.k8s.io "admission-
webhook.configsync.gke.io" is forbidden: User "system:serviceaccount:config-
management-system:ns-reconciler-NAMESPACE" cannot update resource
"validatingwebhookconfigurations" in API group "admissionregistration.k8s.io" at
the cluster scope
네임스페이스 범위의 정보 소스에 대해 웹훅 보호를 사용하지 않으려면 이 오류를 무시해도 됩니다. 하지만 웹훅을 사용하려면 둘 이상의 정보 소스에서 동기화를 구성한 후 각 네임스페이스 범위의 정보 소스의 조정자에게 권한을 부여합니다.
ns-reconciler-NAMESPACE의 RoleBinding에 이미 ClusterRole cluster-admin 권한이 있는 경우 이 단계를 수행할 필요가 없습니다.
루트 정보 소스에서 구성 동기화 허용 웹훅에 권한을 부여하는 새 ClusterRole 구성을 선언합니다. 이 ClusterRole은 클러스터당 한 번만 정의하면 됩니다.
# ROOT_SOURCE/cluster-roles/webhook-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: admission-webhook-role rules: - apiGroups: ["admissionregistration.k8s.io"] resources: ["validatingwebhookconfigurations"] resourceNames: ["admission-webhook.configsync.gke.io"] verbs: ["get", "update"]허용 웹훅 권한을 부여해야 하는 각 네임스페이스 범위의 소스에 대해 허용 웹훅에 액세스 권한을 부여하도록 ClusterRoleBinding 구성을 선언합니다.
# ROOT_SOURCE/NAMESPACE/sync-webhook-rolebinding.yaml kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: syncs-webhook subjects: - kind: ServiceAccount name: ns-reconciler-NAMESPACE namespace: config-management-system roleRef: kind: ClusterRole name: admission-webhook-role apiGroup: rbac.authorization.k8s.ioNAMESPACE를 네임스페이스 범위의 소스를 만든 네임스페이스로 바꿉니다.예를 들어 Git 저장소에서 동기화하는 경우 루트 정보 소스에 변경사항을 커밋합니다.
git add . git commit -m 'Providing namespace repository the permission to update the admission webhook.' git push확인하려면
kubectl get을 사용하여 ClusterRole 및 ClusterRoleBinding이 생성되었는지 확인합니다.kubectl get clusterrole admission-webhook-role kubectl get clusterrolebindings syncs-webhook
다음 단계
- 웹훅 문제 해결 방법을 알아보세요.