Kubernetes 准入控制基础
1. Admission Webhook 工作原理
Admission Webhook 是 Kubernetes API Server 在对象持久化之前调用的 HTTP 回调机制。它允许外部服务拦截并修改(Mutating)或验证(Validating)资源请求,是实现策略引擎(如 OPA/Kyverno)的核心集成点。
核心流程:API Server 在认证、授权完成后,将 AdmissionReview 请求发送至 Webhook 服务;Webhook 返回 AdmissionResponse,包含是否允许以及(仅 Mutating)补丁内容。
2. Mutating 与 Validating Webhook 区别
| 对比维度 | Mutating Webhook | Validating Webhook |
|---|---|---|
| 执行顺序 | 先执行(在对象持久化之前) | 后执行(在 Mutating 之后) |
| 核心能力 | 修改资源请求(注入 sidecar、设置默认值) | 验证资源请求(拒绝不符合策略的请求) |
| 响应类型 | 返回 JSON Patch(RFC 6902)或允许 | 返回 allowed: true/false + 拒绝原因 |
| 幂等性要求 | 必须幂等(多次调用结果一致) | 无强制幂等要求 |
| 典型场景 | 注入 Istio sidecar、设置资源配额默认值 | 检查镜像来源、禁止特权容器、验证标签合规 |
| 失败策略 | failurePolicy: Ignore/Fail | failurePolicy: Ignore/Fail |
实践建议:在 OPA/Gatekeeper 场景中,Mutating Webhook 用于注入默认标签或注解,Validating Webhook 用于执行 Rego 策略的最终校验。两者配合可减少策略重复编写。
3. Webhook 配置示例
Webhook 通过 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration 资源注册。以下是一个完整的 Validating Webhook 配置示例:
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: "pod-policy-webhook.example.com"
webhooks:
- name: "pod-policy.example.com"
clientConfig:
service:
name: "webhook-service"
namespace: "webhook-system"
path: "/validate"
caBundle: "LS0tLS1CRUdJTiBDRV...==" # base64 编码的 CA 证书
rules:
- operations: ["CREATE", "UPDATE"]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
scope: "Namespaced"
failurePolicy: Fail
matchPolicy: Equivalent
sideEffects: None
admissionReviewVersions: ["v1"]
timeoutSeconds: 10
namespaceSelector:
matchExpressions:
- key: "kubernetes.io/metadata.name"
operator: NotIn
values: ["kube-system"]
配置字段说明:
- clientConfig.service:指向集群内 Webhook 服务的 DNS 名称和端口。
- rules:定义哪些操作、资源、API 组触发 Webhook。
- failurePolicy:Fail 表示 Webhook 不可用时拒绝请求;Ignore 表示跳过。
- sideEffects:声明 Webhook 是否有副作用,None 表示无副作用。
- timeoutSeconds:Webhook 超时时间,超过则按 failurePolicy 处理。
Mutating Webhook 配置结构与 Validating 相同,仅 kind 改为 MutatingWebhookConfiguration,且 clientConfig.service.path 指向不同的处理端点。
常见陷阱:
- Webhook 配置中的
caBundle必须与 Webhook 服务使用的 TLS 证书匹配,否则 API Server 无法建立连接。 timeoutSeconds设置过短(如 1s)可能导致策略执行超时,触发 failurePolicy 拒绝合法请求。- Mutating Webhook 必须幂等,否则多次调用可能导致资源状态不一致。