管理多個 Config Connector 資源的衝突


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

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

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

您可以在不同的命名空間中建立兩個 Config Connector 資源,用來管理相同的 Google Cloud 資源,但我們不建議這麼做。Config Connector 只能在能夠取得 Google Cloud 資源的租約,且已啟用衝突預防功能的情況下,管理相應的 Google Cloud 資源。

租用權的範圍為命名空間。為取得命名空間範圍的租約,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 紀元時間為準。

如果下列任一條件為真,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 無法管理的衝突。