调试 Webhook
运行 kubectl 命令时,您会看到类似于以下示例的错误消息。
Error from server (InternalError): error when creating "testjob.yaml": Internal error occurred: failed calling webhook "mywebhook.test.io": Post https://admission-webhook.default.svc:443/validate?timeout=30s: dial tcp 172.21.189.228:443: connect: connection timed out
error creating namespace "test": Internal error occurred: admission plugin "MutatingAdmissionWebhook" failed to complete mutation in 13s
失败的 Webhook 还可能导致类似以下问题的问题。
- 无法创建或修改 pod,私钥或名称空间。
- 无法将工作程序节点添加到集群或创建保存 LUKS 加密密钥的私钥。
- 无法修补,更新或升级,底层故障与在集群中创建资源相关。
被调用服务或安全隧道中的问题可能导致请求因超时而失败。 在发生此情况之前,您可能不知道已安装了许可控制 Webhook。
许可控制 Webhook 提供验证,修改或更改 Kubernetes API 请求的能力。 这些 Webhook 是从集群 apiserver
或 openshift-apiserver
调用的,通常调用在集群中运行的服务。 准入控制网络钩子有定义 pod、命名空间等资源类型的规则,以及创建、检索、更新、删除(CRUD)等操作的调用规则。
Webhook 具有故障策略,用于指示 Kubernetes 在调用 Webhook 时是否可以忽略连接错误,或者连接错误是否必须使操作失败。 当 MutatingWebhookConfiguration
资源在处理请求数据之前修改请求数据时,ValidatingWebhookConfiguration
资源会检查该请求。
Webhook 还可以在正常操作过程中拒绝请求: Webhook 可能拒绝违反安全策略的请求,也可能执行其他数据验证。 在此类情况下,故障信息包含 denied the request
响应,其中包含指示问题的原因。
admission webhook "mutate.configuration.upsert.appconnect.ibm.com" denied the request: version is not supported
在 IBM Cloud Kubernetes Service中,通过使用将 IBM Cloud 帐户中的集群控制平面连接到客户帐户中的集群工作程序节点的安全隧道来调用集群中运行的服务的 Webhook。
请完成以下步骤以识别导致问题的 Webhook。 然后调试相关服务,并在需要时除去或重新创建 Webhook。
-
运行以下命令以获取 VPN pod 日志。 如果无法获取 VPN 日志,请遵循 调试常见 CLI 问题 的步骤,并在能够检索日志时返回到此页面。 如果命令成功并且您可以获取日志,那么 VPN 隧道正在工作,您可以继续执行下一步。
kubectl get pods -n kube-system -l app=vpn
kubectl logs -n kube-system -l app=vpn
-
描述许可控制 Webhook 并将输出保存到名为
webhooks.txt
的文件中。kubectl describe mutatingwebhookconfigurations,validatingwebhookconfigurations > webhooks.txt
-
查看
webhooks.txt
文件以获取错误消息。 来自应用程序 (包括 kubectl) 的 Webhook 相关错误消息可帮助识别 Webhook。 -
查看拒绝类型,计数和拒绝代码的 apiserver 度量。 您可以使用以下命令获取度量的快照。
kubectl get --raw /metrics | grep apiserver_admission_webhook_rejection_count
apiserver_admission_webhook_rejection_count{error_type="calling_webhook_error",name="check-ignore-label.gatekeeper.sh",operation="UPDATE",rejection_code="0",type="validating"} 16
rejection_code
值 0 指示调用 Webhook 时发生错误。 非零rejection_code
值指示 Webhook 已拒绝请求。有 3 个 apiserver 实例。 kubectl 命令从其中一个获取度量值,并反映其中的活动。 每个 apiserver 返回不同的数据。 未处理失败请求的实例可能不会返回此度量值。
-
查看先前步骤的命令输出,并查找 Webhook 描述以识别特定
MutatingWebhookConfiguration
或ValidatingWebhookConfiguration
值。 如果错误,日志或度量值无济于事,请查看先前检索到的 Webhook 描述。 每个 Webhook 配置都有一组规则,用于指定调用 Webhook 的资源和操作的类型。 此信息可用于标识可能涉及的 Webhook。-
如果调用 Webhook 时发生错误,请查看该服务的文档以了解特定于产品的调试步骤。
-
如果 Webhook 拒绝请求,请查看 Webhook 的策略和配置选项。 可以调整它们以允许请求。 或者,请求可能违反策略,需要更改请求或发出请求的应用程序。 有关更多信息,请参阅 使用 Webhook 的最佳实践。
-
查看 Webhook 正在调用的服务
- 获取服务及其端点的详细信息。
kubectl get svc NAME -n NAMESPACE
kubectl get ep NAME -n NAMESPACE
-
如果 Webhook 正在调用不存在的服务,那么 Webhook 可能是由于未完成或未正确除去应用程序而留下的。 在这种情况下,请查找特定于服务的文档,并执行卸载服务的步骤。
-
如果无法卸载服务,请删除 Webhook 配置。
kubectl delete validatingwebhookconfiguration NAME
kubectl delete mutatingwebhookconfiguration NAME
-
- 如果该服务存在,但没有端点,请检查 pod 的运行状况。 首先,从服务获取 pod 标签。
示例输出kubectl describe svc NAME -n NAMESPACE
Selector: app=my-webhook
- 列出使用标签的 pod。 例如,以下命令中的标签为
app=mywebhook
。kubectl get pods -n NAMESPACE -l app=my-webhook
- 查看命令输出。 如果 pod 运行状况不佳,请检查 pod 事件,日志,工作程序节点运行状况和其他组件以进行故障诊断。 有关更多信息,请参阅 调试应用程序部署。
禁用或除去 Webhook
-
通过将故障策略设置为
Ignore
来临时忽略连接和超时。 运行以下命令编辑网络钩子。kubectl edit validatingwebhookconfiguration NAME
kubectl edit mutatingwebhookconfiguration NAME
-
搜索
failurePolicy
并将值更改为Ignore
。 -
保存配置并退出编辑器。 如果调整故障策略无法解决此问题,请重复上述步骤并将值更改回
Fail
。 -
临时除去 Webhook。 将现有 Webhook 配置保存到文件中,然后再将其删除。
kubectl get validatingwebhookconfiguration NAME -o yaml > webhook-config.yaml
kubectl get mutatingwebhookconfiguration NAME -o yaml > webhook-config.yaml
-
删除 Webhook 配置。
kubectl delete validatingwebhookconfiguration NAME
kubectl delete mutatingwebhookconfiguration NAME
-
请等待几分钟,然后重试未能查看问题是否已解决的
kubectl
命令。 -
重新创建 Webhook。
kubectl apply -f webhook-config.yaml
-
如果问题仍然存在,请联系支持团队。 打开 支持案例。 在案例详细信息中,请确保包含任何相关日志文件,错误消息或命令输出。