2. Webhook 架构:Server 设计、TLS 证书与配置资源

准入控制 Webhook 的核心是 API Server 在持久化资源对象之前,向外部 HTTPS 服务发送准入请求,并根据响应决定是否允许该操作。本章深入剖析 Webhook Server 的架构设计、TLS 证书配置以及两种关键的配置资源:MutatingWebhookConfiguration 与 ValidatingWebhookConfiguration。

2.1 Webhook Server 架构设计

Webhook Server 本质上是一个标准的 HTTPS 服务,接收来自 API Server 的 AdmissionReview 请求,处理后返回 AdmissionReview 响应。其架构通常包含以下核心组件:

  • TLS 终端层:负责与 API Server 建立双向 TLS 连接,验证客户端证书,确保通信安全。
  • 请求路由与反序列化:接收 HTTP POST 请求,解析 Content-Type(通常为 application/json 或 application/yaml),将请求体反序列化为 AdmissionReview 对象。
  • 准入逻辑引擎:根据 AdmissionReview.Request 中的 Kind、Namespace、Operation、Object 等信息,执行自定义的校验或变更逻辑。
  • 响应构造器:生成 AdmissionReview.Response,包含 Allowed(布尔值)、Patch(仅 Mutating)、Status(错误信息)等字段。
  • 并发与限流:使用 Goroutine 池或异步队列处理请求,防止高并发下资源耗尽。
架构要点: Webhook Server 应设计为无状态服务,以便水平扩展。所有准入逻辑应幂等,避免因重试导致副作用。
Webhook Server 内部架构与请求处理流程 API Server TLS 终端层 反序列化 准入逻辑引擎 响应构造器 API Server 并发与限流 (Goroutine Pool) 设计要点: • 无状态设计,支持水平扩展 • 准入逻辑必须幂等 • 响应超时时间应小于 30s(默认 10s)

2.2 TLS 证书配置

API Server 与 Webhook Server 之间的通信必须使用 TLS。Kubernetes 要求 Webhook Server 提供由受信任 CA 签发的证书,或者使用 API Server 内置的 CA 签发自签名证书。常见的配置方式有两种:

配置方式 证书来源 适用场景 注意事项
自签名证书 使用 Kubernetes CA 签发 集群内部 Webhook 需将 CA 证书注入 Webhook 配置的 caBundle 字段
公共 CA 证书 Let's Encrypt 等公共 CA 外部 Webhook 服务 需确保域名可解析,证书自动续期
cert-manager 自动签发与管理 生产环境推荐 需部署 cert-manager 组件,配置 Issuer 与 Certificate
最佳实践: 使用 cert-manager 自动管理 TLS 证书,结合 kubelet-serving-ca 或自定义 CA,实现证书的自动签发、续期与轮换,避免手动管理证书过期问题。

证书配置的关键步骤:

  1. 生成 CA 私钥与证书(或使用集群已有 CA)。
  2. 为 Webhook Server 生成私钥与证书签名请求(CSR)。
  3. 使用 CA 签署证书,得到服务端证书。
  4. 将服务端证书与私钥挂载到 Webhook Server Pod 中。
  5. 将 CA 证书 Base64 编码后填入 MutatingWebhookConfiguration 或 ValidatingWebhookConfiguration 的 clientConfig.caBundle 字段。

2.3 Webhook 配置资源

Kubernetes 通过两种 API 资源来注册 Webhook:MutatingWebhookConfiguration(变更准入)与 ValidatingWebhookConfiguration(校验准入)。两者结构相似,但 MutatingWebhookConfiguration 允许返回 JSON Patch 修改资源对象。

2.3.1 MutatingWebhookConfiguration

用于注册变更 Webhook,在资源持久化之前修改资源对象。典型用途包括:注入 Sidecar、设置默认值、添加标签/注解。

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: example-mutating-webhook
webhooks:
- name: mutate.example.com
  clientConfig:
    service:
      name: webhook-service
      namespace: default
      path: /mutate
    caBundle: LS0tLS1CRUdJTiBDRV...  # Base64 编码的 CA 证书
  rules:
  - operations: ["CREATE", "UPDATE"]
    apiGroups: ["apps"]
    apiVersions: ["v1"]
    resources: ["deployments"]
    scope: "Namespaced"
  admissionReviewVersions: ["v1"]
  sideEffects: None
  timeoutSeconds: 10
  reinvocationPolicy: IfNeeded

2.3.2 ValidatingWebhookConfiguration

用于注册校验 Webhook,在资源持久化之前验证资源对象是否符合预期。典型用途包括:资源配额校验、安全策略检查、命名规范验证。

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: example-validating-webhook
webhooks:
- name: validate.example.com
  clientConfig:
    service:
      name: webhook-service
      namespace: default
      path: /validate
    caBundle: LS0tLS1CRUdJTiBDRV...
  rules:
  - operations: ["CREATE", "UPDATE", "DELETE"]
    apiGroups: [""]
    apiVersions: ["v1"]
    resources: ["pods"]
    scope: "Namespaced"
  admissionReviewVersions: ["v1"]
  sideEffects: None
  timeoutSeconds: 5
  failurePolicy: Fail

2.3.3 关键字段对比

字段 说明 Mutating Validating
clientConfig Webhook 服务地址与 CA 证书 必填 必填
rules 匹配资源规则(操作、组、版本、资源、作用域) 必填 必填
admissionReviewVersions 支持的 AdmissionReview 版本 必填 必填
sideEffects 副作用声明(None / Some / NoneOnDryRun) 必填 必填
timeoutSeconds 请求超时时间(1-30s) 可选 可选
reinvocationPolicy 是否允许再次调用(IfNeeded / Never) 可选 不适用
failurePolicy Webhook 不可用时的处理策略(Fail / Ignore) 可选 可选
matchPolicy 匹配策略(Exact / Equivalent) 可选 可选
namespaceSelector 按命名空间标签过滤 可选 可选
objectSelector 按对象标签过滤 可选 可选
Mutating vs Validating Webhook 配置资源对比 MutatingWebhookConfiguration 核心特性: • 可修改资源对象(JSON Patch) • 支持 reinvocationPolicy • 常用于注入 Sidecar、设置默认值 典型字段: • clientConfig.service.path: /mutate • reinvocationPolicy: IfNeeded • sideEffects: None ValidatingWebhookConfiguration 核心特性: • 只读校验,不可修改资源 • 不支持 reinvocationPolicy • 常用于配额、安全策略校验 典型字段: • clientConfig.service.path: /validate • failurePolicy: Fail • timeoutSeconds: 5 对比
重要提醒: 如果同时配置了 Mutating 和 Validating Webhook,Kubernetes 会先执行所有 Mutating Webhook,再执行 Validating Webhook。因此,Validating Webhook 看到的是经过所有变更后的最终资源对象。务必确保 Validating 逻辑与 Mutating 逻辑一致,避免出现“变更后校验失败”的死循环。