1. Gatekeeper 概述
1.1 项目背景:Kubernetes 策略治理的演进
Kubernetes 作为容器编排的事实标准,其声明式 API 和最终一致性模型为应用交付带来了极大便利。然而,随着集群规模扩大和多租户场景普及,如何对资源创建、Pod 调度、安全上下文等操作进行事前校验和持续合规,成为运维团队的核心痛点。
早期社区主要依赖 Admission Webhook 实现自定义校验,但这种方式存在明显短板:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 原生 Admission Webhook | 灵活、可编程 | 每个策略需独立开发 Webhook 服务;策略变更需重新部署;缺乏统一审计与告警 |
| PodSecurityPolicy (PSP) | 内置资源、配置简单 | 策略模型僵化;难以扩展自定义规则;已在 v1.25 移除 |
| Gatekeeper | 声明式策略、热加载、审计、可扩展 | 冷启动性能开销;Rego 学习曲线 |
Gatekeeper 由 Google、微软、Styra 等公司联合发起,于 2019 年进入 CNCF 沙箱,2022 年晋升为毕业项目。它基于 OPA (Open Policy Agent) 引擎,将策略从硬编码的 Webhook 逻辑中解耦,以 CRD (Custom Resource Definition) 的形式管理策略生命周期,成为 Kubernetes 策略治理的事实标准。
1.2 OPA 与 Rego 简介
OPA 是一个开源的、通用的策略引擎,它将策略决策与业务逻辑分离。OPA 接收结构化数据(JSON/YAML)作为输入,输出“允许/拒绝”或更复杂的策略评估结果。其核心组件包括:
- Rego 语言:OPA 的声明式查询语言,灵感来源于 Datalog,专为策略定义设计。
- 数据文档:OPA 将输入数据和策略规则统一视为文档,通过查询表达式进行匹配。
- 内置函数库:提供字符串、正则、时间、JWT 等常用操作函数。
Rego 核心特性:
- 声明式:只描述“策略应该是什么”,而非“如何执行”。
- 不可变:每次查询基于快照,无副作用。
- 可组合:规则可以分层、继承、复用。
以下是一个简单的 Rego 策略示例,用于禁止使用 latest 标签的镜像:
package k8s.requiredlabels
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
endswith(container.image, ":latest")
msg := sprintf("容器 %v 使用了 latest 标签,请指定固定版本", [container.name])
}
1.3 Gatekeeper 在 Kubernetes 中的角色与价值
Gatekeeper 以 Admission Webhook 的形式嵌入 Kubernetes API 请求链路,同时提供 审计 (Audit) 和 约束模板 (ConstraintTemplate) 机制。其核心架构如下图所示:
Gatekeeper 为 Kubernetes 带来的核心价值体现在以下四个维度:
- 策略即代码 (Policy as Code):使用 Rego 编写策略,存储在 Git 仓库中,支持版本控制、代码审查和 CI/CD 集成。
- 热加载与动态更新:新增或修改 ConstraintTemplate / Constraint 后,无需重启 Webhook 服务,OPA 引擎自动重新编译策略。
- 审计与合规报告:审计模块定期扫描集群中已有资源,标记违反策略的对象,并生成
violations状态。 - 多租户资源配额:结合 Namespace 标签和资源配额约束,实现细粒度的资源限制,防止单个租户过度占用集群资源。
冷启动性能挑战: Gatekeeper 在首次加载大量 ConstraintTemplate 或集群重启时,OPA 引擎需要编译所有 Rego 策略并构建数据缓存,这个过程可能导致 Webhook 响应延迟飙升,甚至触发 API Server 的超时重试。本课程后续章节将深入分析冷启动的瓶颈,并给出系统化的优化方案。