排查 Google Distributed Cloud webhook 问题

本页面介绍如何解决 Google Distributed Cloud 中有问题或不安全的 webhook 的相关问题。

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

有问题的 webhook 的类型

准入 webhook(即 Kubernetes 中的 webhook)是一种准入控制器,可在 Kubernetes 集群中使用它来在保留对控制平面的请求之前验证或更改请求。第三方应用通常使用在系统关键资源和命名空间上运行的网络钩子。错误配置的网络钩子可能会影响控制平面性能和可靠性。例如,第三方应用创建的错误配置的 webhook 可能会阻止 Google Distributed Cloud 在托管式 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 的名称。
    • SERVICE_NAMESPACE 替换为命名空间的名称。

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

  2. 检查此 Service 的服务 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 部分中列出了一个或多个 webhook。

  2. 根据 webhook 被视为不安全的原因,修改配置:

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

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

    • 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,webhook 也会被视为不安全,如以下示例所示:

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

    从资源部分中移除 nodestokenreviewssubjectaccessreviewscertificatesigningrequests

后续步骤

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