在多人协作的Kubernetes集群中,资源提交的速度往往快于人工审查的速度。开发者可能随手提交一个使用latest标签的镜像,或者创建一个没有任何资源限制的Pod,这些看似小的疏忽在规模扩大后会演变成严重的安全和稳定性问题。Gatekeeper是Open Policy Agent(OPA)官方维护的Kubernetes策略引擎,它以Admission Webhook的形式接入API Server,在资源写入前对YAML内容做规则校验,不通过的直接拒绝。本文将从架构原理、规则编写到实战场景,完整讲解Gatekeeper的使用方法。

Gatekeeper的核心架构与工作机制
Gatekeeper由三个主要组件构成:Webhook服务、Audit控制器和同步模块。Webhook服务负责处理API Server转发过来的准入请求,这是策略执行的主路径。当用户执行kubectl apply时,请求会先经过 mutating webhook,再到达 Gatekeeper 注册的 validating webhook,Gatekeeper根据已加载的策略判断是否放行。
Audit控制器的作用同样重要。策略是事后加载的,存量资源可能已经不合规,Audit控制器会周期性地扫描集群中的资源,把违反策略的对象记录成ConstraintStatus中的违规条目,方便管理员了解整体合规率。同步模块则负责把Kubernetes对象的数据复制到OPA引擎内部,供策略查询使用,比如判断某个命名空间的标签。
与直接使用OPA原生的kube-mgmt方案相比,Gatekeeper最大的改进在于引入了CRD(自定义资源定义)。策略逻辑被抽象成ConstraintTemplate资源,策略实例则是对应的Constraint资源,运维人员不需要直接编写OPA的rego语言就能复用社区提供的现成模板,大幅降低了使用门槛。
ConstraintTemplate与Constraint的编写方法
ConstraintTemplate定义了一类约束的通用逻辑和参数结构,其中包含一段rego代码和一个CUE描述的参数模式。下面是一个限制镜像必须来自指定仓库的模板示例:
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8sallowedrepos
spec:
crd:
spec:
names:
kind: K8sAllowedRepos
validation:
openAPIV3Schema:
type: object
properties:
repos:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sallowedrepos
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
satisfied := [good | repo = input.parameters.repos[_]
good = startswith(container.image, repo)]
not any(satisfied)
msg := sprintf("镜像 %v 不在允许的仓库列表中", [container.image])
}模板创建后,Gatekeeper会动态生成一个名为K8sAllowedRepos的CRD。接下来实例化具体的约束,只需要传入参数即可,同一个模板可以在不同环境创建多个实例,比如测试环境允许使用内部仓库,生产环境只允许经过审批的镜像源。
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedRepos
metadata:
name: prod-repo-whitelist
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
namespaces: ["production"]
parameters:
repos:
- "registry.ipipp.com/"
- "docker.io/library/"match字段是参数化之外另一个关键配置,它可以按资源类型、命名空间、标签选择器等多个维度过滤约束的作用范围。合理使用match能避免策略误伤系统命名空间,比如排除kube-system下的DaemonSet。此外还可以通过excludedNamespaces做反向排除,组合出精细的管控边界。
实际场景落地与调试技巧
以强制资源配额为例,很多团队要求所有容器必须声明requests和limits,否则集群调度器无法合理分配资源。编写对应的模板后,提交一个没有资源配置的Pod会立即收到类似admission webhook denied the request的错误提示,开发者能在第一时间修正问题,而不是等到Pod被OOM Kill之后才排查。
调试策略时有一个非常实用的技巧:先创建带enforcementAction: dryrun的约束。dryrun模式下违规资源不会被拒绝,只会被记录,团队可以借此观察策略上线后的实际影响面,确认无误后再切换到deny模式。配合kubectl get constrainttemplates查看模板状态、kubectl get K8sAllowedRepos查看违规统计,排查效率会高很多。
需要注意的一个常见坑是策略冲突。当多个约束命中同一资源时,任何一个violation都会导致请求被拒绝,因此策略设计时要保证规则语义清晰、职责单一。另外,Gatekeeper的Webhook出现故障时可能阻塞整个集群的资源写入,生产环境建议配置failurePolicy为Ignore并部署多副本保证高可用,同时在升级策略前先用gator test本地验证rego逻辑,避免线上试错。
总的来说,Gatekeeper把集群治理从口头约定变成了可版本化、可审计的代码资产。配合GitOps流程,策略文件与应用清单一起进入代码评审,集群的安全基线就有了真正的执行保障。建议从dryrun模式起步,优先落地镜像来源和资源配额这类收益明显的规则,再逐步扩展到标签规范和网络策略领域。
GatekeeperKubernetes策略管理OPA修改时间:2026-09-16 12:34:31