Config Sync bietet zwei Möglichkeiten zum Verwalten von Abweichungen:
- Integrierte Selbstkorrektur von Config Sync verwenden (empfohlen, keine Konfiguration erforderlich): Config Sync erkennt und behebt Abweichungen automatisch. Die Selbstheilung von Config Sync kann nicht deaktiviert werden. Die automatische Reparatur hat nur minimale Auswirkungen auf die Leistung.
- Drift-Prävention aktivieren (diese Seite): Bei der Drift-Prävention wird ein Zulassungs-Webhook verwendet, um in Konflikt stehende Änderungen zu blockieren. Diese Funktion kann zu einer hohen Speicherauslastung und zu Fehlern aufgrund von unzureichendem Arbeitsspeicher (Out-of-Memory, OOM) führen, insbesondere in Clustern mit vielen CustomResourceDefinitions (CRDs).
Warum die Drift-Prävention nicht empfohlen wird
Für den Zulassungs-Webhook muss Config Sync das Kubernetes OpenAPI-Schema laden, um Anfragen zu validieren. In Clustern mit vielen Ressourcen oder CRDs kann die Verarbeitung des Schemas die Arbeitsspeicherlimits überschreiten, was zu Komponentenfehlern führt. In den meisten Anwendungsfällen bietet die integrierte Selbstheilung von Config Sync Schutz vor Abweichungen ohne die Stabilitätsrisiken des Webhooks.
Wenn diese Option aktiviert ist, schützt die Drift-Prävention standardmäßig RootSync-Objekte. Sie können die Funktion so konfigurieren, dass RepoSync-Objekte geschützt werden. Wenn Sie die Drift-Prävention verwenden möchten, müssen Sie die RootSync und RepoSync APIs aktivieren.
Hinweis
Wenn Sie die Google Cloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem Befehl gcloud components update ab.
Drift-Prävention aktivieren
Sie können die Drift-Prävention mit der gcloud CLI aktivieren. Sie können die Drift-Prävention nicht in der Google Cloud Konsole aktivieren.
Führen Sie die folgenden Schritte aus, um die Drift-Prävention zu aktivieren:
Aktualisieren Sie Ihr applySpec-Manifest, um das Feld
spec.configSync.preventDriftauftruefestzulegen:applySpecVersion: 1 spec: configSync: enabled: true ... existing content ... preventDrift: trueWenden Sie das aktualisierte Manifest an:
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_IDErsetzen Sie Folgendes:
MEMBERSHIP_NAME: Name der Flottenmitgliedschaft, den Sie bei der Registrierung Ihres Clusters ausgewählt haben. Rufen Sie den Namen mit dem Befehlgcloud container fleet memberships listab.MANIFEST_NAME: der Name des Manifests für die Apply-Spezifikation, normalerweiseapply-spec.yaml.PROJECT_ID: Ihre Projekt-ID.
Warten Sie, bis das Config Sync-
ValidateWebhookConfiguration-Objekt vom Config Management Operator erstellt wurde:kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.ioDie Ausgabe sollte in etwa wie im folgenden Beispiel aussehen:
NAME WEBHOOKS AGE admission-webhook.configsync.gke.io 0 2m15sFühren Sie ein Commit einer neuen Änderung an der zu synchronisierenden „Source of Truth“ durch, damit das
root-reconciler-Deployment Webhooks zum Config Sync-ValidatingWebhookConfiguration-Objekt hinzufügen kann. Alternativ können Sie dasroot-reconcilier-Deployment löschen, um einen Abgleich auszulösen. Das neueroot-reconciler-Deployment würde das Config Sync-ValidatingWebhookConfiguration-Objekt aktualisieren.Warten Sie, bis der Webhook-Server bereit ist. Das Deployment-Log für den Config Sync-Zulassungs-Webhook sollte
serving webhook serverenthalten. Dieser Vorgang kann einige Minuten dauern.kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"Die Ausgabe sollte in etwa wie im folgenden Beispiel aussehen:
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
Drift-Prävention deaktivieren
Wenn Sie die Drift-Prävention deaktivieren, löscht Config Sync alle Config Sync-Zulassungs-Webhook-Ressourcen.
Da das Config Sync-ValidatingWebhookConfiguration-Objekt nicht mehr vorhanden ist, generieren die Config Sync-Reconciler keine Webhook-Konfigurationen für verwaltete Ressourcen mehr.
Führen Sie die folgenden Schritte aus, um die Drift-Prävention zu deaktivieren:
Aktualisieren Sie Ihr applySpec-Manifest, um das Feld
spec.configSync.preventDriftauffalsefestzulegen:applySpecVersion: 1 spec: configSync: enabled: false ... existing content ... preventDrift: falseWenden Sie das aktualisierte Manifest an:
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_IDErsetzen Sie Folgendes:
MEMBERSHIP_NAME: Name der Flottenmitgliedschaft, den Sie bei der Registrierung Ihres Clusters ausgewählt haben. Rufen Sie den Namen mit dem Befehlgcloud container fleet memberships listab.MANIFEST_NAME: der Name des Manifests für die Apply-Spezifikation, normalerweiseapply-spec.yaml.PROJECT_ID: Ihre Projekt-ID.
Zulassungs-Webhook in Namespace-bezogenen Quellen aktivieren
Namespace-bezogene "Sources of Truth" sind nicht vollständig durch den Webhook geschützt. Der Config Sync-Reconciler für jede Namespace-Quelle hat nicht die Berechtigung, die ValidatingWebhookConfiguration-Objekte auf Clusterebene zu lesen oder zu aktualisieren.
Diese fehlende Berechtigung führt zu einem Fehler für die Namespace-Abgleicher-logs, ähnlich dem folgenden Beispiel:
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
Sie können diesen Fehler ignorieren, wenn Sie den Webhook-Schutz für Ihre Namespace-bezogene „Source of Truth“ nicht verwenden möchten. Wenn Sie jedoch den Webhook verwenden möchten, erteilen Sie dem Abgleicher für jede Namespace-bezogene "Source of Truth" die Berechtigung, nachdem Sie die Synchronisierung aus mehreren Sources of Truth konfiguriert haben.
Möglicherweise müssen Sie diese Schritte nicht ausführen, wenn bereits ein RoleBinding für ns-reconciler-NAMESPACE mit Berechtigungen für die ClusterRole cluster-admin vorhanden ist.
Deklarieren Sie in der Root-Source of Truth eine neue ClusterRole-Konfiguration, die dem Config Sync-Zulassungs-Webhook Berechtigungen gewährt. Diese ClusterRole muss nur einmal pro Cluster definiert werden:
# 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"]Deklarieren Sie für jede Namespace-Quelle, für die die Zulassungs-Webhook-Berechtigung gewährt werden muss, eine ClusterRoleBinding-Konfiguration, um Zugriff auf den Zulassungs-Webhook zu gewähren:
# 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.ioErsetzen Sie
NAMESPACEdurch den Namespace, in dem Sie Ihre quellbezogene Quelle erstellt haben.Übernehmen Sie die Änderungen an der Root-Source of Truth, z. B. bei der Synchronisierung aus einem Git-Repository:
git add . git commit -m 'Providing namespace repository the permission to update the admission webhook.' git pushPrüfen Sie zur Bestätigung mit
kubectl get, ob ClusterRole und ClusterRoleBinding erstellt wurden:kubectl get clusterrole admission-webhook-role kubectl get clusterrolebindings syncs-webhook
Nächste Schritte
- Weitere Informationen zur Fehlerbehebung für Webhook.