2. Kubernetes 准入控制基础

2.1 什么是准入控制

准入控制(Admission Control)是 Kubernetes API Server 请求处理链中的一个关键环节,位于请求经过认证(Authentication)和授权(Authorization)之后、对象被持久化到 etcd 之前。准入控制器会拦截发往 API Server 的请求,并根据预定义的规则决定是否允许该请求继续执行。

核心定位:准入控制是 Kubernetes 集群安全与策略执行的“最后一道防线”,在对象被存储之前执行校验、修改或拒绝操作。

Kubernetes 内置了多种准入控制器,例如 NamespaceLifecycle、LimitRanger、ResourceQuota、PodSecurity 等。从功能上划分,准入控制分为两类:

  • Mutating(变更)准入控制:允许修改请求对象的内容,例如注入 Sidecar 容器、设置默认资源限制。
  • Validating(验证)准入控制:仅校验请求对象是否符合策略,不允许修改对象内容,例如检查镜像来源是否在白名单内。

两类准入控制器按顺序执行:先执行所有 Mutating 控制器,再执行所有 Validating 控制器。这种设计确保对象在被最终验证前已经过必要的默认值填充和策略注入。

Kubernetes API Server 请求处理流程 客户端 认证 授权 准入控制 Mutating Webhook Validating Webhook etcd 流程说明: 1. 客户端发起请求 → 2. 认证(验证身份) → 3. 授权(验证权限) 4. 准入控制(先执行 Mutating 修改对象,再执行 Validating 校验对象) 5. 对象持久化到 etcd → 6. 返回响应给客户端

2.2 Mutating 与 Validating Webhook 的区别

Webhook 是 Kubernetes 提供的扩展机制,允许集群管理员通过 HTTP 回调将自定义的准入控制逻辑集成到 API Server 的处理链中。MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook 是两种内置的准入控制器,它们分别负责调用外部 Webhook 服务。

对比维度 Mutating Webhook Validating Webhook
执行阶段 先执行(在 Validating 之前) 后执行(在 Mutating 之后)
核心能力 可以修改请求对象(Patch) 只能校验,不能修改对象
典型用途 注入 Sidecar、设置默认值、修改资源字段 策略校验、合规检查、安全准入
失败策略 支持 Fail 或 Ignore 支持 Fail 或 Ignore
超时设置 默认 10 秒,可配置 默认 10 秒,可配置
请求体 包含 AdmissionRequest 和 AdmissionResponse 包含 AdmissionRequest 和 AdmissionResponse
设计原则:Mutating Webhook 先执行可以确保对象在被 Validating Webhook 校验前已经过必要的修改和默认值填充,避免因缺少字段导致校验失败。

2.3 Webhook 在集群中的作用

Webhook 在 Kubernetes 集群中承担着策略执行、安全加固、自动化运维等关键职责。以下是 Webhook 在集群中的主要作用:

  • 安全准入:阻止特权容器、禁止 hostNetwork 使用、限制镜像来源、强制 Pod 安全标准。
  • 资源治理:自动注入资源请求/限制、添加节点亲和性规则、注入 Pod 反亲和性。
  • 运维自动化:自动注入日志采集 Sidecar、监控 Agent、服务网格 Sidecar(如 Istio)。
  • 多租户隔离:强制命名空间标签、注入网络策略、限制跨命名空间访问。
  • 合规审计:记录所有变更操作、校验是否符合组织策略、生成审计日志。
Webhook 在集群中的核心作用 Webhook 服务 安全准入 资源治理 运维自动化 多租户隔离 关键特性: Webhook 通过 AdmissionReview API 与 API Server 交互,支持配置对象选择器(objectSelector)和命名空间选择器(namespaceSelector)来精确控制生效范围。

2.4 Webhook 配置示例

以下是一个 MutatingWebhookConfiguration 的配置示例,展示了如何注册一个外部 Webhook 服务:

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: example-mutating-webhook
webhooks:
- name: mutate.example.com
  clientConfig:
    service:
      name: webhook-service
      namespace: webhook-system
      path: /mutate
    caBundle: <base64-encoded-ca-cert>
  rules:
  - operations: ["CREATE", "UPDATE"]
    apiGroups: [""]
    apiVersions: ["v1"]
    resources: ["pods"]
  admissionReviewVersions: ["v1"]
  sideEffects: None
  timeoutSeconds: 10
  failurePolicy: Fail
  namespaceSelector:
    matchLabels:
      webhook-injection: enabled
注意事项:Webhook 的超时设置(timeoutSeconds)直接影响 API Server 的请求处理延迟。如果 Webhook 响应超时,API Server 会根据 failurePolicy 决定是拒绝请求(Fail)还是忽略错误继续处理(Ignore)。在 Operator 容量优化场景中,合理设置超时时间可以避免 Webhook 成为性能瓶颈。

2.5 本章小结

准入控制是 Kubernetes 集群安全与策略执行的核心机制,Mutating 和 Validating Webhook 分别承担了对象修改和策略校验的职责。理解 Webhook 在 API Server 请求链中的位置、执行顺序以及配置方式,是后续优化 Webhook 超时设置、提升 Operator 处理容量的基础。下一章将深入分析 Webhook 超时对 Operator 性能的具体影响。