排解許可 Webhook 的問題

本頁面說明如何解決 Config Sync 許可控制 Webhook 的問題。如要進一步瞭解 Webhook,請參閱「防止設定漂移」。

排解 KNV 2009 錯誤

下列各節有助於解決 KNV2009 錯誤。

拒絕連線至 Admission Webhook

如果已啟用漂移防護功能,當調解器嘗試將設定套用至叢集時,您可能會收到下列錯誤:

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post "https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s": dial tcp 10.92.2.14:8676: connect: connection refused

這項錯誤表示准入 Webhook 尚未準備就緒或已變得不健全。這通常是暫時性錯誤,您可能會在啟動 Config Sync 時看到。

如果問題仍未解決,請說明准入 Webhook 部署作業,確認其 Pod 是否可排程且健康狀態良好:

kubectl describe deploy admission-webhook -n config-management-system

kubectl get pods -n config-management-system -l app=admission-webhook

如果 Deployment 的 Pod 運作正常,輸出內容會與下列內容類似:

Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
...
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
...

許可 Webhook 要求 I/O 逾時

如果調解器嘗試將設定套用至叢集時,您收到類似以下的錯誤,可能是防火牆封鎖了控制層網路的准入 Webhook 連接埠 8676

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s: dial tcp 10.1.1.186:8676: i/o timeout

如要解決這個問題,請新增防火牆規則,允許 Config Sync 許可控制器 Webhook 使用通訊埠 8676,防止設定漂移。控制層必須能連線至叢集節點上的 Webhook 後端,因此必須從控制層開啟通訊埠 8676 至節點。

Admission Webhook 拒絕要求

如果您嘗試對 Config Sync 管理的欄位套用變更時收到下列錯誤訊息,可能表示您進行了衝突的變更:

error: OBJECT could not be patched: admission webhook "v1.admission-webhook.configsync.gke.io"
denied the request: fields managed by Config Sync can not be modified

如果已啟用變異防護功能,當您在設定中宣告欄位,且存放區已同步至叢集時,Config Sync 會管理該欄位。您嘗試對該欄位進行的任何變更都是衝突變更。

舉例來說,如果存放區中的 Deployment 設定標籤為 environment:prod,而您嘗試將叢集中的標籤變更為 environment:dev,就會發生變更衝突,並收到上述錯誤訊息。不過,如果將新標籤 (例如 tier:frontend) 新增至 Deployment,就不會發生衝突。

如要讓 Config Sync 忽略物件的任何變更,可以新增「忽略物件突變」一節所述的註解。

無法刪除所有資源類型

卡在 Terminating 階段的命名空間具有下列條件:

    message: 'Failed to delete all resource types, 1 remaining: admission webhook
      "v1.admission-webhook.configsync.gke.io" denied the request: system:serviceaccount:kube-system:namespace-controller
      is not authorized to delete managed resource "_configmap_bookstore_cm1"'
    reason: ContentDeletionFailed
    status: "True"
    type: NamespaceDeletionContentFailure

當您嘗試從根存放區刪除 Namespace 物件,但命名空間下的部分物件仍由命名空間協調器主動管理時,就會發生這個錯誤。刪除命名空間時,命名空間控制器 (服務帳戶為 system:serviceaccount:kube-system:namespace-controller) 會嘗試刪除該命名空間中的所有物件。不過,Config Sync 許可控制 Webhook 只允許根命名空間或命名空間調解器刪除這些物件,並拒絕命名空間控制器刪除這些物件。

如要解決這個問題,請刪除 Config Sync 許可控制器 Webhook:

kubectl delete deployment.apps/admission-webhook -n config-management-system

ConfigManagement Operator 會重新建立 Config Sync 准入 Webhook。

如果這個解決方法無效,您可能需要重新安裝 Config Sync。

為避免再次發生錯誤,請先移除命名空間存放區,再移除命名空間。

後續步驟

  • 如果問題仍未解決,請查看您的問題是否為已知問題

  • 如果無法在文件中找到問題的解決方案,請參閱「取得支援」一文,瞭解如何取得進一步協助,包括下列主題的建議: