本頁面說明如何解決 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。
為避免再次發生錯誤,請先移除命名空間存放區,再移除命名空間。
後續步驟
如果問題仍未解決,請查看您的問題是否為已知問題。
如果無法在文件中找到問題的解決方案,請參閱「取得支援」一文,瞭解如何取得進一步協助,包括下列主題的建議:
- 與 Cloud 客戶服務聯絡,建立支援案件。
- 在 StackOverflow 上提問,向社群尋求支援。如果您使用 kpt 或 Kustomize,請使用
kpt
或kustomize
標記搜尋類似問題。 - 使用 GitHub 上的公開 Issue Tracker 回報錯誤或提出功能要求。