管理多個 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-id
ConfigMap。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 無法管理。