本页面介绍如何解决 Google Distributed Cloud Virtual for Bare Metal 中有问题或不安全的 webhook。
如果您需要其他帮助,请与 Cloud Customer Care 联系。有问题的 webhook 的类型
准入 webhook(即 Kubernetes 中的 webhook)是一种准入控制器,可用于 Kubernetes 集群中,以便在请求保留之前验证或更改对控制平面的请求。第三方应用通常使用在系统关键资源和命名空间上运行的网络钩子。错误配置的网络钩子可能会影响控制平面性能和可靠性。例如,如果第三方应用创建的 webhook 配置有误,则可能会阻止 Google Distributed Cloud Virtual for Bare Metal 在代管式 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 端点的 Service 的 Pod 并对其进行问题排查:
查找与 webhook 关联的 Service 的服务 Pod。运行以下命令来描述 Service:
kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
替换以下内容:
- 将 SERVICE_NAME 替换为 Service 的名称。
- 将 SERVICE_NAMESPACE 替换为命名空间的名称。
如果在 webhook 中找不到 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
部分中列出了一个或多个网络钩子。根据网络钩子被视为不安全的原因,修改配置:
排除 kube-system 和 kube-node-lease 命名空间
如果
scope
为*
,或者范围为Namespaced
且满足以下任一条件,则网络钩子会被视为不安全: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
列在资源下,则网络钩子也被视为不安全,如以下示例所示:- admissionReviewVersions: ... resources: - 'pods' # keep, remove everything else - 'nodes' - 'tokenreviews' - 'subjectacessreviews' - 'certificatesigningrequests' scope: '*' sideEffects: None timeoutSeconds: 3
从资源部分中移除
nodes
、tokenreviews
、subjectaccessreviews
和certificatesigningrequests
。