2. K8s 准入控制基础:Admission Controller 概念、Webhook 类型与工作流程

2.1 什么是 Admission Controller?

Admission Controller(准入控制器)是 Kubernetes API Server 请求处理链中的一个关键组件。它位于请求被认证(Authentication)和授权(Authorization)之后、对象被持久化到 etcd 之前。准入控制器可以拦截、修改甚至拒绝 API 请求,是实现集群安全策略、资源配额管理和合规性检查的核心机制。

关键定位: 准入控制是 Kubernetes 内部唯一能够对 API 请求内容进行深度检查和动态修改的环节。镜像供应链安全策略(如强制签名验证、禁止高危镜像)必须在此处实施。

2.2 准入控制工作流程

一个完整的 API 请求在 Kubernetes 集群中的处理流程如下:

  1. 认证(Authentication): 验证请求发起者的身份(证书、、用户名/密码)。
  2. 授权(Authorization): 判断请求者是否有权限执行该操作(RBAC、ABAC)。
  3. 准入控制(Admission Control): 对请求内容进行拦截、修改或拒绝。这是策略执行的关键环节。
  4. 对象验证与持久化: 通过准入控制的请求最终被验证并写入 etcd。

下图展示了 Kubernetes API 请求的完整处理流程,突出准入控制器的位置:

Kubernetes API 请求处理流程 用户/客户端 认证 授权 准入控制 (策略执行点) etcd 准入控制阶段详解 • 认证和授权通过后,请求进入准入控制链 • 准入控制器可以修改(Mutating)或验证(Validating)请求 • 只有所有准入控制器都通过,请求才会被写入 etcd

2.3 Webhook 类型:Mutating vs Validating

Kubernetes 提供了两种内置的准入 Webhook 类型,用于实现自定义的准入控制逻辑:

特性 MutatingAdmissionWebhook ValidatingAdmissionWebhook
执行顺序 先执行(Mutating 先于 Validating) 后执行(Validating 后于 Mutating)
核心功能 修改(Mutate)请求对象的内容 验证(Validate)请求对象是否合规
典型用途 注入 Sidecar、设置默认值、添加标签/注解、修改镜像地址 检查镜像签名、验证安全上下文、禁止特权容器、校验资源配额
返回结果 返回修改后的对象(Patch) 返回允许(Allowed)或拒绝(Denied)
幂等性要求 必须幂等(多次执行结果一致) 无特殊要求
执行顺序规则: 所有 Mutating Webhook 执行完毕后,才会执行 Validating Webhook。这意味着 Validating Webhook 看到的是经过所有修改后的最终对象版本。

2.4 准入 Webhook 工作流程详解

当用户提交一个 Pod 创建请求时,准入 Webhook 的完整工作流程如下:

  1. API Server 接收请求:用户通过 kubectl 或 API 调用提交 Pod 定义。
  2. 认证与授权:验证用户身份和权限。
  3. Mutating Webhook 调用:API Server 将请求对象发送到配置的 Mutating Webhook 服务。
  4. 对象修改:Mutating Webhook 返回 JSON Patch,修改请求对象(如注入镜像签名验证 Sidecar)。
  5. 对象验证:修改后的对象被发送到 Validating Webhook 服务进行合规性检查。
  6. 决策返回:Validating Webhook 返回允许或拒绝。
  7. 持久化:如果所有准入控制器都通过,对象被写入 etcd。

下图展示了 Mutating 和 Validating Webhook 在准入控制链中的协作关系:

Mutating 与 Validating Webhook 协作流程 API 请求进入 MutatingAdmissionWebhook 修改请求对象(注入 Sidecar、设置默认值、修改镜像) 返回 JSON Patch → 对象被修改 ValidatingAdmissionWebhook 验证修改后的对象(镜像签名、安全策略、合规性) 返回 Allowed / Denied 写入 etcd

2.5 镜像供应链安全中的准入控制应用

在镜像供应链安全场景中,准入控制是最后一道防线。以下表格展示了常见的镜像安全策略及其对应的 Webhook 类型:

安全策略 Webhook 类型 实现方式
强制镜像签名验证 Validating 检查镜像是否包含有效的 Cosign / Notary 签名
禁止 latest 标签 Mutating + Validating Mutating 自动替换标签;Validating 拒绝未修改的请求
镜像来源白名单 Validating 只允许从受信任的镜像仓库拉取镜像
注入镜像扫描 Sidecar Mutating 自动为 Pod 注入镜像漏洞扫描容器
禁止特权容器 Validating 检查 securityContext.privileged 字段
重要提示: 准入 Webhook 是集群级别的全局配置。配置错误可能导致整个集群不可用。在生产环境中,建议先使用 --dry-run=server 模式测试 Webhook 配置,再正式启用。

2.6 关键概念总结

  • Admission Controller 是 Kubernetes API 请求处理链中的策略执行点,位于认证和授权之后。
  • MutatingAdmissionWebhook 用于修改请求对象,ValidatingAdmissionWebhook 用于验证请求对象。
  • Mutating Webhook 先于 Validating Webhook 执行,确保验证时看到的是最终对象。
  • 镜像供应链安全策略(签名验证、来源白名单、标签策略)通过 Validating Webhook 实现。
  • 自动注入和配置修改(如 Sidecar、默认值)通过 Mutating Webhook 实现。