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 请求处理流程:

API 请求生命周期与准入控制位置 API 请求生命周期与准入控制位置 客户端 (kubectl/API) 认证 (Authentication) 授权 (Authorization) 准入控制 (Admission Control) Mutating → Validating etcd 持久化 说明: 准入控制器是唯一可以同时修改(Mutating)和验证(Validating)请求的阶段。 如果在此阶段被拒绝,请求不会写入 etcd,也不会对集群产生任何影响。

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 策略的完整安全覆盖,是集群节点扩容场景下的基线安全配置。