管理多個 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 會在資源中新增兩個標籤:
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 紀元時間為準。
如果下列任一條件為真,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 無法管理的衝突。