基于准入控制的策略即代码资源配额模型架构设计 - 第2节

Kubernetes 准入控制基础:Admission Controller 工作原理

Kubernetes 准入控制(Admission Control)是 API Server 请求链中一道关键的“门禁”。任何对集群资源进行创建、更新、删除的请求,在完成身份认证(Authentication)和授权(Authorization)之后、资源被持久化到 etcd 之前,都必须依次通过准入控制器的检查。如果任一控制器拒绝,请求将被立即终止,不会写入 etcd。

准入控制请求处理流程

一个完整的 API 请求在 Kubernetes 内部经过以下阶段:

  1. 认证(Authentication):验证请求发起者的身份(证书、、用户名/密码)。
  2. 授权(Authorization):判断该身份是否拥有执行操作的权限(RBAC、ABAC)。
  3. 准入控制(Admission Control):对请求内容进行语义检查、默认值注入、策略校验。
  4. 持久化(etcd):通过所有准入检查后,资源对象被写入后端存储。
关键理解: 准入控制器是唯一能够拦截并修改请求内容(Mutating)或拒绝请求(Validating)的组件,且运行在 API Server 进程内,具有极高的执行优先级。
Kubernetes API 请求准入控制流程 客户端请求 认证 授权 准入控制 Mutating Validating etcd 拒绝并返回错误

Mutating vs Validating Webhook

Kubernetes 内置了数十种编译进 API Server 的准入控制器(如 NamespaceLifecycle、ResourceQuota、PodSecurity),但更灵活的方式是通过 Dynamic Admission Control 动态注册外部 Webhook。Webhook 分为两类:MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook。

MutatingAdmissionWebhook(变更型)

  • 执行时机:在 Validating Webhook 之前运行。
  • 核心职责:修改(Patch)请求中的资源对象,例如注入 Sidecar、设置默认资源限制、添加标签/注解。
  • 幂等性要求:同一个对象可能被多次修改,Webhook 必须保证幂等,避免重复注入。
  • 典型场景:Istio Sidecar 注入、Kyverno 默认值策略、自定义调度器标签。

ValidatingAdmissionWebhook(校验型)

  • 执行时机:在 Mutating Webhook 之后运行。
  • 核心职责:校验请求中的资源对象是否符合集群策略,拒绝不合规的请求。
  • 只读原则:不允许修改请求内容,只能返回允许(Allowed)或拒绝(Denied)。
  • 典型场景:禁止特权容器、强制资源配额、检查镜像来源。
最佳实践: 将“默认值注入”放在 Mutating Webhook 中,将“策略校验”放在 Validating Webhook 中。这样 Validating 看到的是经过完整补全后的对象,校验逻辑更简洁、更准确。

Mutating vs Validating 核心对比

对比维度 MutatingAdmissionWebhook ValidatingAdmissionWebhook
执行顺序 先执行 后执行
是否可修改对象 是(通过 JSON Patch) 否(只读)
返回结果 允许 + 修改后的对象 允许 / 拒绝 + 错误消息
幂等性 必须保证幂等 无需考虑幂等
失败策略 Fail / Ignore Fail / Ignore
超时控制 30 秒(可配置) 30 秒(可配置)
Mutating 与 Validating Webhook 执行顺序 API 请求 Mutating Webhook 注入默认值 修改资源对象 JSON Patch Validating Webhook 策略校验 拒绝不合规请求 只读检查 etcd 存储 拒绝请求并返回

Webhook 配置示例(YAML)

以下是一个典型的 ValidatingAdmissionWebhook 配置,用于校验 Pod 是否包含特定标签:

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionWebhookConfiguration
metadata:
  name: "pod-label-validator.example.com"
webhooks:
- name: "pod-label-validator.example.com"
  clientConfig:
    service:
      namespace: "webhook-system"
      name: "webhook-service"
      path: "/validate"
    caBundle: "LS0tLS1CRUdJTiBDRV...=="
  rules:
  - operations: ["CREATE", "UPDATE"]
    apiGroups: [""]
    apiVersions: ["v1"]
    resources: ["pods"]
  failurePolicy: Fail
  sideEffects: None
  admissionReviewVersions: ["v1"]
注意: 生产环境中务必为 Webhook 配置 failurePolicy: Fail 或 Ignore,并设置合理的 timeoutSeconds(默认 30 秒)。如果 Webhook 服务不可用且 failurePolicy: Fail,整个集群的写入操作将被阻塞。

Webhook 的幂等性与副作用控制

  • 幂等性:Mutating Webhook 必须确保多次调用同一请求产生相同结果。例如注入 Sidecar 时,应检查容器是否已存在,避免重复注入。
  • sideEffects:Webhook 配置中需声明 sideEffects: None(无副作用)或 sideEffects: NoneOnDryRun,告知 API Server 该 Webhook 在 dry-run 模式下是否安全。
  • reinvocationPolicy:Mutating Webhook 可设置 reinvocationPolicy: IfNeeded,允许在后续 Webhook 修改对象后再次调用当前 Webhook,确保最终状态正确。

总结

准入控制是 Kubernetes 策略即代码的基石。Mutating Webhook 负责“修正”请求,Validating Webhook 负责“把关”合规。两者配合使用,可以构建出强大且灵活的集群治理体系,为后续实现资源配额模型提供核心执行引擎。