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 应设计为无状态服务,以便水平扩展。所有准入逻辑应幂等,避免因重试导致副作用。
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,实现证书的自动签发、续期与轮换,避免手动管理证书过期问题。
证书配置的关键步骤:
- 生成 CA 私钥与证书(或使用集群已有 CA)。
- 为 Webhook Server 生成私钥与证书签名请求(CSR)。
- 使用 CA 签署证书,得到服务端证书。
- 将服务端证书与私钥挂载到 Webhook Server Pod 中。
- 将 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 和 Validating Webhook,Kubernetes 会先执行所有 Mutating Webhook,再执行 Validating Webhook。因此,Validating Webhook 看到的是经过所有变更后的最终资源对象。务必确保 Validating 逻辑与 Mutating 逻辑一致,避免出现“变更后校验失败”的死循环。