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 存储的完整路径,其中准入控制阶段位于认证与授权之后、持久化之前:
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 中,实现准入控制策略主要有两种方式:
- 内置准入控制器(Built-in Admission Controllers):Kubernetes 原生提供的控制器,如
NamespaceLifecycle、LimitRanger、PodSecurity、ResourceQuota等。通过 API Server 启动参数--enable-admission-plugins启用。 - 动态准入控制(Dynamic Admission Control):通过 Webhook 机制扩展,包括:
- MutatingAdmissionWebhook:拦截请求并修改资源对象。
- ValidatingAdmissionWebhook:拦截请求并验证资源对象。
1.5 准入控制策略在滚动更新中的典型工作流
以下 SVG 图展示了当用户执行 kubectl set image deployment/nginx nginx=nginx:1.25 时,准入控制策略如何介入滚动更新流程:
1.6 本课程的核心目标
通过本课程,你将掌握如何利用 Kubernetes 的准入控制机制,为 Deployment 滚动更新构建一套“滚动窗口策略”。具体包括:
- 使用 ValidatingAdmissionPolicy 和 CEL 表达式 编写轻量级策略,无需部署 Webhook 服务。
- 约束滚动更新参数(
maxSurge、maxUnavailable、minReadySeconds)的安全范围。 - 验证新版本 Pod 的镜像来源、资源请求和安全上下文。
- 通过 dry-run 模式预览策略效果,避免误拦截。
- 结合 审计日志 监控策略命中情况,持续优化规则。
课程前置知识: 建议你已熟悉 Kubernetes 基本概念(Pod、Deployment、Service)、
kubectl 常用命令以及 YAML 清单编写。无需深入掌握 Webhook 开发,本课程将优先使用声明式策略(ValidatingAdmissionPolicy)实现。