3. 准入控制概念:什么是 Admission Controller?它在 API 请求生命周期中的位置
Admission Controller(准入控制器)是 Kubernetes API Server 中一个关键的拦截与校验机制。它位于请求被认证、授权之后,以及对象被持久化到 etcd 之前。可以将其理解为 API 请求进入集群前的最后一道“安检闸门”。
3.1 核心定义
Admission Controller 是一段编译进 kube-apiserver 的插件代码,用于拦截经过身份验证和授权的 API 请求。它能够修改(Mutating)或验证(Validating)请求中的资源对象,从而确保集群的安全策略、资源配额和合规性要求得到强制执行。
关键特性: 只有通过了所有准入控制器的检查,请求才会被写入 etcd 并最终生效。如果任何一个控制器拒绝请求,整个请求将立即失败并返回错误信息。
3.2 在 API 请求生命周期中的位置
为了清晰理解 Admission Controller 的作用阶段,下面展示一个完整的 API 请求处理流程:
3.3 两种类型的准入控制器
Kubernetes 将准入控制器分为两大类,它们在请求处理链中按顺序执行:
| 类型 | 执行顺序 | 核心功能 | 典型示例 |
|---|---|---|---|
| Mutating(变更) | 先执行 | 拦截请求并修改(补全、注入、重写)资源对象的字段。例如自动为 Pod 注入 Sidecar 容器或设置默认资源限制。 | MutatingAdmissionWebhook、PodNodeSelector、DefaultStorageClass |
| Validating(验证) | 后执行 | 仅检查请求对象是否符合策略,不修改对象。如果验证失败则拒绝请求。 | ValidatingAdmissionWebhook、PodSecurityPolicy、ResourceQuota |
执行顺序提示: 所有 Mutating 控制器先执行,然后所有 Validating 控制器再执行。这种设计确保验证阶段看到的是经过所有修改后的最终对象版本,避免因修改顺序导致验证结果不一致。
3.4 内置与动态准入控制器
Kubernetes 提供了两种方式来启用准入控制逻辑:
- 内置控制器: 编译在 kube-apiserver 二进制文件中,通过
--enable-admission-plugins和--disable-admission-plugins参数启用或禁用。例如NamespaceLifecycle、LimitRanger、ServiceAccount。 - 动态准入 Webhook: 通过
MutatingWebhookConfiguration和ValidatingWebhookConfiguration资源动态注册。允许集群管理员在不重启 API Server 的情况下,将外部 HTTP 回调服务集成到准入链中,实现高度自定义的策略。
3.5 为什么准入控制对集群节点扩容安全至关重要
在集群节点扩容场景中,准入控制器扮演着安全守门员的角色:
- 强制镜像安全策略: 通过
ImagePolicyWebhook或自定义 ValidatingWebhook,确保扩容时拉取的容器镜像来自受信任的仓库,且签名有效。 - 资源配额与限制:
ResourceQuota和LimitRanger控制器确保新创建的 Pod 不会超出节点或命名空间的资源上限,防止资源争抢。 - Pod 安全标准:
PodSecurity控制器(替代旧版 PSP)强制新 Pod 满足预定义的安全上下文,例如禁止特权容器或限制 Linux Capabilities。 - 网络策略注入: 通过 MutatingWebhook 自动为新 Pod 注入网络策略标签或 Sidecar 代理,确保扩容后的 Pod 立即纳入集群网络隔离体系。
安全风险提示: 如果准入控制器配置不当或未启用关键控制器(如
NodeRestriction、PodSecurity),攻击者可能通过恶意 Deployment 创建特权 Pod,进而利用节点权限横向移动或逃逸。务必在生产集群中启用并正确配置至少一个 Validating 准入控制器来校验 Pod 安全上下文。
3.6 准入控制链的典型配置示例
以下是一个生产环境推荐的准入控制器启用配置(kube-apiserver 启动参数):
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,\
NodeRestriction,PodSecurity,DefaultStorageClass,\
MutatingAdmissionWebhook,ValidatingAdmissionWebhook,\
ResourceQuota
该配置确保了从命名空间隔离、资源限制、节点权限约束到动态 Webhook 策略的完整安全覆盖,是集群节点扩容场景下的基线安全配置。