컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

구성 드리프트 방지

구성 동기화는 드리프트 감지를 통해 '그림자 작업' 위험을 줄여줍니다. 검증되지 않은 변경사항을 실제 클러스터로 푸시하면 구성 동기화는 Git의 정보 소스에서 드리프트를 감지하고 조정합니다. 또한 구성 동기화는 충돌하는 변경사항이 실시간 클러스터로 푸시되는 것을 거부하는 허용 웹훅을 제공합니다. 이 웹훅은 수동 변경을 시도했을 때 변경사항을 허용하고 자동으로 해결하는 대신 더 나은 피드백을 제공합니다. 또한 이 허용 웹훅은 구성 동기화 메타데이터와 주석이 수동으로 수정되지 않도록 합니다. 그렇지 않으면 허용 웹훅이나 조정자의 구성에 오류가 발생할 수 있습니다. 기본적으로 웹훅은 루트 저장소만 보호합니다. 그러나 네임스페이스 저장소에서 허용 웹훅을 사용 설정할 수 있습니다.

구성 동기화 허용 웹훅이 중지되면 구성 동기화는 구성 드리프트와 구성 동기화 메타데이터 변경사항을 거부하지 않지만 여전히 이러한 드리프트를 감지하고 해결합니다.

이 기능을 사용하려면 RootSync 및 RepoSync API를 사용 설정해야 합니다.

드리프트 방지 사용 설정

드리프트 방지를 사용 설정하려면 다음 단계를 완료하세요.

  1. 구성 파일의 preventDrift 필드를 true로 설정하고 구성 파일을 적용합니다.

    gcloud

    Google Cloud Console 또는 gcloud CLI를 사용하여 구성 동기화를 설치한 경우 gcloud CLI를 사용해서 드리프트 방지를 사용 설정합니다. 최신 버전으로 gcloud CLI를 업데이트해야 합니다. gcloud 구성 파일의 spec.configSync.preventDrift 필드를 true로 설정한 후 gcloud 구성 파일을 적용합니다.

    kubectl

    kubectl을 사용하여 구성 동기화를 수동으로 설치한 경우 kubectl을 사용하여 드리프트 방지를 사용 설정합니다. ConfigManagement 객체의 spec.preventDrift 필드를 true로 설정한 후 ConfigManagement 객체를 적용합니다.

  2. Config Management Operator에서 구성 동기화 ValidateWebhookConfiguration 객체를 만들 때까지 기다립니다.

    kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
    

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

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  3. root-reconciler 배포가 웹훅을 구성 동기화 ValidatingWebhookConfiguration 객체에 추가할 수 있도록 새 변경사항을 동기화할 Git 저장소에 커밋합니다. 다른 방법은 root-reconcilier 배포를 삭제하여 조정을 트리거하는 것입니다. 새 root-reconciler 배포는 구성 동기화 ValidatingWebhookConfiguration 객체를 업데이트합니다.

  4. 웹훅 서버가 준비될 때까지 기다립니다. 구성 동기화 허용 웹훅 배포 로그에는 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
    

드리프트 방지 중지

gcloud

Google Cloud Console 또는 gcloud CLI를 사용하여 구성 동기화를 설치한 경우 gcloud CLI를 사용해서 드리프트 방지를 사용 중지합니다. 최신 버전으로 gcloud CLI를 업데이트해야 합니다. gcloud 구성 파일의 spec.configSync.preventDrift 필드를 false로 설정하거나 필드를 삭제한 후 gcloud 구성 파일을 적용합니다.

kubectl

kubectl을 사용하여 구성 동기화를 수동으로 설치한 경우 kubectl을 사용하여 드리프트 방지를 중지합니다. ConfigManagement 객체의 spec.preventDrift 필드를 false로 설정하거나 필드를 삭제한 후 ConfigManagement 객체를 적용합니다.

모든 구성 동기화 허용 웹훅 리소스가 삭제됩니다. 구성 동기화 ValidatingWebhookConfiguration 객체가 더 이상 존재하지 않으므로 구성 동기화 조정자는 더 이상 관리형 리소스의 웹훅 구성을 생성하지 않습니다.

네임스페이스 저장소에서 허용 웹훅 사용 설정

네임스페이스 저장소는 웹훅에서 완벽하게 보호되지 않습니다. 각 네임스페이스 저장소의 구성 동기화 조정자는 클러스터 수준에서 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

네임스페이스 저장소에 웹훅 보호를 사용하지 않으려면 이 오류를 무시해도 됩니다. 하지만 웹훅을 활용하려면 네임스페이스 저장소에서 동기화를 구성한 후 각 네임스페이스 저장소의 조정자에게 다음 권한을 부여해야 합니다.

  1. 루트 저장소에서 구성 동기화 허용 웹훅에 권한을 부여하는 새 ClusterRole 구성을 선언합니다. 이 ClusterRole은 클러스터당 한 번만 정의하면 됩니다.

    # ROOT_REPO/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"]
    
  2. 허용 웹훅 권한을 부여해야 하는 각 네임스페이스 저장소에 대해 허용 웹훅에 액세스 권한을 부여하도록 ClusterRoleBinding 구성을 선언합니다.

    # ROOT_REPO/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.io
    

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

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

    git add .
    git commit -m 'Providing namespace repository the permission to update the admission webhook.'
    git push
    
    
  4. 확인하려면 kubectl get을 사용하여 ClusterRole 및 ClusterRoleBinding이 생성되었는지 확인합니다.

    kubectl get clusterrole admission-webhook-role
    kubectl get clusterrolebindings syncs-webhook