排查 GKE on Azure webhook 问题

本页面介绍如何解决 GKE on Azure 中有问题或不安全的 webhook。

如果您需要其他帮助,请与 Cloud Customer Care 联系。

有问题的 webhook 的类型

准入 webhook(即 Kubernetes 中的 webhook)是一种准入控制器,可用于 Kubernetes 集群中,以便在请求保留之前验证或更改对控制平面的请求。第三方应用通常使用在系统关键资源和命名空间上运行的网络钩子。错误配置的网络钩子可能会影响控制平面性能和可靠性。例如,如果第三方应用创建的 webhook 配置有误,则可能会阻止 GKE on Azure 在代管式 kube-system 命名空间中创建和修改资源,这可能会降低集群的功能。

有问题的 webhook 包括以下几种类型:

没有可用端点的 webhook

如果 webhook 没有可用端点,则支持 webhook 端点的 Service 具有一个或多个未运行的 Pod。如需使 webhook 端点可用,请按照以下说明查找支持此 webhook 端点的 Service 的 Pod 并对其进行问题排查:

  1. 查找与 webhook 关联的 Service 的服务 Pod。运行以下命令来描述 Service:

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    替换以下内容:

    • SERVICE_NAME 替换为 Service 的名称。
    • SERVICE_NAMESPACE 替换为命名空间的名称。

    如果在 webhook 中找不到 Service 名称,则不可用的端点可能是由于配置中列出的名称与 Service 的实际名称不匹配。如需修复端点可用性,请更新网络钩子配置中的服务名称以匹配正确的服务对象。

  2. 检查此服务的服务 Pod。通过列出 Deployment 来确定哪些 Pod 未运行:

    kubectl get deployment -n SERVICE_NAMESPACE
    

    或者,运行以下命令列出 Pod:

    kubectl get pods -n SERVICE_NAMESPACE -o wide
    

    对于任何未运行的 Pod,请检查 Pod 日志,以了解 Pod 未运行的原因。

被视为不安全的网络钩子

如果 webhook 拦截了系统管理的命名空间中的任何资源,我们建议您更新 webhook,以避免拦截这些资源。

  1. 检查 webhook 配置。运行以下 kubectl 命令以获取 webhook 配置:

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

    CONFIGURATION_NAME 替换为 webhook 配置的名称。

    如果此命令未返回任何内容,请再次运行该命令,将 validatingwebhookconfigurations 替换为 mutatingwebhookconfigurations

    输出的 webhooks 部分中列出了一个或多个网络钩子。

  2. 根据网络钩子被视为不安全的原因,修改配置:

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

    如果 scope*,或者范围为 Namespaced 且满足以下任一条件,则网络钩子会被视为不安全:

    • operator 条件为 NotInvalues 省略了 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 条件为 Invalues 包含 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 列在资源下,则网络钩子也被视为不安全,如以下示例所示:

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

    从资源部分中移除 nodestokenreviewssubjectaccessreviewscertificatesigningrequests

后续步骤

如果您需要其他帮助,请与 Cloud Customer Care 联系。