구성 드리프트 방지

구성 동기화는 자가 복구, 주기적 재동기화, 선택적 드리프트 방지를 통해 '그림자 작업' 위험을 줄여줍니다. 구성 동기화에서 클러스터와 정보 소스 간의 드리프트를 감지하면 이를 허용하고 빠르게 되돌리거나 완전히 거부할 수 있습니다.

자가 복구는 관리형 리소스를 감시하고 정보 소스에서 드리프트를 감지하며 이러한 드리프트를 되돌립니다. 자가 복구는 항상 사용 설정되어 있습니다.

주기적 재동기화는 정보 소스에 변경사항이 없더라도 마지막 동기화가 성공한지 후 1시간 후에 자동으로 동기화됩니다. 주기적 재동기화는 항상 사용 설정되어 있습니다.

자가 복구 및 주기적 재동기화는 드리프트를 해결하는 데 도움이 되지만 드리프트 방지는 관리형 객체 변경 요청을 가로채고 변경이 허용되는지 여부를 검증합니다. 변경사항이 정보 소스와 일치하지 않으면 변경이 거부됩니다. 드리프트 방지는 기본적으로 중지되어 있습니다. 사용 설정된 경우 드리프트 방지는 기본적으로 RootSync 객체를 보호하며 RepoSync 객체를 보호하도록 구성할 수도 있습니다.

드리프트 방지를 사용하려면 RootSyncRepoSync 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. ConfigManagement Operator에서 구성 동기화 ValidateWebhookConfiguration 객체를 만들 때까지 기다립니다.

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

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

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  3. root-reconciler 배포가 웹훅을 구성 동기화 ValidatingWebhookConfiguration 객체에 추가할 수 있도록 새 변경사항을 동기화할 정보 소스에 커밋합니다. 다른 방법은 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

네임스페이스 범위의 정보 소스에 대해 웹훅 보호를 사용하지 않으려면 이 오류를 무시해도 됩니다. 하지만 웹훅을 사용하려면 둘 이상의 정보 소스에서 동기화를 구성한 후 각 네임스페이스 범위의 정보 소스의 조정자에게 권한을 부여합니다. ns-reconciler-NAMESPACE의 RoleBinding에 이미 ClusterRole cluster-admin 권한이 있는 경우 이 단계를 수행할 필요가 없습니다.

  1. 루트 정보 소스에서 구성 동기화 허용 웹훅에 권한을 부여하는 새 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"]
    
  2. 허용 웹훅 권한을 부여해야 하는 각 네임스페이스 범위의 소스에 대해 허용 웹훅에 액세스 권한을 부여하도록 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.io
    

    NAMESPACE를 네임스페이스 범위의 소스를 만든 네임스페이스로 바꿉니다.

  3. 예를 들어 Git 저장소에서 동기화하는 경우 루트 정보 소스에 변경사항을 커밋합니다.

    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
    

폐기된 리소스에 대한 드리프트 방지 중지

RootSync 또는 RepoSync 객체를 삭제하면 기본적으로 구성 동기화는 해당 RootSync 또는 RepoSync 객체에서 이전에 관리했던 리소스를 수정하지 않습니다. 그러면 구성 동기화가 이러한 리소스 객체를 추적하는 데 사용하는 여러 라벨과 주석을 남겨둘 수 있습니다. 드리프트 보호가 사용 설정된 경우 이전에 관리형 리소스에 대한 변경사항이 거부될 수 있습니다.

삭제 전파를 사용하지 않은 경우 남은 리소스 객체가 구성 동기화에서 추가한 라벨과 주석을 계속 보존할 수 있습니다.

이러한 관리형 리소스를 유지하려면 정보 소스에 선언된 모든 관리형 리소스에서 configmanagement.gke.io/managed 주석을 disabled로 설정하여 RootSync 또는 RepoSync 객체를 삭제하기 전에 해당 리소스를 관리 해제합니다. 이렇게 하면 구성 동기화에 이러한 리소스를 삭제하지 않고 관리형 리소스에서 라벨 및 주석을 삭제하도록 지시합니다. 동기화가 완료되면 RootSync 또는 RepoSync 객체를 삭제할 수 있습니다.

이러한 관리형 리소스를 삭제하려면 다음 두 가지 옵션이 있습니다.

  • 정보 소스에서 관리형 리소스를 삭제합니다. 그런 다음 구성 동기화가 클러스터에서 관리형 객체를 삭제합니다. 동기화가 완료되면 RootSync 또는 RepoSync 객체를 삭제할 수 있습니다.
  • RootSync 또는 RepoSync 객체를 삭제하기 전에 이 객체에서 삭제 전파를 사용 설정하세요. 그런 다음 구성 동기화가 클러스터에서 관리형 객체를 삭제합니다.

관리형 리소스를 관리 해제하거나 삭제하기 전에 RootSync 또는 RepoSync 객체가 삭제되면 RootSync 또는 RepoSync 객체를 다시 만들 수 있으며 정보 소스와 일치하는 클러스터에서 리소스를 채택합니다. 그런 다음 리소스를 관리 해제하거나 삭제하고 변경사항이 동기화될 때까지 기다린 후 RootSync 또는 RepoSync 객체를 다시 삭제할 수 있습니다.

다음 단계