Kubernetes 准入控制基础

1. Admission Webhook 工作原理

Admission Webhook 是 Kubernetes API Server 在对象持久化之前调用的 HTTP 回调机制。它允许外部服务拦截并修改(Mutating)或验证(Validating)资源请求,是实现策略引擎(如 OPA/Kyverno)的核心集成点。

核心流程:API Server 在认证、授权完成后,将 AdmissionReview 请求发送至 Webhook 服务;Webhook 返回 AdmissionResponse,包含是否允许以及(仅 Mutating)补丁内容。
Admission Webhook 请求处理流程 用户/kubectl API Server Mutating Webhook Validating Webhook etcd 请求 AdmissionReview 补丁/允许 AdmissionReview 允许/拒绝 持久化 关键说明: • Mutating Webhook 先于 Validating Webhook 执行,且按 failurePolicy 决定是否阻塞。 • 每个 Webhook 可配置 matchPolicy、namespaceSelector、objectSelector 等过滤规则。

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 配置与 API Server 交互关系 API Server Webhook 配置 Webhook Service 读取 路由 AdmissionReview 请求 配置变更后,API Server 自动热加载,无需重启。Webhook 服务必须使用 TLS 证书与 API Server 建立信任。
常见陷阱:
  • Webhook 配置中的 caBundle 必须与 Webhook 服务使用的 TLS 证书匹配,否则 API Server 无法建立连接。
  • timeoutSeconds 设置过短(如 1s)可能导致策略执行超时,触发 failurePolicy 拒绝合法请求。
  • Mutating Webhook 必须幂等,否则多次调用可能导致资源状态不一致。