排解 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 端點的 Service 有一或多個 Pod 未執行。如要提供 Webhook 端點,請按照操作說明找出並排解支援這個 Webhook 端點的服務 Pod 問題:

  1. 找出與 Webhook 相關聯的 Service 的服務 Pod。執行下列指令來描述 Service:

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    更改下列內容:

    • SERVICE_NAME 改為服務名稱。
    • SERVICE_NAMESPACE 替換為命名空間的名稱。

    如果找不到 webhook 中列出的服務名稱,可能是因為設定中列出的名稱與服務的實際名稱不符,導致端點無法使用。如要修正端點可用性,請更新 Webhook 設定中的服務名稱,使其與正確的服務物件相符。

  2. 檢查這項服務的服務 Pod。列出 Deployment,找出未執行的 Pod:

    kubectl get deployment -n SERVICE_NAMESPACE
    

    或者,執行下列指令列出 Pod:

    kubectl get pods -n SERVICE_NAMESPACE -o wide
    

    如果 Pod 未執行,請檢查 Pod 記錄,瞭解原因。

被視為不安全的 Webhook

如果 Webhook 攔截系統管理命名空間中的任何資源,建議您更新 Webhook,避免攔截這些資源。

  1. 檢查 Webhook 設定。執行下列 kubectl 指令,取得 Webhook 設定:

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

    CONFIGURATION_NAME 替換為 Webhook 設定的名稱。

    如果這項指令沒有傳回任何內容,請再次執行指令,並將 validatingwebhookconfigurations 替換為 mutatingwebhookconfigurations

    輸出內容的 webhooks 區段會列出一或多個 Webhook。

  2. 請根據系統判定 Webhook 不安全的原因,編輯設定:

    排除 kube-system 和 kube-node-lease 命名空間

    如果 scope*,或範圍為 Namespaced 且符合下列任一條件,Webhook 就會視為不安全:

    • operator 條件為 NotIn,且 values 會省略 kube-systemkube-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,而非 *,這樣網路鉤子只會在特定命名空間中運作。確認如果 operatorNotIn,則 kube-systemkube-node-lease 會納入 values

    • operator 條件為 In,且 values 包含 kube-systemkube-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,而非 *,這樣網路鉤子只會在特定命名空間中運作。確認如果 operatorIn,則 kube-systemkube-node-lease 不會納入 values

    排除相符資源

    如果資源下方列出 nodestokenreviewssubjectaccessreviewscertificatesigningrequests,Webhook 也會視為不安全,如下列範例所示:

    - admissionReviewVersions:
    ...
        resources:
        - 'pods' # keep, remove everything else
        - 'nodes'
        - 'tokenreviews'
        - 'subjectacessreviews'
        - 'certificatesigningrequests'
        scope: '*'
      sideEffects: None
      timeoutSeconds: 3
    

    從資源部分移除 nodestokenreviewssubjectaccessreviewscertificatesigningrequests

後續步驟

如需其他協助,請與 Cloud Customer Care 聯絡。