Fehlerbehebung bei Controller-Konflikten

Auf dieser Seite erfahren Sie, wie Sie Probleme mit Controllerkonflikten beheben. Solche Streits verbrauchen ein hohes Maß an Ressourcen und können die Leistung beeinträchtigen. Streits werden auch als Ressourcenkonflikte bezeichnet.

Config Sync überwacht die Objekte, die es auf den Cluster anwendet, und macht Änderungen an den in der „Source of Truth“ deklarierten Werten rückgängig. Wenn diese Änderungen von einem anderen Controller vorgenommen werden, wechselt die Ressource möglicherweise zwischen den von den konkurrierenden Controllern gewünschten Zuständen hin und her. Ein Symptom dieses Verhaltens ist, dass die Felder metadata.generation und metadata.resourceVersion schnell ansteigen. Wenn ein verwaltetes Objekt mehr als fünfmal pro Minute aktualisiert wird, erkennt Config Sync den Konflikt, protokolliert die Abweichung und meldet den Fehler im Status des RootSync- oder RepoSync-Objekts.

Config Sync verfügt über eine spezielle Logik, um Konflikte zwischen mehreren RootSync- und RepoSync-Objekten zu erkennen. Bei RepoSync-Objekten werden weitere Aktualisierungen übersprungen, wenn der Abgleicher feststellt, dass das Objekt bereits von einem anderen Abgleicher verwaltet wird. Bei RootSync-Objekten versucht der Abgleicher, jedes Objekt zu verwenden, für dessen Verwaltung er konfiguriert ist, es sei denn, es wird von einem anderen RootSync-Objekt verwaltet. Dadurch wird verhindert, dass Config Sync-Abgleicher untereinander konkurrieren und es werden Fehler im Status aller beteiligten RootSync- und RepoSync-Objekte gemeldet.

Controllerkonflikte identifizieren

Sie können die Kampffehler mit dem Befehl nomos status oder durch Prüfen des Statusfelds im Objekt RootSync oder RepoSync ansehen.

Wenn Sie das Befehlszeilentool nomos nicht installiert haben, können Sie die Logs für den RootSync-Abgleicher mit dem folgenden Befehl ansehen:

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-name=root-sync" \
    --container reconciler

Führen Sie den folgenden Befehl aus, um nach bestimmten RepoSync-Abgleichern zu filtern:

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-namespace=NAMESPACE" \
    --container reconciler

Ersetzen Sie NAMESPACE durch den Namespace, in dem Sie die Namespace-bezogene „Source of Truth“ erstellt haben.

Wenn in den Ergebnissen KNV2005 angezeigt wird, gibt es einen Controllerkonflikt.

Die folgende Fehlermeldung ist ein Beispiel für den Fehlertyp, der in Ihren Logs angezeigt werden kann:

KNV2005: detected excessive object updates, approximately 6 times per
minute. This may indicate Config Sync is fighting with another controller over
the object.

Controllerkonflikte untersuchen

Für weitere Informationen zu Controller-Konflikten verwenden Sie den folgenden Befehl, um die Aktualisierung der YAML-Datei der Ressource zu verfolgen:

 kubectl get RESOURCE OBJECT_NAME \
     --namespace NAMESPACE \
     --watch -o yaml

Ersetzen Sie Folgendes:

  • RESOURCE: die Art der Ressource, um die es einen Konflikt gibt.
  • OBJECT_NAME: der Name des Objekts, um das es einen Konflikt gibt.
  • NAMESPACE: der Namespace, in dem sich die Ressource befindet, um die es einen Konflikt gibt.

In den Logergebnissen werden die Ressource, der Objektname und der Namespace angegeben, die Sie hinzufügen müssen.

Dieser Befehl gibt einen Stream des Status der Ressource zurück, nachdem Updates auf den API-Server angewendet wurden. Verwenden Sie ein Tool zum Dateivergleich, um die Ausgabe zu vergleichen.

Controllerkonflikte beheben

Es gibt mehrere Möglichkeiten, Controllerkonflikte zu beheben. Wählen Sie die Option aus, die am besten zu Ihrer Config Sync-Einrichtung passt:

  • Aktualisieren Sie das Ressourcenmanifest in der Quelle, damit es mit dem Wert übereinstimmt, den der andere Controller wünscht.
  • Entfernen Sie das betreffende Feld aus der Quelle, damit der andere Controller es verwalten kann.
  • Deaktivieren oder deinstallieren Sie den anderen Controller.
  • Entfernen Sie die Ressource aus der Quelle und verwalten Sie sie manuell oder mit einem benutzerdefinierten Controller, der bestimmte Änderungen oder die gemeinsame Verwaltung toleriert.
  • Wenn Sie der Inhaber des Controllers sind, der den Ressourcenkonflikt verursacht, und sich das geänderte Feld nicht in der „Source of Truth“ befindet, aktualisieren Sie Ihren Controller so, dass er Patching anstelle von Aktualisierungen durchführt. Auf diese Weise wird die Änderung von Config Sync zugelassen und nicht rückgängig gemacht.

Es gibt auch einige Ressourcen, die zu anderen Controllern gehören sollten (Beispiel: Einige Operatoren installieren oder verwalten CRDs). Diese anderen Controller entfernen automatisch alle Config Sync-spezifischen Metadaten. Wenn eine andere Komponente in Ihrem Kubernetes-Cluster Config Sync-Metadaten entfernt, beenden Sie die Verwaltung der Ressource mit Config Sync. Weitere Informationen dazu finden Sie unter Verwaltung eines Objekts beenden.

Wenn Sie nicht möchten, dass Config Sync Änderungen an verwalteten Objekten im Cluster rückgängig macht, können Sie dem Objekt die Annotation client.lifecycle.config.k8s.io/mutation: ignore hinzufügen, bei dem Config Sync Mutationen ignorieren soll. Weitere Informationen dazu finden Sie unter Objektmutationen ignorieren.

Controllerkonflikte für implizite Namespaces beheben

Standardmäßig erstellt Config Sync einen impliziten Namespace, wenn ein RootSync ein Namespace-bezogenes Objekt verwaltet, der Namespace selbst aber noch nicht vorhanden ist. Wenn ein anderer Controller dann versucht, die Inhaberschaft für den Namespace zu übernehmen, kann es zu einem Controllerkonflikt mit Config Sync kommen. Sie können bestätigen, dass ein Namespace implizit erstellt wurde, wenn er nie im Root-Repository deklariert wurde und der Live-Namespace die Annotation zum Schutz vor Löschunghat.

Es gibt mehrere Möglichkeiten, Konflikte um einen impliziten Namespace zu beheben. Wählen Sie die Option aus, die am besten zu Ihrer Config Sync-Einrichtung passt:

Nächste Schritte

  • Wenn weiterhin Probleme auftreten, prüfen Sie, ob es sich bei Ihrem Problem um ein bekanntes Problem handelt.

  • Wenn Sie in der Dokumentation keine Lösung für Ihr Problem finden, erhalten Sie unter Support erhalten weitere Hilfe, einschließlich Ratschlägen zu den folgenden Themen: