排解 GKE on Azure Webhook 問題
本頁說明如何解決 GKE on Azure 中有問題或不安全的 Webhook。
如需其他協助,請與 Cloud Customer Care 團隊聯絡。有問題的 Webhook 類型
許可 Webhook (或 Kubernetes 中的「Webhook」) 是一種許可控制器,可用於 Kubernetes 叢集,在要求持續存在之前,驗證或變更對控制層的要求。第三方應用程式通常會使用在系統重要資源和命名空間中運作的 Webhook。設定錯誤的 Webhook 可能會影響控制層的效能和穩定性。舉例來說,第三方應用程式建立的 Webhook 設定有誤,可能會導致 GKE on Azure 無法在受管理 kube-system
命名空間中建立及修改資源,進而降低叢集功能。
有問題的 Webhook 類型包括:
- Webhook 正在運作,但沒有可用端點。請按照操作說明檢查沒有可用端點的 Webhook。
Webhook 會對系統重要資源和命名空間執行作業,因此被視為不安全。
下列 webhook 不安全:
- 攔截
kube-system
命名空間中 Pod 和租約的 Webhook。 - 攔截
kube-node-lease
命名空間中租約的 Webhook。 - 攔截
Nodes
、TokenReviews
、SubjectAccessReviews
和CertificateSigningRequests
資源的 Webhook。
按照說明檢查被視為不安全的 Webhook。
- 攔截
沒有可用端點的 Webhook
如果 Webhook 沒有可用端點,表示支援 Webhook 端點的 Service 有一或多個 Pod 未執行。如要提供 Webhook 端點,請按照操作說明找出並排解支援這個 Webhook 端點的服務 Pod 問題:
找出與 Webhook 相關聯的 Service 的服務 Pod。執行下列指令來描述 Service:
kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
更改下列內容:
- SERVICE_NAME 改為服務名稱。
- 將 SERVICE_NAMESPACE 替換為命名空間的名稱。
如果找不到 webhook 中列出的服務名稱,可能是因為設定中列出的名稱與服務的實際名稱不符,導致端點無法使用。如要修正端點可用性,請更新 Webhook 設定中的服務名稱,使其與正確的服務物件相符。
檢查這項服務的服務 Pod。列出 Deployment,找出未執行的 Pod:
kubectl get deployment -n SERVICE_NAMESPACE
或者,執行下列指令列出 Pod:
kubectl get pods -n SERVICE_NAMESPACE -o wide
如果 Pod 未執行,請檢查 Pod 記錄,瞭解原因。
被視為不安全的 Webhook
如果 Webhook 攔截系統管理命名空間中的任何資源,建議您更新 Webhook,避免攔截這些資源。
檢查 Webhook 設定。執行下列
kubectl
指令,取得 Webhook 設定:kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
將 CONFIGURATION_NAME 替換為 Webhook 設定的名稱。
如果這項指令沒有傳回任何內容,請再次執行指令,並將
validatingwebhookconfigurations
替換為mutatingwebhookconfigurations
。輸出內容的
webhooks
區段會列出一或多個 Webhook。請根據系統判定 Webhook 不安全的原因,編輯設定:
排除 kube-system 和 kube-node-lease 命名空間
如果
scope
為*
,或範圍為Namespaced
且符合下列任一條件,Webhook 就會視為不安全:operator
條件為NotIn
,且values
會省略kube-system
和kube-node-lease
,如下列範例所示:webhooks: - admissionReviewVersions: ... namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: NotIn values: - blue-system # add 'kube-system' and 'kube-node-lease' if `NotIn` objectSelector: {} rules: - apiGroups: ... scope: '*' # 'Namespaced' sideEffects: None timeoutSeconds: 3
請務必將
scope
設為Namespaced
,而非*
,這樣網路鉤子只會在特定命名空間中運作。確認如果operator
為NotIn
,則kube-system
和kube-node-lease
會納入values
。operator
條件為In
,且values
包含kube-system
和kube-node-lease
,如下列範例所示:namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: In values: - blue-system - kube-system # remove as operator is `In` - kube-node-lease # remove as operator is `In`
請務必將
scope
設為Namespaced
,而非*
,這樣網路鉤子只會在特定命名空間中運作。確認如果operator
為In
,則kube-system
和kube-node-lease
不會納入values
。
排除相符資源
如果資源下方列出
nodes
、tokenreviews
、subjectaccessreviews
或certificatesigningrequests
,Webhook 也會視為不安全,如下列範例所示:- admissionReviewVersions: ... resources: - 'pods' # keep, remove everything else - 'nodes' - 'tokenreviews' - 'subjectacessreviews' - 'certificatesigningrequests' scope: '*' sideEffects: None timeoutSeconds: 3
從資源部分移除
nodes
、tokenreviews
、subjectaccessreviews
和certificatesigningrequests
。