策略定义与策略实例的基本概念
策略定义
在创建策略实例之前,您需要先定义一个策略定义,它描述了强制执行约束的Rego代码和约束的模式。约束的模式允许管理员像调整函数参数一样微调约束的行为。策略定义中的Rego代码描述了强制执行的具体逻辑,根据您的需求来实现不同的合规性规则。而约束模式则提供了一种灵活的方式,让管理员在创建策略实例时,能够根据实际需求调整策略行为,以满足不同场景的合规控制需求。策略定义的详细说明请参见官方文档。
下面是一个示例策略定义,它要求所有在约束中描述的标签都必须存在。
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
spec:
crd:
spec:
names:
kind: K8sRequiredLabels
validation:
# Schema for the `parameters` field
openAPIV3Schema:
type: object
properties:
labels:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredlabels
violation[{"msg": msg, "details": {"missing_labels": missing}}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[_]}
missing := required - provided
count(missing) > 0
msg := sprintf("you must provide labels: %v", [missing])
}
策略实例
策略实例用于告知Gatekeeper应执行哪个策略定义以及如何执行。策略实例的详细说明请参见官方文档。
下面是一个策略实例示例,该示例使用先前提到的K8sRequiredLabels策略定义,确保Gatekeeper在所有命名空间上强制执行指定的标签。
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: ns-must-have-gk
spec:
enforcementAction: deny
match:
kinds:
- apiGroups: [""]
kinds: ["Namespace"]
parameters:
labels: ["gatekeeper"]
改策略实例示例指定了使用“K8sRequiredLabels”策略定义并将执行策略的操作设置为“deny”,这意味着Gatekeeper将拒绝违反策略的请求。“match”部分限制了此策略实例仅适用于命名空间资源。“parameters”部分指定了必须存在于资源上的标签,本例中为“gatekeeper”。