Open Policy Agent Gatekeeper 中的 ConstraintTemplates 详解
什么是 ConstraintTemplates
ConstraintTemplates 是 Open Policy Agent Gatekeeper 项目的核心组件之一,它为 Kubernetes 集群提供了一种强大的策略执行机制。简单来说,ConstraintTemplates 定义了如何验证 Kubernetes 对象的方法,通过 Gatekeeper 的准入控制器来实现策略执行。
ConstraintTemplates 的组成要素
每个 ConstraintTemplate 包含两个关键部分:
- Rego 策略代码:使用 Rego 语言编写的策略逻辑,用于定义什么样的 Kubernetes 对象会被视为违反策略
- 约束模式(Schema):定义了与之关联的 Constraint 对象的结构,Constraint 是 ConstraintTemplate 的具体实例化
v1 版本的 ConstraintTemplate
从 Gatekeeper 3.6.0 版本开始,引入了 v1 版本的 ConstraintTemplate。与之前的 v1beta1 版本相比,v1 版本有一个重要变化:它要求 Constraint 的模式部分必须是结构化的(structural schema)。
结构化模式的要求
结构化模式有一系列要求,其中最重要的是必须在模式的每一层都明确指定 type
字段。让我们通过一个例子来说明这个变化:
在 v1beta1 版本中,常见的 k8srequiredlabels
ConstraintTemplate 定义如下:
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
spec:
crd:
spec:
names:
kind: K8sRequiredLabels
validation:
openAPIV3Schema:
properties:
labels:
type: array
items:
type: string
注意这里的 parameters
字段模式(openAPIV3Schema
)缺少了 type
声明,这在 v1 版本中是不允许的。正确的 v1 版本应该这样写:
openAPIV3Schema:
type: object # 必须明确指定类型
properties:
labels:
type: array
items:
type: string
为什么需要这个改变?
这个改变主要有三个原因:
- 与 Kubernetes 发展方向一致:结构化模式是 v1 版本 CustomResourceDefinition 的要求,而 ConstraintTemplates 底层正是基于 CRD
- 提升可用性:结构化模式使得 ConstraintTemplate 关联的 Constraint 模式更加清晰可见
- 更好的类型验证:API 服务器现在会拒绝参数字段类型不正确的 Constraint
实际应用中的改进
让我们看一个实际的例子,说明这个改变如何帮助用户避免错误。
假设我们有一个错误的 k8srequiredlabels
Constraint 定义:
parameters:
- labels: ["gatekeeper"] # 错误的数组格式
在 v1beta1 版本中,这个错误的 Constraint 会被 API 服务器接受,但实际上不会工作。而在 v1 版本中,由于结构化模式的要求,API 服务器会直接拒绝这个错误的定义:
The K8sRequiredLabels "ns-must-have-gk" is invalid: spec.parameters: Invalid value: "array": spec.parameters in body must be of type object: "array"
正确的定义应该是:
parameters:
labels: ["gatekeeper"] # 正确的对象格式
这样修改后,Constraint 就能正常工作,正确地拒绝没有 gatekeeper
标签的命名空间创建请求。
最佳实践建议
- 始终指定类型:在定义 ConstraintTemplate 时,确保为每个字段明确指定类型
- 优先使用 v1 版本:新项目应直接使用 v1 版本的 ConstraintTemplate
- 测试约束:创建 Constraint 后,测试它是否能按预期工作
- 查看 API 文档:熟悉 Kubernetes 结构化模式的要求
通过理解和使用 ConstraintTemplates,您可以有效地在 Kubernetes 集群中实施各种安全策略和最佳实践,确保集群中的资源符合组织的规定和要求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考