避免設定偏移

Config Sync 提供兩種管理差異的方式:

  • 使用 Config Sync 的內建自我修復功能 (建議使用,不需設定): Config Sync 會自動偵測並還原漂移。 您無法停用 Config Sync 的自我修復功能。自我修復功能對效能的影響極小。
  • 啟用偏移防範功能 (本頁面):偏移防範功能會使用許可控制 webhook,封鎖衝突的變更。這項功能可能會導致記憶體用量過高和記憶體不足 (OOM) 錯誤,尤其是在有許多 CustomResourceDefinitions (CRD) 的叢集中。

准入 Webhook 需要 Config Sync 載入 Kubernetes OpenAPI 結構定義,才能驗證要求。在資源或 CRD 數量眾多的叢集中,這個架構處理程序可能會超出記憶體限制,導致元件故障。在大多數情況下,Config Sync 內建的自我修復功能可提供漂移防護,且不會像 Webhook 一樣有穩定性風險。

啟用後,偏移防護機制預設會保護 RootSync 物件。您可以設定這項功能來保護 RepoSync 物件。如要使用防止偏移功能,必須啟用 RootSyncRepoSync API

事前準備

如果您先前已安裝 Google Cloud CLI,請執行 gcloud components update 指令,取得最新版本。

啟用漂移防範功能

您可以使用 gcloud CLI 啟用防止漂移功能。您無法在 Cloud de Confiance 控制台中啟用防止漂移功能。

如要啟用漂移防護功能,請完成下列步驟:

  1. 更新 apply spec 資訊清單,將 spec.configSync.preventDrift 欄位設為 true

    applySpecVersion: 1
    spec:
      configSync:
        enabled: true
        ... existing content ...
        preventDrift: true
    
  2. 套用更新後的資訊清單:

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    更改下列內容:

    • MEMBERSHIP_NAME:您在註冊叢集時選擇的機群成員名稱。使用 gcloud container fleet memberships list 指令取得名稱。
    • MANIFEST_NAME:套用規格資訊清單的名稱,通常為 apply-spec.yaml
    • PROJECT_ID:您的專案 ID。
  3. 等待 ConfigManagement Operator 建立 Config Sync ValidateWebhookConfiguration 物件:

    kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
    

    您會看到類似以下範例的輸出內容:

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  4. 將新變更提交至要同步處理的單一事實來源,以便 root-reconciler Deployment 將 Webhook 新增至 Config Sync ValidatingWebhookConfiguration 物件。您也可以刪除 root-reconcilier Deployment 來觸發協調程序。新的 root-reconciler Deployment 會更新 Config Sync ValidatingWebhookConfiguration 物件。

  5. 等待 Webhook 伺服器準備就緒。Config Sync 准入 Webhook 部署記錄應包含 serving webhook server。這項作業可能需要幾分鐘才能完成。

    kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"
    

    您會看到類似以下範例的輸出內容:

    I1201 18:05:41.805531       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    I1201 18:07:04.626199       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    

停用偏移防範功能

停用防止偏移功能後,Config Sync 會刪除所有 Config Sync 許可控制 Webhook 資源。由於 Config Sync ValidatingWebhookConfiguration 物件已不存在,Config Sync 調解器不再為受管理資源產生 Webhook 設定。

如要停用漂移防護功能,請完成下列步驟:

  1. 更新 apply spec 資訊清單,將 spec.configSync.preventDrift 欄位設為 false

    applySpecVersion: 1
    spec:
      configSync:
        enabled: false
        ... existing content ...
        preventDrift: false
    
  2. 套用更新後的資訊清單:

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    更改下列內容:

    • MEMBERSHIP_NAME:您在註冊叢集時選擇的機群成員名稱。使用 gcloud container fleet memberships list 指令取得名稱。
    • MANIFEST_NAME:套用規格資訊清單的名稱,通常為 apply-spec.yaml
    • PROJECT_ID:您的專案 ID。

在命名空間範圍來源中啟用准入 Webhook

Webhook 無法完全保護命名空間範圍內的單一事實來源。每個命名空間來源的 Config Sync 調解器沒有權限讀取或更新叢集層級的 ValidatingWebhookConfiguration 物件。

缺少這項權限會導致命名空間調解器記錄發生錯誤,類似於下列範例:

Failed to update admission webhook: KNV2013: applying changes to
admission webhook: Insufficient permission. To fix, make sure the reconciler has
sufficient permissions.:
validatingwebhookconfigurations.admissionregistration.k8s.io "admission-
webhook.configsync.gke.io" is forbidden: User "system:serviceaccount:config-
management-system:ns-reconciler-NAMESPACE" cannot update resource
"validatingwebhookconfigurations" in API group "admissionregistration.k8s.io" at
the cluster scope

如果您不想為命名空間範圍的單一事實來源使用 Webhook 保護機制,可以忽略這項錯誤。不過,如果您想使用 Webhook,請在設定從多個單一資料來源同步處理後,為每個命名空間範圍的單一資料來源授予協調器權限。 如果 ns-reconciler-NAMESPACE 的 RoleBinding 已具備 ClusterRole cluster-admin 權限,您可能就不需要執行這些步驟。

  1. 在可靠來源的根層級中,宣告新的 ClusterRole 設定,授予 Config Sync 許可控制器 Webhook 權限。每個叢集只需定義一次這個 ClusterRole:

    # ROOT_SOURCE/cluster-roles/webhook-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: admission-webhook-role
    rules:
    - apiGroups: ["admissionregistration.k8s.io"]
      resources: ["validatingwebhookconfigurations"]
      resourceNames: ["admission-webhook.configsync.gke.io"]
      verbs: ["get", "update"]
    
  2. 針對每個需要授予許可的命名空間範圍來源,請宣告 ClusterRoleBinding 設定,授予許可給 Admission Webhook:

    # ROOT_SOURCE/NAMESPACE/sync-webhook-rolebinding.yaml
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: syncs-webhook
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-NAMESPACE
      namespace: config-management-system
    roleRef:
      kind: ClusterRole
      name: admission-webhook-role
      apiGroup: rbac.authorization.k8s.io
    

    NAMESPACE 替換為您建立命名空間範圍來源的命名空間。

  3. 將變更提交至根目錄可靠資料來源,例如從 Git 存放區同步處理時:

    git add .
    git commit -m 'Providing namespace repository the permission to update the admission webhook.'
    git push
    
    
  4. 如要驗證,請使用 kubectl get 確保已建立 ClusterRole 和 ClusterRoleBinding:

    kubectl get clusterrole admission-webhook-role
    kubectl get clusterrolebindings syncs-webhook
    

後續步驟