【kube-apiserver】Mutating / Validating Webhook:timeout、failurePolicy 与可用性门

💡 原文中文,约7200字,阅读约需17分钟。
📝

内容提要

本文介绍Kubernetes v1.30.3中Admission Webhook的生产配置与故障排查。核心要点:Mutating Webhook串行执行可修改对象,Validating Webhook并行执行仅校验;timeoutSeconds默认10秒,failurePolicy决定超时后拒绝或放行;生产需配置副本、namespaceSelector避免自锁,并确保幂等性。CEL ValidatingAdmissionPolicy作为无外部依赖的替代方案,适合纯校验场景。排障时关注webhook延迟指标,而非etcd。

🔎

延伸解读

延迟排查:先看 Admission 轴,再查 etcd

当创建 Pod 耗时较长时,常见误区是直接怀疑 etcd。但本文指出,如果 etcd_request_duration_seconds 正常,而 apiserver_request_duration_seconds 的 CREATE 请求延迟高,问题很可能出在 Admission 轴。此时应重点检查 apiserver_admission_webhook_latency_seconds 指标,定位具体是哪个 webhook 拖慢了请求。

failurePolicy 的取舍:安全性与可用性的平衡

failurePolicy 默认是 Fail,即 webhook 超时或不可用时拒绝请求,这保证了安全性,但可能造成全局阻塞。如果设置为 Ignore,则放行请求,但可能绕过校验。生产环境需根据业务对安全性和可用性的要求权衡。对于关键校验,建议保持 Fail,但必须确保 webhook 的高可用,例如多副本和反亲和性。

避免自锁:namespaceSelector 的实践

当 webhook 的 failurePolicy 为 Fail 时,如果 webhook 自身所在的命名空间(如 kube-system)也被其规则匹配,一旦 webhook 故障,apiserver 将无法在该命名空间创建任何资源,包括重建 webhook 的 Pod,形成自锁。因此,必须使用 namespaceSelector 排除 webhook 自身所在的命名空间,这是生产环境的关键配置。

CEL VAP 与 Webhook 的适用边界

CEL ValidatingAdmissionPolicy 在 v1.30 中成为 stable,它在 apiserver 进程内执行,无外部依赖,延迟低,适合纯校验场景。但它的自定义逻辑受限于 CEL 表达式,无法访问外部 API 或数据库。如果需要外部数据或修改对象,仍需使用 Webhook。理解这一边界有助于选择合适的技术方案。

Q&A

Kubernetes中Mutating Webhook和Validating Webhook有什么区别?

Mutating Webhook可以修改对象,串行执行,每个webhook看到的是前一个修改后的对象;Validating Webhook不能修改对象,并行执行,任一拒绝则整个请求被拒绝。

Kubernetes webhook的timeoutSeconds默认值是多少?超时后会发生什么?

timeoutSeconds默认值为10秒,最大30秒。超时后根据failurePolicy决定:若为Fail则拒绝请求,若为Ignore则放行。

如何避免webhook故障导致集群自锁?

使用namespaceSelector排除webhook自身所在的namespace(如kube-system),并确保webhook有至少2个副本且分散在不同节点,避免单点故障。

CEL ValidatingAdmissionPolicy相比ValidatingWebhook有什么优势?

CEL ValidatingAdmissionPolicy在apiserver进程内执行,无外部依赖,延迟微秒级,适合纯校验场景;而ValidatingWebhook需要外部HTTPS调用,依赖网络和服务可用性。

创建Pod耗时12秒,但etcd指标正常,可能是什么原因?

可能是webhook调用慢导致。应检查apiserver_request_duration_seconds和apiserver_admission_webhook_latency_seconds指标,定位具体webhook的延迟。

reinvocationPolicy是什么?为什么需要幂等性?

reinvocationPolicy是Mutating Webhook的字段,默认Never,若设为IfNeeded,当后续webhook修改对象时,apiserver可能重新调用该webhook。因此webhook必须幂等,否则可能重复注入sidecar等。

webhook的sideEffects字段有什么作用?

sideEffects必须声明,None或NoneOnDryRun表示无副作用,dry-run时跳过调用;Some或Unknown表示有外部副作用,dry-run时也会调用。生产配置缺失sideEffects: None是常见问题。

🏷️

标签

➡️

继续阅读