排解控制器衝突問題

本頁說明如何解決控制器衝突問題。這類爭議會耗用大量資源,並可能導致效能降低。控制器爭用也稱為「資源爭用」。

Config Sync 會監控叢集上套用的物件,並還原對真實來源中宣告的值所做的變更。如果這些變更是由其他控制者所做,資源可能會在競爭控制者想要的狀態之間來回切換。這種行為的徵兆之一是 metadata.generation 和 metadata.resourceVersion 欄位快速增加。因此,如果受管理物件每分鐘更新超過五次,Config Sync 會偵測到爭議、記錄漂移,並在 RootSync 或 RepoSync 物件狀態中回報錯誤。

Config Sync 具有特殊邏輯,可偵測多個 RootSync 和 RepoSync 物件之間的衝突。如果是 RepoSync 物件,如果協調器發現物件已由其他協調器管理,就會略過後續更新。如果是 RootSync 物件,調和器會嘗試採用設定要管理的任何物件,除非該物件是由另一個 RootSync 物件管理。這可避免 Config Sync 調解器彼此爭奪資源,並回報所有相關 RootSync 和 RepoSync 物件的狀態錯誤。

找出控制器衝突

您可以使用 nomos status 指令或檢查 RootSync 或 RepoSync 物件中的狀態欄位,查看爭議錯誤。

如果未安裝 nomos 指令列工具,可以執行下列指令,查看 RootSync 調解程式的記錄:

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

如要篩選特定 RepoSync 調解器,請執行下列指令:

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

將 NAMESPACE 替換為您建立命名空間範圍內單一事實來源的命名空間。

如果結果中顯示 KNV2005,表示有控制器衝突。

以下是您可能會在記錄中看到的錯誤訊息示例:

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

調查控制器衝突

如要進一步瞭解任何控制器爭用情形,請執行下列指令,監控資源的 YAML 檔案更新:

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

更改下列內容:

  • RESOURCE:爭奪的資源類型。
  • OBJECT_NAME:爭奪的物件名稱。
  • NAMESPACE:爭議資源所在的命名空間。

記錄結果會指定您需要新增的資源、物件名稱和命名空間。

這個指令會傳回資源狀態的串流,其中包含套用至 API 伺服器的更新。使用檔案比較工具比較輸出內容。

解決控制器衝突

解決控制器衝突的方法有很多種。請選擇最適合您 Config Sync 設定的選項:

  • 更新來源中的資源資訊清單,使其與其他控制器所需的值相符。
  • 從來源中移除有問題的欄位,讓其他控制器管理該欄位。
  • 停用或解除安裝其他控制器。
  • 從來源中移除資源,然後手動管理,或使用可容許特定變更或共同管理的自訂控制器管理。
  • 如果您擁有導致資源爭用的控制器,且要變更的欄位不在事實來源中,請更新控制器以執行修補作業,而非更新作業。這樣一來,Config Sync 就會允許變更,不會還原。

此外,有些資源應屬於其他控制器 (例如,部分運算子安裝或維護 CRD)。這些其他控制器會自動移除任何 Config Sync 專屬的中繼資料。如果 Kubernetes 叢集中的其他元件移除了 Config Sync 中繼資料,請停止透過 Config Sync 管理資源。如要瞭解如何停止管理代管物件,請參閱這篇文章。

或者,如果您不希望 Config Sync 將叢集中受管理物件的變更還原,可以將 client.lifecycle.config.k8s.io/mutation: ignore 註解新增至要讓 Config Sync 忽略變異的物件。如要瞭解如何執行這項操作,請參閱「忽略物件突變」。

解決隱含命名空間的控制器爭用問題

根據預設,如果 RootSync 管理命名空間物件,但命名空間本身尚不存在,Config Sync 會建立隱含命名空間。如果其他控制器嘗試取得命名空間的擁有權,可能會與 Config Sync 發生控制器爭奪戰。如果命名空間從未在根存放區中宣告,且即時命名空間具有防止刪除註解,您就可以確認命名空間是否已隱含建立。

解決隱含命名空間爭議的方法有很多種,請選擇最適合您 Config Sync 設定的選項:

  • 在 RootSync 物件上使用明確的命名空間策略。 這項策略可解決控制器爭用問題,並防止 Config Sync 建立額外的隱含命名空間。
  • 使用管理功能已停用註解,將命名空間新增至根存放區。 這項註解會告知 Config Sync 停止管理 Namespace,但仍允許 Config Sync 建立隱含命名空間。

後續步驟

  • 如果問題仍未解決,請查看您的問題是否為已知問題。

如果無法在文件中找到問題的解決方案, 請參閱「取得支援」一文,取得進一步的協助,包括下列主題的建議: