2. K8s 准入控制基础:Admission Controller 概念、Webhook 类型与工作流程
2.1 什么是 Admission Controller?
Admission Controller(准入控制器)是 Kubernetes API Server 请求处理链中的一个关键组件。它位于请求被认证(Authentication)和授权(Authorization)之后、对象被持久化到 etcd 之前。准入控制器可以拦截、修改甚至拒绝 API 请求,是实现集群安全策略、资源配额管理和合规性检查的核心机制。
关键定位: 准入控制是 Kubernetes 内部唯一能够对 API 请求内容进行深度检查和动态修改的环节。镜像供应链安全策略(如强制签名验证、禁止高危镜像)必须在此处实施。
2.2 准入控制工作流程
一个完整的 API 请求在 Kubernetes 集群中的处理流程如下:
- 认证(Authentication): 验证请求发起者的身份(证书、、用户名/密码)。
- 授权(Authorization): 判断请求者是否有权限执行该操作(RBAC、ABAC)。
- 准入控制(Admission Control): 对请求内容进行拦截、修改或拒绝。这是策略执行的关键环节。
- 对象验证与持久化: 通过准入控制的请求最终被验证并写入 etcd。
下图展示了 Kubernetes API 请求的完整处理流程,突出准入控制器的位置:
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 的完整工作流程如下:
- API Server 接收请求:用户通过 kubectl 或 API 调用提交 Pod 定义。
- 认证与授权:验证用户身份和权限。
- Mutating Webhook 调用:API Server 将请求对象发送到配置的 Mutating Webhook 服务。
- 对象修改:Mutating Webhook 返回 JSON Patch,修改请求对象(如注入镜像签名验证 Sidecar)。
- 对象验证:修改后的对象被发送到 Validating Webhook 服务进行合规性检查。
- 决策返回:Validating Webhook 返回允许或拒绝。
- 持久化:如果所有准入控制器都通过,对象被写入 etcd。
下图展示了 Mutating 和 Validating Webhook 在准入控制链中的协作关系:
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 实现。