本文目录导读:

是的,策略控制器(Policy Controller)通常具备阻断不合规部署的能力,但这取决于具体的实现方式和配置。
策略控制器就像一个集群的准入审查员,它会在资源(如Pod、Service等)被创建或更新时,根据你预定义的规则(即“策略”)进行检查,如果发现不符合规则,它可以执行拒绝(阻断)操作,阻止该部署生效。
以下是详细的解释:
核心机制:准入控制(Admission Control)
绝大多数策略控制器(如 Open Policy Agent Gatekeeper、Kyverno)都工作在 Kubernetes 的准入控制(Admission Control)环节,这个环节发生在 API Server 验证请求之后、将资源存储到 etcd 之前。
- 流程: 当你执行
kubectl apply -f deployment.yaml-> 请求到达 API Server -> 经过认证和授权 -> 进入准入控制链 -> 策略控制器拦截请求 -> 根据策略判断:- 合规: 放行请求,资源被创建。
- 不合规: 返回错误信息,阻断请求,资源不会被创建。
主流策略控制器及其阻断能力
| 控制器 | 如何实现阻断 | 作用范围 |
|---|---|---|
| OPA Gatekeeper | 通过定义 ConstraintTemplate 和 Constraint,生成一个 ValidatingAdmissionWebhook,API Server 在创建/更新资源时会调用这个 Webhook,如果违反约束,请求被拒绝。 |
主要用于安全、合规与治理的强制策略。 |
| Kyverno | 使用 Kubernetes 原生风格的 ClusterPolicy 或 Policy 资源,它可以配置为 validate (验证)模式,并设置 validationFailureAction: Enforce 来直接拒绝不合规请求。 |
功能更全面,包括验证、变异、生成和清理资源。 |
| 内置的PodSecurity | Kubernetes 1.23+ 内置的准入控制器,通过 PodSecurity 或 PodSecurityPolicy(已弃用)实现,直接由 API Server 执行,无需外部 Webhook。 |
专注于Pod 安全标准(如禁止特权容器、避免 HostPath 挂载等)。 |
具体阻断场景举例
策略控制器可以阻断以下不合规的部署:
- 安全违规: 尝试部署一个 特权容器 (
securityContext.privileged: true)。 - 资源滥用: 尝试创建一个没有设置 资源限制(Resource Limits)的高负载 Pod。
- 镜像来源: 尝试从 不受信任的镜像仓库(如
latest标签、docker.io/unknown)拉取镜像。 - 禁止的操作: 尝试挂载 宿主机敏感路径(如
/var/run/docker.sock)。 - 命名规范: 尝试创建一个名称包含特殊字符或长度超出限制的 Deployment。
- 标签缺失: 尝试部署一个缺少必须标签(如
app、env、team)的资源。 - Ingress 配置: 尝试创建一个配置了不安全 TLS 版本或通配符证书的 Ingress。
重要区别:阻断 vs 告警
策略控制器通常有两种行为模式:
-
强制阻断(Enforce / Deny):
- 配置:
validationFailureAction: Enforce - 效果:直接拒绝请求,返回错误信息(如
“denied by policy: container must not run as root”)。这是最常用的生产环境配置。
- 配置:
-
仅告警(Audit / Warn):
- 配置:
validationFailureAction: Audit(或在 OPA 中配置remediationAction: dryrun) - 效果:请求被允许通过(资源能创建),但策略控制器会记录一条审计日志或生成一个警告事件。常用于测试策略或先观察影响范围。
- 配置:
使用注意事项
-
需要选择合适的策略控制器:
- Kyverno 的规则表述更贴近 Kubernetes 用户,对新手相对友好。
- OPA Gatekeeper 使用 Rego 语言编写策略,功能强大但学习曲线较陡。
- PodSecurity 使用内置的、基于标签的标准,免去部署额外组件的负担。
-
不能完全依赖策略控制器: 它主要拦截通过 API Server 的请求,对于已经在运行(Pre-existing)的资源,需要运行审计(Audit)或定期扫描(如使用 Trivy)。
-
需要预留逃生通道: 在配置非常严格的策略(如禁止使用 root 用户)时,需要为关键系统组件(如
kube-system命名空间中的 DaemonSet)添加豁免配置(Exclusion),否则可能导致集群崩溃。
是的,策略控制器的核心功能之一就是根据预定义的规则,在部署阶段阻断不合规的请求。 将它们配置为强制阻断模式是保障集群安全与合规的有效方式,但通常建议先在审计/告警模式下测试策略,确认没有误伤合法业务后,再切换到阻断模式。