排解控制器衝突問題

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

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

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

找出控制器衝突

您可以使用 nomos status 指令或檢查 RootSyncRepoSync 物件中的狀態欄位,查看對戰錯誤。

如果未安裝 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 忽略突變的物件。如要瞭解如何執行這項操作,請參閱「忽略物件突變」。

後續步驟

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

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