管理多個 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 會在資源中新增兩個標籤:
cnrm-lease-holder-id:Config Controller 會為每個命名空間產生專屬 ID,管理已啟用衝突防範功能的資源。這個專屬 ID 用於設定cnrm-lease-holder-id。如要查看命名空間對應至cnrm-lease-holder-id值的對應關係,可以查看cnrm-system命名空間中的namespace-idConfigMap。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 無法管理。