3. 准入控制基础:什么是准入控制(Admission Control)、Admission Webhook的工作原理、Mutating与Validating的区别

3.1 什么是准入控制(Admission Control)

准入控制是 Kubernetes API Server 请求处理链中的一个关键安全与策略执行阶段。它位于身份认证(Authentication)和授权(Authorization)之后,在对象被持久化到 etcd 之前执行。准入控制器会拦截所有对 API Server 的请求(创建、更新、删除操作),并根据预定义的逻辑决定是否允许该请求通过。

核心定位:准入控制是 API 请求到达 etcd 前的最后一道防线,用于执行策略、修改资源或拒绝非法请求。

Kubernetes 内置了多种准入控制器(如 NamespaceLifecycle、LimitRanger、ResourceQuota、PodSecurity 等),同时也支持通过 Admission Webhook 扩展自定义逻辑。

3.2 Admission Webhook 的工作原理

Admission Webhook 是一种动态扩展机制,允许集群管理员注册外部 HTTP 回调服务来处理准入请求。其工作流程分为以下步骤:

  1. 请求到达 API Server:用户或控制器发起对 API Server 的请求(如 kubectl apply -f pod.yaml)。
  2. 认证与授权:API Server 验证请求者身份和权限。
  3. 内置准入控制器执行:按配置顺序执行内置准入控制器。
  4. Webhook 配置匹配:API Server 检查 MutatingWebhookConfiguration 和 ValidatingWebhookConfiguration 资源,判断当前请求是否匹配某个 Webhook 的规则(如资源类型、操作、命名空间等)。
  5. 发送 AdmissionReview 请求:API Server 构造 AdmissionReview 对象(包含请求的原始对象和用户信息),通过 HTTPS 发送到 Webhook 服务。
  6. Webhook 处理并响应:Webhook 服务解析请求,执行自定义逻辑,返回 AdmissionReview 响应(包含允许/拒绝决策,以及可选的 Patch 操作)。
  7. API Server 执行决策:如果 Webhook 返回允许,则继续处理;如果返回拒绝,则终止请求并返回错误。
  8. 对象持久化:通过所有准入控制后,对象被写入 etcd。
性能要点:Webhook 的超时时间默认为 30 秒,超时或不可用会导致请求失败。在生产环境中,建议将 Webhook 服务的超时设置为 5-10 秒,并配置 failurePolicy: Fail 或 failurePolicy: Ignore 以控制故障行为。
Admission Webhook 工作流程图 用户/控制器 API Server 认证 + 授权 内置准入控制器 Webhook 匹配 Webhook 服务 etcd AdmissionReview 响应 关键说明: • Mutating Webhook 在 Validating 之前执行 • 多个 Webhook 按配置顺序串行执行 • 超时或不可用由 failurePolicy 决定

3.3 Mutating 与 Validating 的区别

Admission Webhook 分为两种类型:MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook。它们在执行时机、功能和用途上有本质区别。

对比维度 Mutating Webhook Validating Webhook
执行顺序 先执行(在 Validating 之前) 后执行(在 Mutating 之后)
核心功能 修改(Patch)请求对象 验证(Validate)请求对象
响应类型 返回 JSON Patch 或允许/拒绝 仅返回允许/拒绝
典型用途 注入 Sidecar、设置默认值、修改资源字段 校验资源合规性、执行自定义策略
副作用 可能改变对象内容,影响后续验证 不修改对象,仅做检查
配置资源 MutatingWebhookConfiguration ValidatingWebhookConfiguration
性能陷阱:Mutating Webhook 如果执行时间过长,会阻塞整个 API 请求链。建议将 Mutating 逻辑设计为轻量级操作,避免在 Webhook 中执行外部 API 调用或复杂计算。对于 Pod 密度优化场景,Mutating Webhook 常用于注入资源限制或亲和性规则,需确保其响应时间在 5ms 以内。

3.4 执行顺序与交互关系

在 API Server 的准入控制链中,Mutating 和 Validating Webhook 的执行顺序遵循以下规则:

  1. 所有 Mutating Webhook 串行执行(按配置中的 rules 匹配顺序)。
  2. 所有 Validating Webhook 串行执行(同样按匹配顺序)。
  3. 如果某个 Mutating Webhook 修改了对象,后续的 Mutating 和 Validating Webhook 将看到修改后的版本。
  4. 如果任意一个 Webhook 返回拒绝,整个请求立即终止,不再执行后续 Webhook。
Mutating 与 Validating 执行顺序 API 请求 Mutating Webhook 修改对象(注入/默认值) Validating Webhook 验证对象(策略检查) etcd 拒绝时立即终止 关键规则: • Mutating 先执行,Validating 后执行 • 任一 Webhook 拒绝 → 请求终止,不写入 etcd

3.5 配置示例

以下是一个 MutatingWebhookConfiguration 的配置示例,用于为 Pod 注入 Sidecar 容器:

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: sidecar-injector.example.com
webhooks:
- name: sidecar-injector.example.com
  clientConfig:
    service:
      name: sidecar-injector
      namespace: kube-system
      path: /mutate
    caBundle: <base64-encoded-ca-cert>
  rules:
  - operations: ["CREATE"]
    apiGroups: [""]
    apiVersions: ["v1"]
    resources: ["pods"]
  admissionReviewVersions: ["v1"]
  sideEffects: None
  timeoutSeconds: 5
  failurePolicy: Fail
  namespaceSelector:
    matchLabels:
      sidecar-injector: enabled
性能调优建议:在 Pod 密度优化场景中,建议将 timeoutSeconds 设置为 3-5 秒,避免 Webhook 超时导致 Pod 创建延迟。同时,使用 namespaceSelector 和 objectSelector 缩小 Webhook 的匹配范围,减少不必要的准入检查开销。