3. K8s Webhook 概述:Admission Webhook(Mutating & Validating)、Webhook 在 K8s 中的角色

Kubernetes 的 API 请求处理链路中,准入控制(Admission Control) 是资源持久化到 etcd 之前的最后一道防线。Admission Webhook 将这一环节从内置插件扩展为外部 HTTP 回调,使得平台团队可以在资源创建、更新、删除时注入自定义的校验与修改逻辑,是 K8s 平台化落地的核心扩展机制。

3.1 什么是 Admission Webhook

Admission Webhook 是一种 动态准入控制 机制。它允许集群管理员注册外部 HTTP 服务,当特定 API 请求到达 API Server 时,API Server 会向该服务发送 AdmissionReview 请求,并根据返回结果决定是否允许请求继续执行。

根据处理阶段的不同,Admission Webhook 分为两类:

类型 触发时机 核心能力 典型场景
MutatingAdmissionWebhook 在对象验证之前 修改(Patch)请求中的资源对象 注入 Sidecar、设置默认值、修正标签
ValidatingAdmissionWebhook 在对象验证阶段 校验资源对象,允许或拒绝请求 合规检查、资源配额校验、安全策略
执行顺序: 对于同一个 API 请求,Mutating Webhook 先于 Validating Webhook 执行。所有 Mutating Webhook 执行完毕后,API Server 会对最终对象进行校验,再调用 Validating Webhook。这种设计确保校验阶段看到的是经过所有修改后的最终版本。

3.2 Webhook 在 K8s 中的角色定位

在 Kubernetes 的整体架构中,Webhook 扮演着 策略执行网关 和 资源增强器 的双重角色。它位于 API Server 内部处理流程的关键节点上,与认证、授权、内置准入控制器共同构成完整的请求处理链。

K8s API 请求处理链路与 Webhook 位置 K8s API 请求处理链路与 Webhook 位置 客户端 认证 授权 Mutating Webhook Validating Webhook etcd Webhook 位于授权之后、etcd 持久化之前,是资源进入集群前的最后一道可编程关卡 Mutating Webhook 修改对象 → Validating Webhook 校验最终对象 → 通过后写入 etcd

3.3 Webhook 的核心工作流程

当客户端(kubectl、控制器、API 调用)向 API Server 发送资源请求时,Webhook 的介入遵循以下步骤:

  1. 请求到达 API Server:经过认证(Authentication)和授权(Authorization)后,进入准入控制阶段。
  2. 匹配 Webhook 规则:API Server 根据注册的 MutatingWebhookConfiguration 或 ValidatingWebhookConfiguration 中的 rules 字段,判断当前请求是否匹配该 Webhook 的生效范围(API 组、资源、操作类型)。
  3. 构造 AdmissionReview 请求:API Server 将请求中的资源对象封装为 AdmissionReview 对象,通过 HTTPS 发送给 Webhook 服务。
  4. Webhook 服务处理:外部服务解析 AdmissionReview,执行自定义逻辑(修改或校验),返回包含 allowed 和 patch 的 AdmissionReview 响应。
  5. API Server 执行决策:若 Webhook 返回 allowed: false,请求被拒绝;若为 Mutating Webhook,API Server 应用返回的 JSON Patch 修改对象。
  6. 继续后续处理:所有 Webhook 执行完毕后,进入内置准入控制器,最终将对象持久化到 etcd。
关键设计原则: Webhook 服务必须实现幂等性。由于网络故障或超时,API Server 可能重试请求,Webhook 服务应能正确处理重复的 AdmissionReview 请求,避免产生副作用。

3.4 Mutating 与 Validating 的协作模式

在实际平台落地中,Mutating 和 Validating Webhook 通常成对出现,形成 先修改、后校验 的协作模式。以下表格对比了二者的协作关系:

维度 MutatingAdmissionWebhook ValidatingAdmissionWebhook
执行顺序 先执行 后执行
对资源的影响 可修改资源字段 只读,不修改资源
响应内容 需返回 patch 和 patchType 只需返回 allowed 和可选的 status
失败策略 支持 Fail 或 Ignore 支持 Fail 或 Ignore
典型用途 注入 Sidecar、设置资源默认值、修正标签 校验资源命名规范、安全策略、配额限制
Mutating 与 Validating Webhook 协作流程 Mutating 与 Validating Webhook 协作流程 原始请求对象 Mutating Webhook 注入默认值 / Sidecar 修改后对象 Validating Webhook 校验最终对象 允许写入 etcd 拒绝 Mutating Webhook 先修改对象(如注入 Sidecar),Validating Webhook 再对修改后的完整对象进行校验 校验通过则写入 etcd,不通过则返回错误给客户端

3.5 Webhook 配置的核心字段

注册一个 Webhook 需要创建对应的配置资源。以下是 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 的核心字段说明:

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: "example-mutating-webhook"
webhooks:
- name: "sidecar-injector.example.com"
  clientConfig:
    service:
      name: webhook-service
      namespace: webhook-system
      path: "/mutate"
    caBundle: "LS0tLS1CRUdJTiBDRV...=="
  rules:
  - operations: ["CREATE"]
    apiGroups: [""]
    apiVersions: ["v1"]
    resources: ["pods"]
  admissionReviewVersions: ["v1"]
  sideEffects: None
  timeoutSeconds: 10
  reinvocationPolicy: IfNeeded
  failurePolicy: Fail
字段 说明 常见取值
clientConfig Webhook 服务的连接信息,包括 Service 引用或 URL,以及 CA 证书 Service 名称、命名空间、路径、Base64 编码的 CA 证书
rules 定义哪些 API 请求触发该 Webhook operations(CREATE/UPDATE/DELETE)、apiGroups、apiVersions、resources
failurePolicy Webhook 服务不可用时的处理策略 Fail(拒绝请求)或 Ignore(跳过 Webhook)
sideEffects 声明 Webhook 是否有副作用,影响重试行为 None、NoneOnDryRun
timeoutSeconds API Server 等待 Webhook 响应的超时时间 1-30 秒,推荐 10 秒以内
reinvocationPolicy 是否允许在后续 Mutating Webhook 执行后再次调用当前 Webhook Never 或 IfNeeded
安全注意事项: Webhook 通信必须使用 HTTPS,且 API Server 需要验证 Webhook 服务的 TLS 证书。caBundle 字段必须包含用于签发 Webhook 服务证书的 CA 公钥。生产环境中建议使用 cert-manager 自动管理证书轮换。

3.6 Webhook 在平台落地中的典型角色

在 K8s 平台化实践中,Webhook 承担着以下关键角色:

  • 策略执行者:强制实施命名规范、标签标准、资源配额限制、安全上下文约束等平台级策略。
  • 自动化注入器:自动为 Pod 注入 Sidecar 代理(如 Istio Envoy)、日志采集器(如 Fluent Bit)、监控指标暴露器。
  • 默认值提供者:为未显式设置的字段填充合理的默认值,降低用户使用复杂度。
  • 资源校验网关:在资源进入集群前拦截不合规的配置,避免错误配置导致集群不稳定。
  • 多租户隔离器:根据命名空间或标签,为不同租户的资源注入不同的配置或执行不同的校验规则。
平台落地建议: 建议将 Webhook 服务与集群生命周期管理工具(如 Helm、Kustomize)结合,通过 GitOps 方式管理 Webhook 配置。同时,为 Webhook 服务配置独立的监控告警(请求延迟、错误率、超时次数),确保 Webhook 自身的高可用性不会成为集群的故障点。