本頁說明如何解決控制器衝突問題。這類爭議會耗用大量資源,並可能導致效能降低。 控制器爭用也稱為「資源爭用」。
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 忽略突變的物件。如要瞭解如何執行這項操作,請參閱「忽略物件突變」。
後續步驟
如果問題仍未解決,請查看您的問題是否為已知問題。
如果無法在文件中找到問題的解決方案,請參閱「取得支援」一文,瞭解如何取得進一步協助,包括下列主題的建議:
- 與 Cloud 客戶服務聯絡,建立支援案件。
- 在 StackOverflow 上提問,向社群尋求支援。如果您使用 kpt 或 Kustomize,請使用
kpt
或kustomize
標記搜尋類似問題。 - 使用 GitHub 上的公開 Issue Tracker 回報錯誤或提出功能要求。