管理多個 Config Connector 資源的衝突

本頁面說明 Config Connector 如何處理衝突。如果多個資源管理同一個資源,就可能發生衝突。

Config Connector 會對應 Kubernetes 資源名稱、容器註解和區域/位置 (如適用) 的組合,藉此管理或取得資源。在最簡單的情況下,您可以使用 Google Cloud 專案來整理資源。

Google Cloud 支援專案以外的額外階層:資料夾、專案和機構。您可以使用註解,將資源對應至資料夾、專案和機構。使用 Config Connector 建立資源時,如果沒有註解,系統會在共用資源命名空間的專案中建立資源。

您可以在不同命名空間中建立兩個 Config Connector 資源,管理相同的 Google Cloud 資源,但我們不建議這麼做。只有在能夠取得資源的租約,且 Google Cloud Google Cloud 啟用衝突預防機制時,Config Connector 才會管理對應資源。

租約的範圍為命名空間。如要取得命名空間範圍的租約,Config Connector 會在資源中新增兩個標籤:

  1. cnrm-lease-holder-id:Config Controller 會為每個命名空間產生專屬 ID,管理已啟用衝突防範功能的資源。這個專屬 ID 用於設定 cnrm-lease-holder-id。如要查看命名空間對應至 cnrm-lease-holder-id 值的對應關係,可以查看 cnrm-system 命名空間中的 namespace-id ConfigMap。
  2. cnrm-lease-expiration:以 Unix Epoch 時間表示的到期時間。

如果符合下列任一條件,Config Connector 就能更新這些值:

  • cnrm-lease-holder-id 的值與命名空間的全域專屬 ID 相符。
  • cnrm-lease-holder-id 的值為空白或不存在。
  • cnrm-lease-expiration 的值是過去的時間。

當 Config Connector 執行個體取得資源的租約時,到期時間會設為 40 分鐘後。只要資源位於命名空間中,Config Connector 的相同執行個體就會保留管理權。如果剩餘時間不到 20 分鐘,Config Connector 會將到期時間延長 40 分鐘。

如果 Config Connector 無法取得特定資源的租約,資源的 kubectl describe 輸出內容會將狀態列為 ManagementConflict

修改衝突防範措施

您可以在資源中加入 cnrm.cloud.google.com/management-conflict-prevention-policy 註解,並使用下列其中一個值,控管衝突避免機制:

  • resource:如上一節所述,將適當的租約標籤儲存至資源,即可在資源層級避免管理衝突。
  • none:系統不會避免管理衝突。

預設值為 none

在下列範例中,預設 ComputeNetwork 的資訊清單使用 none 管理政策,表示系統不會防止衝突:

apiVersion: compute.cnrm.cloud.google.com/v1beta1
kind: ComputeNetwork
metadata:
 annotations:
   cnrm.cloud.google.com/management-conflict-prevention-policy: "none"
   cnrm.cloud.google.com/project-id: "PROJECT-ID"
   cnrm.cloud.google.com/deletion-policy: "abandon"
 name: default
spec:
 description: Default network for the project

限制

衝突預防功能有下列限制:

  • 如果資源不支援標籤,就無法防止衝突。即使將值從 none 變更為 resource,仍無法正常運作。

  • 如果您是使用 resourceID 欄位管理資源,則可以在相同命名空間下建立多個具有相同 Google Cloud 資源名稱的資源。這些資源會造成衝突,Config Connector 無法管理。