3、准入控制基础:什么是准入控制(Admission Control),工作流程与作用

3.1 准入控制定义

准入控制(Admission Control)是 Kubernetes API Server 请求链路上的最后一个内部拦截层。当请求通过认证(Authentication)和授权(Authorization)后,在对象被持久化到 etcd 之前,准入控制器会拦截该请求,并根据预定义的规则对请求内容进行验证、修改或拒绝。

准入控制器本质上是一段插件化的 Go 代码或 Webhook 回调,它决定了“这个请求是否允许进入集群状态存储”。

关键区分:认证解决“你是谁”,授权解决“你能做什么”,准入控制解决“你做的这件事是否符合集群策略”。

3.2 准入控制工作流程

一个完整的 API 请求在 Kubernetes 中的处理路径如下:

  1. 客户端发起请求(kubectl、API 调用、控制器)
  2. 认证(Authentication):验证用户/服务账号身份
  3. 授权(Authorization):检查 RBAC/ABAC 权限
  4. 准入控制(Admission Control):拦截并处理请求
  5. 对象持久化:写入 etcd

准入控制阶段又细分为两个子阶段:

阶段 执行时机 典型操作 示例控制器
Mutating(变更) 先执行 修改请求对象字段、注入 sidecar、设置默认值 MutatingAdmissionWebhook、PodNodeSelector
Validating(验证) 后执行 校验请求是否违反策略、拒绝非法配置 ValidatingAdmissionWebhook、PodSecurity
执行顺序:所有 Mutating 控制器按顺序执行 → 所有 Validating 控制器按顺序执行。如果 Mutating 阶段拒绝,则不会进入 Validating 阶段。

3.3 准入控制工作流程 SVG

Kubernetes API 请求处理流程(含准入控制) 客户端请求 认证(Authentication) 授权(Authorization) 准入控制(Admission Control) Mutating(变更)控制器链 Validating(验证)控制器链 etcd 持久化 拒绝(403) Mutating 先执行,修改请求对象 Validating 后执行,校验并拒绝

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

准入控制对节点扩容与运行时同步的影响 节点扩容请求 节点注册 & 标签同步 Pod 调度到新节点 准入控制拦截层 NodeRestriction ResourceQuota MutatingWebhook 容器运行时状态同步 kubelet 状态上报 Pod 状态同步到 API Server 准入控制拒绝 → 节点注册失败 → Pod 无法调度 → 同步中断

3.8 常见准入控制故障排查要点

  • Webhook 超时:Mutating/ValidatingAdmissionWebhook 默认超时 10s,网络延迟或后端服务故障会导致请求失败。
  • 证书问题:Webhook 服务端证书过期或 CA 不匹配,导致 API Server 无法建立 TLS 连接。
  • 控制器顺序依赖:某些控制器依赖前置控制器的修改结果,顺序错误会导致预期外的拒绝。
  • 资源配额不足:扩容时 ResourceQuota 检查发现命名空间资源已用尽,直接拒绝 Pod 创建。
  • 节点标签缺失:PodNodeSelector 要求节点包含特定标签,新节点未打标导致调度失败。
快速诊断命令:
kubectl get mutatingwebhookconfigurations — 查看所有变更 Webhook
kubectl get validatingwebhookconfigurations — 查看所有验证 Webhook
kubectl describe pod <pod-name> | grep -A5 "Events" — 查看准入拒绝事件