本页面介绍如何解决 Google Distributed Cloud 中有问题或不安全的 webhook 的相关问题。
如果您需要其他帮助,请与 Cloud Customer Care 联系。有问题的 webhook 的类型
准入 webhook(即 Kubernetes 中的 webhook)是一种准入控制器,可在 Kubernetes 集群中使用它来在保留对控制平面的请求之前验证或更改请求。第三方应用通常使用在系统关键资源和命名空间上运行的网络钩子。错误配置的网络钩子可能会影响控制平面性能和可靠性。例如,第三方应用创建的错误配置的 webhook 可能会阻止 Google Distributed Cloud 在托管式 kube-system
命名空间中创建和修改资源,这可能会影响集群的功能。
有问题的 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 的名称。
- 将 SERVICE_NAMESPACE 替换为命名空间的名称。
如果您找不到 webhook 中列出的 Service 名称,则端点不可用可能是由于配置中列出的名称与 Service 的实际名称不一致所导致的。如需修复端点可用性,请更新网络钩子配置中的服务名称以匹配正确的服务对象。
检查此 Service 的服务 Pod。通过列出 Deployment 来识别哪些 Pod 未在运行:
kubectl get deployment -n SERVICE_NAMESPACE
或者,运行以下命令以列出 Pod:
kubectl get pods -n SERVICE_NAMESPACE -o wide
对于任何未在运行的 Pod,请检查 Pod 日志以了解 Pod 未在运行的原因。
被视为不安全的网络钩子
如果 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
。