Config Sync 可防止設定偏移,確保叢集資源與中央可靠資料來源保持一致。根據預設,Config Sync 內建的自我修復功能會自動偵測並還原偏差,對叢集效能的影響極小。
如果環境需要在叢集套用不一致的變更前,先封鎖這些變更,您可以啟用 Config Sync 許可 Webhook,防止發生偏差。這個 Webhook 會增加記憶體負擔,並可能導致記憶體不足 (OOM) 錯誤,因此在大多數情況下,請使用內建的自我修復功能。
不建議使用漂移防護功能的原因
准入 Webhook 需要 Config Sync 載入 Kubernetes OpenAPI 結構定義,才能驗證要求。如果叢集含有大量資源或 CustomResourceDefinition,這項結構定義處理作業可能會超出記憶體限制,導致元件故障。在大多數情況下,Config Sync 內建的自我修復功能可提供偏移防護,且不會有 Webhook 的穩定性風險。內建自我修復功能無法停用。
啟用後,偏移防護機制預設會保護 RootSync 物件。您可以設定這項功能,保護 RepoSync 物件。如要使用防範偏移功能,必須啟用 RootSync 和 RepoSync API。詳情請參閱「RootSync 和 RepoSync 欄位」。
事前準備
如果您先前已安裝 Google Cloud CLI,請執行 gcloud components update 指令,取得最新版本。
啟用防範偏移功能
您可以使用 gcloud CLI 啟用防範偏差功能。您無法在 Google Cloud 控制台啟用漂移防護功能。
如要啟用防範偏移功能,請完成下列步驟:
更新套用規格資訊清單,將
spec.configSync.preventDrift欄位設為true:applySpecVersion: 1 spec: configSync: enabled: true ... existing content ... preventDrift: true套用更新後的資訊清單:
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。
等待 ConfigManagement Operator 建立 Config Sync
ValidateWebhookConfiguration物件:kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io您會看到類似以下範例的輸出內容:
NAME WEBHOOKS AGE admission-webhook.configsync.gke.io 0 2m15s將新的變更提交至要同步的可靠資料來源,讓
root-reconciler部署作業能將 Webhook 新增至 Config Sync ValidatingWebhookConfiguration 物件。另一個方法是刪除root-reconcilier部署作業,觸發協調程序。新的root-reconcilerDeployment 會更新 Config Sync ValidatingWebhookConfiguration 物件。等待 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 設定。
如要停用防範偏移功能,請完成下列步驟:
更新套用規格資訊清單,將
spec.configSync.preventDrift欄位設為false:applySpecVersion: 1 spec: configSync: enabled: false ... existing content ... preventDrift: false套用更新後的資訊清單:
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 權限,您可能不需要執行這些步驟。
在根可靠來源中,宣告新的 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"]針對需要授予許可 Webhook 權限的每個命名空間範圍來源,宣告 ClusterRoleBinding 設定,授予許可 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替換為您建立命名空間範圍來源的命名空間。將變更修訂至根可靠資料來源,例如從 Git 存放區同步處理:
git add . git commit -m 'Providing namespace repository the permission to update the admission webhook.' git push如要驗證,請使用
kubectl get確認 ClusterRole 和 ClusterRoleBinding 已建立:kubectl get clusterrole admission-webhook-role kubectl get clusterrolebindings syncs-webhook
後續步驟
- 瞭解如何排解 Webhook 問題。