4、准入控制基础:Kubernetes准入控制器原理、Mutating与Validating Webhook、Argo CD中的准入控制角色
4.1 Kubernetes准入控制器原理
准入控制器(Admission Controller)是Kubernetes API Server请求处理链中的一道关键拦截网关。它位于请求认证(Authentication)与授权(Authorization)之后,对象持久化(etcd存储)之前。只有通过所有准入控制器的检查,请求才会被真正写入集群状态。
Kubernetes准入控制器的完整请求处理流程如下:
- 认证(Authentication):验证请求发起者的身份(TLS证书、、用户名/密码)。
- 授权(Authorization):检查发起者是否有权限执行该操作(RBAC、ABAC)。
- 准入控制(Admission Control):对请求对象进行校验与变更,决定是否允许请求通过。
- 持久化(etcd):将最终对象写入存储。
准入控制器分为两种类型:
| 类型 | 执行时机 | 核心能力 | 典型用途 |
|---|---|---|---|
| Mutating(变更) | 先执行 | 修改请求对象(注入Sidecar、设置默认值、修正标签) | Istio Sidecar注入、Pod默认资源限制设置 |
| Validating(验证) | 后执行 | 校验请求对象是否符合策略(拒绝非法配置) | 禁止特权容器、强制Pod安全标准 |
4.2 Mutating与Validating Webhook
Kubernetes内置了多种静态编译的准入控制器(如 NamespaceLifecycle、LimitRanger、PodSecurity),但更灵活的方式是通过 动态准入控制(Dynamic Admission Control) 使用Webhook。Webhook允许集群管理员注册外部HTTP回调,由API Server在请求处理过程中调用。
两种Webhook的配置资源:
- MutatingWebhookConfiguration:注册变更Webhook,API Server发送
AdmissionReview请求,Webhook返回JSON Patch修改对象。 - ValidatingWebhookConfiguration:注册验证Webhook,API Server发送
AdmissionReview请求,Webhook返回允许/拒绝决策。
Webhook请求与响应结构:
# 请求(API Server → Webhook)
{
"apiVersion": "admission.k8s.io/v1",
"kind": "AdmissionReview",
"request": {
"uid": "705ab4f5-6393-11e8-b7cc-42010a800002",
"kind": {"group":"","version":"v1","kind":"Pod"},
"resource": {"group":"","version":"v1","resource":"pods"},
"operation": "CREATE",
"object": { ... }, // 请求的完整对象
"oldObject": null, // 仅UPDATE/DELETE时有值
"dryRun": false
}
}
# 响应(Webhook → API Server)
{
"apiVersion": "admission.k8s.io/v1",
"kind": "AdmissionReview",
"response": {
"uid": "705ab4f5-6393-11e8-b7cc-42010a800002",
"allowed": true, // 或 false
"status": {
"message": "this pod is not allowed",
"code": 403
},
"patch": "W3sib3AiOiAiYWRkIiwgInBhdGgiOiAiL3NwZWMvY29udGFpbmVycy8tIiwgInZhbHVlIjogInt9In1d",
"patchType": "JSONPatch"
}
}
- Webhook必须使用TLS(HTTPS),证书由API Server信任的CA签发。
- Webhook超时默认30秒,超时后API Server的行为由
failurePolicy决定(Fail或Ignore)。 - Webhook的
namespaceSelector和objectSelector可缩小作用范围,避免影响系统命名空间。
4.3 Argo CD中的准入控制角色
在Argo CD项目级架构中,准入控制扮演着双重角色:既是集群安全策略的执行者,也是GitOps工作流中配置合规的守护者。Argo CD本身不直接实现Kubernetes Webhook,而是通过以下机制与准入控制体系深度集成:
4.3.1 Argo CD作为Webhook的消费者
当Argo CD将应用同步到目标集群时,它发出的API请求同样会经过目标集群的准入控制器。这意味着:
- 集群级策略自动生效:目标集群上配置的任何Mutating/Validating Webhook都会对Argo CD的同步请求进行拦截和处理。
- 策略冲突检测:如果Argo CD尝试同步一个违反集群策略的资源配置(如特权容器),Validating Webhook会拒绝该请求,Argo CD将报告同步失败。
- Sidecar自动注入:如果集群配置了Istio Sidecar注入的Mutating Webhook,Argo CD同步的Pod会自动被注入Sidecar容器。
4.3.2 Argo CD项目级准入策略
Argo CD通过项目(Project)资源提供了内置的准入控制能力,无需依赖外部Webhook即可实现项目级别的策略约束:
| 策略维度 | 配置字段 | 作用说明 |
|---|---|---|
| 目标集群限制 | spec.destinations |
限制应用只能部署到指定的集群和命名空间 |
| 允许的资源类型 | spec.sourceRepos |
限制应用只能从指定的Git仓库拉取配置 |
| 资源白名单/黑名单 | spec.clusterResourceWhitelistspec.namespaceResourceBlacklist |
控制项目可以创建哪些Kubernetes资源类型 |
| 同步窗口 | spec.syncWindows |
定义允许自动同步的时间窗口,防止非工作时间变更 |
| 角色绑定 | spec.roles |
控制哪些用户/组可以对该项目执行同步操作 |
4.3.3 与外部准入控制器的集成模式
对于需要更精细策略控制的场景,Argo CD可以与外部准入控制器(如Kyverno、OPA Gatekeeper)协同工作:
- Kyverno:在目标集群上部署Kyverno,编写ClusterPolicy对Argo CD同步的资源进行校验。Kyverno支持生成报告(Report)而不实际拒绝,适合审计场景。
- OPA Gatekeeper:使用ConstraintTemplate定义策略,通过Argo CD项目中的
syncPolicy配合Gatekeeper的dry-run模式进行预检。 - Argo CD PreSync Hook:在同步前执行自定义Job,运行策略检查脚本,失败则阻止后续同步。
4.4 准入控制策略的通信机制
在Argo CD项目级架构中,准入策略的通信机制涉及三个关键角色之间的数据流:
- 策略定义层:在Git仓库中定义Kubernetes资源清单和策略配置(如Kyverno ClusterPolicy、Gatekeeper Constraint)。
- 策略分发层:Argo CD将策略配置同步到目标集群,确保策略资源与业务应用同时部署。
- 策略执行层:目标集群上的准入控制器(Webhook)拦截并校验所有资源请求,包括Argo CD的同步请求。
- 循环依赖:如果Argo CD自身部署在目标集群上,且集群的准入策略限制了Argo CD的命名空间,可能导致Argo CD无法自我修复。
- 策略同步顺序:策略资源(如ClusterPolicy)必须先于业务应用同步到集群,否则业务应用可能因缺少策略而通过校验。
- Dry-run模式:在生产环境启用新的准入策略前,建议先在dry-run模式下观察影响范围,避免误杀合法工作负载。
4.5 本章小结
准入控制是Kubernetes安全体系的核心组件,Mutating Webhook负责变更对象,Validating Webhook负责校验策略。Argo CD在项目级架构中既是准入控制的消费者(其同步请求受目标集群策略约束),也是策略的分发者(通过GitOps将策略配置同步到集群)。理解这一双向关系,是设计安全、合规的Argo CD项目级架构的基础。