1. 课程导论:什么是准入控制策略,为什么在 Deployment 滚动更新中需要它

1.1 准入控制策略的核心定义

在 Kubernetes 中,准入控制(Admission Control) 是 API Server 处理请求流程中的一个关键拦截层。当用户通过 kubectl、客户端库或 Dashboard 向集群发送资源创建、更新或删除请求时,该请求在通过身份认证(Authentication)和授权(Authorization)之后、被持久化到 etcd 之前,会依次经过一组准入控制器(Admission Controller)的检查。

准入控制策略本质上是一组可编程的拦截规则,它能够:

  • 验证(Validating):检查请求是否符合集群级策略,拒绝不合规的变更。
  • 变更(Mutating):在资源被存储前自动修改其配置,例如注入 Sidecar 容器或设置默认资源限制。
  • 审计(Auditing):记录特定操作的上下文信息,用于合规与安全追溯。
关键理解: 准入控制是 Kubernetes 安全与策略执行的“最后一公里”。它不像 RBAC 那样控制“谁能操作”,而是控制“什么样的操作可以被允许进入集群”。

1.2 准入控制策略在请求链路中的位置

下图展示了 Kubernetes API 请求从客户端到 etcd 存储的完整路径,其中准入控制阶段位于认证与授权之后、持久化之前:

Kubernetes API 请求处理链路 客户端请求 认证 授权 准入控制 etcd Mutating 阶段 Validating 阶段 准入控制是策略执行的“守门员” 只有通过所有准入控制器检查的请求,才会被最终写入 etcd 并生效。

1.3 为什么 Deployment 滚动更新需要准入控制策略

Deployment 的滚动更新(Rolling Update)是生产环境中发布新版本应用的标准方式。然而,不加管控的滚动更新可能引入严重问题:

风险场景 问题描述 准入控制如何解决
镜像来源不可控 开发者误用了 latest 标签或来自非信任仓库的镜像 强制要求镜像必须来自白名单仓库,且标签不能为 latest
资源配额超限 新版本 Pod 请求的 CPU/内存超出命名空间剩余配额 在更新前验证资源总和是否超出 LimitRange 或 ResourceQuota
安全上下文缺失 新 Pod 以特权模式运行,或挂载了敏感主机路径 拒绝不符合 Pod Security Standards 的更新请求
滚动窗口失控 maxSurge 或 maxUnavailable 设置过大,导致服务中断 强制滚动更新参数必须在安全阈值范围内(如 maxSurge ≤ 25%)
配置漂移 更新时意外修改了不应变更的标签、注解或环境变量 通过 ValidatingAdmissionPolicy 对比新旧版本,阻止关键字段变更
生产教训: 某团队因未配置准入控制,一次滚动更新中误将 replicas 从 10 改为 100,同时 maxSurge 设置为 50%,导致集群瞬间创建 50 个额外 Pod,耗尽节点资源并引发级联故障。准入控制策略本可以在更新前拦截这一异常参数组合。

1.4 准入控制策略的两种实现方式

在 Kubernetes 中,实现准入控制策略主要有两种方式:

  1. 内置准入控制器(Built-in Admission Controllers):Kubernetes 原生提供的控制器,如 NamespaceLifecycle、LimitRanger、PodSecurity、ResourceQuota 等。通过 API Server 启动参数 --enable-admission-plugins 启用。
  2. 动态准入控制(Dynamic Admission Control):通过 Webhook 机制扩展,包括:
    • MutatingAdmissionWebhook:拦截请求并修改资源对象。
    • ValidatingAdmissionWebhook:拦截请求并验证资源对象。
    自 Kubernetes 1.28+,还支持 ValidatingAdmissionPolicy,使用通用表达式语言(CEL)编写策略,无需部署 Webhook 服务。

1.5 准入控制策略在滚动更新中的典型工作流

以下 SVG 图展示了当用户执行 kubectl set image deployment/nginx nginx=nginx:1.25 时,准入控制策略如何介入滚动更新流程:

准入控制策略在滚动更新中的拦截流程 kubectl set image API Server 接收 准入控制链 更新 Deployment ① MutatingWebhook ② PodSecurity ③ ResourceQuota ④ ValidatingPolicy ❌ 拒绝更新 任一准入控制器拒绝,则整个滚动更新请求被终止,Deployment 保持原版本不变。

1.6 本课程的核心目标

通过本课程,你将掌握如何利用 Kubernetes 的准入控制机制,为 Deployment 滚动更新构建一套“滚动窗口策略”。具体包括:

  • 使用 ValidatingAdmissionPolicy 和 CEL 表达式 编写轻量级策略,无需部署 Webhook 服务。
  • 约束滚动更新参数(maxSurge、maxUnavailable、minReadySeconds)的安全范围。
  • 验证新版本 Pod 的镜像来源、资源请求和安全上下文。
  • 通过 dry-run 模式预览策略效果,避免误拦截。
  • 结合 审计日志 监控策略命中情况,持续优化规则。
课程前置知识: 建议你已熟悉 Kubernetes 基本概念(Pod、Deployment、Service)、kubectl 常用命令以及 YAML 清单编写。无需深入掌握 Webhook 开发,本课程将优先使用声明式策略(ValidatingAdmissionPolicy)实现。