Fehlerbehebung bei Controller-Konflikten

Auf dieser Seite wird gezeigt, wie Sie Probleme mit Controller-Konflikten 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, kann die Ressource zwischen den Statuswerten, die von den konkurrierenden Controllern gewünscht werden, wechseln. Ein Symptom dieses Verhaltens ist, dass die Felder metadata.generation und metadata.resourceVersion schnell zunehmen. Wenn ein verwaltetes Objekt mehr als fünfmal pro Minute aktualisiert wird, erkennt Config Sync den Kampf, protokolliert den Drift und meldet den Fehler im Objektstatus RootSync oder RepoSync. “

Config Sync hat eine spezielle Logik, um Konflikte zwischen mehreren RootSync- und RepoSync-Objekten zu erkennen. Wenn bei RepoSync-Objekten der Abgleicher feststellt, dass das Objekt bereits von einem anderen Abgleicher verwaltet wird, werden weitere Aktualisierungen übersprungen. 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.

Controller-Konflikte 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 nomos-Befehlszeilentool nicht installiert haben, können Sie die Logs für den RootSync-Abgleicher mit dem folgenden Befehl prüfen:

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-Abgleichen 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.

Controller-Konflikte 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, die den Konflikt verursacht.
  • OBJECT_NAME: der Name des Objekts, das den Konflikt verursacht.
  • NAMESPACE ist der Namespace, in dem sich die Ressource befindet, um die der Konflikt verursacht wird.

In den Logergebnissen sind die Ressource, der Objektnamen 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.

Controller-Konflikte auflösen

Es gibt mehrere Möglichkeiten, Controller-Konflikte zu lösen. Wählen Sie die Option aus, die für Ihre Config Sync-Einrichtung am besten geeignet ist:

  • Aktualisieren Sie das Ressourcenmanifest in der Quelle, damit es mit dem Wert übereinstimmt, den der andere Controller möchte.
  • 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 Ressourcenkonflikte verursacht, und das zu ändernde Feld nicht in der "Source of Truth" liegt, aktualisieren Sie den Controller, um Patches statt eines Updates auszuführen. 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.

Nächste Schritte

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