3、准入控制基础:什么是准入控制(Admission Control),工作流程与作用
3.1 准入控制定义
准入控制(Admission Control)是 Kubernetes API Server 请求链路上的最后一个内部拦截层。当请求通过认证(Authentication)和授权(Authorization)后,在对象被持久化到 etcd 之前,准入控制器会拦截该请求,并根据预定义的规则对请求内容进行验证、修改或拒绝。
准入控制器本质上是一段插件化的 Go 代码或 Webhook 回调,它决定了“这个请求是否允许进入集群状态存储”。
关键区分:认证解决“你是谁”,授权解决“你能做什么”,准入控制解决“你做的这件事是否符合集群策略”。
3.2 准入控制工作流程
一个完整的 API 请求在 Kubernetes 中的处理路径如下:
- 客户端发起请求(kubectl、API 调用、控制器)
- 认证(Authentication):验证用户/服务账号身份
- 授权(Authorization):检查 RBAC/ABAC 权限
- 准入控制(Admission Control):拦截并处理请求
- 对象持久化:写入 etcd
准入控制阶段又细分为两个子阶段:
| 阶段 | 执行时机 | 典型操作 | 示例控制器 |
|---|---|---|---|
| Mutating(变更) | 先执行 | 修改请求对象字段、注入 sidecar、设置默认值 | MutatingAdmissionWebhook、PodNodeSelector |
| Validating(验证) | 后执行 | 校验请求是否违反策略、拒绝非法配置 | ValidatingAdmissionWebhook、PodSecurity |
执行顺序:所有 Mutating 控制器按顺序执行 → 所有 Validating 控制器按顺序执行。如果 Mutating 阶段拒绝,则不会进入 Validating 阶段。
3.3 准入控制工作流程 SVG
3.4 准入控制器的分类
Kubernetes 内置了 30+ 个准入控制器,按功能可分为以下类别:
| 类别 | 典型控制器 | 核心作用 |
|---|---|---|
| 资源配额 | ResourceQuota、LimitRanger | 限制命名空间级别的资源使用上限 |
| 安全策略 | PodSecurity、PodSecurityPolicy(已弃用) | 强制 Pod 安全上下文标准 |
| 默认值注入 | DefaultStorageClass、DefaultTolerationSeconds | 为未指定字段设置默认值 |
| 服务网格 | MutatingAdmissionWebhook(Istio/Linkerd 注入) | 自动注入 sidecar 代理 |
| 自定义策略 | ValidatingAdmissionWebhook | 对接外部策略引擎(OPA/Gatekeeper) |
3.5 准入控制的核心作用
- 策略执行:确保所有资源创建/更新操作符合集群级策略,例如禁止特权容器、强制设置资源请求/限制。
- 默认值注入:为未显式配置的字段自动填充合理默认值,降低用户配置负担。
- 资源配额管理:防止单个命名空间或用户过度消耗集群资源。
- 安全加固:在对象持久化前拦截不安全配置,例如检查镜像来源、禁止 hostNetwork 模式。
- 可观测性增强:通过 Webhook 记录所有变更操作,实现审计日志和变更追踪。
运维注意:准入控制器是集群安全的最后一道防线。如果误配置或禁用关键控制器(如 NodeRestriction),可能导致节点被恶意 Pod 利用。建议在生产集群中至少启用
NodeRestriction、PodSecurity、ResourceQuota 和 LimitRanger。
3.6 准入控制与节点扩容的关联
在集群节点扩容场景中,准入控制直接影响容器运行时状态同步的成败:
| 扩容阶段 | 准入控制器角色 | 潜在故障点 |
|---|---|---|
| 节点注册 | NodeRestriction 限制节点只能修改自身状态 | 节点证书过期导致准入拒绝 |
| Pod 调度 | PodNodeSelector 强制节点标签选择 | 新节点缺少必要标签导致 Pod 无法调度 |
| 资源分配 | ResourceQuota 校验命名空间资源上限 | 扩容 Pod 超出配额导致创建失败 |
| 运行时同步 | MutatingWebhook 注入 sidecar 或修改 Pod 规范 | Webhook 超时或返回错误导致 Pod 无法启动 |
3.7 准入控制与运行时状态同步关系 SVG
3.8 常见准入控制故障排查要点
- Webhook 超时:Mutating/ValidatingAdmissionWebhook 默认超时 10s,网络延迟或后端服务故障会导致请求失败。
- 证书问题:Webhook 服务端证书过期或 CA 不匹配,导致 API Server 无法建立 TLS 连接。
- 控制器顺序依赖:某些控制器依赖前置控制器的修改结果,顺序错误会导致预期外的拒绝。
- 资源配额不足:扩容时 ResourceQuota 检查发现命名空间资源已用尽,直接拒绝 Pod 创建。
- 节点标签缺失:PodNodeSelector 要求节点包含特定标签,新节点未打标导致调度失败。
快速诊断命令:
kubectl get mutatingwebhookconfigurations — 查看所有变更 Webhookkubectl get validatingwebhookconfigurations — 查看所有验证 Webhookkubectl describe pod <pod-name> | grep -A5 "Events" — 查看准入拒绝事件