Kubernetes ConstraintTemplate包相关问题及禁用stable镜像标签需求咨询
Kubernetes Gatekeeper ConstraintTemplate 中的包及自定义策略实现
1. ConstraintTemplate 中的包是什么?
在OPA Gatekeeper的ConstraintTemplate里,**包(Package)**是Rego规则的命名空间,用来隔离不同策略的规则逻辑,避免命名冲突。每个Template的Rego代码必须归属到一个指定的包下,Gatekeeper会通过这个包关联Constraint(具体策略实例)和Template中的规则逻辑。
包名通常遵循类似templates.<template-short-name>的命名习惯(比如templates.nostableimage),但只要符合Rego命名规范(小写字母、点分隔),可自由定义。
2. 能否用Rego创建自定义包?
当然可以。自定义包是Gatekeeper自定义策略开发的核心,你只需在ConstraintTemplate的spec.targets[0].rego字段中,以package <你的自定义包名>开头编写规则即可。自定义包允许你灵活组织规则逻辑,还能结合Template的CRD定义接收外部参数,让策略更通用。
3. 禁止Deployment使用stable镜像标签的实现示例
步骤1:创建ConstraintTemplate(含自定义包)
apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: k8snostableimage spec: crd: spec: names: kind: K8sNoStableImage validation: openAPIV3Schema: type: object properties: exemptNamespaces: type: array items: type: string targets: - target: admission.k8s.gatekeeper.sh rego: | package templates.nostableimage violation[{"msg": msg, "details": {"image": image}}] { # 仅校验Deployment资源 input.review.kind.kind == "Deployment" # 排除豁免命名空间的资源 not input.review.object.metadata.namespace in input.parameters.exemptNamespaces # 遍历所有容器 container := input.review.object.spec.template.spec.containers[_] # 检查镜像是否包含stable标签 contains(container.image, ":stable") image := container.image msg := sprintf("Deployment %s/%s 使用了禁用的'stable'镜像标签:%s", [input.review.object.metadata.namespace, input.review.object.metadata.name, image]) }
步骤2:创建Constraint(策略实例)
apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sNoStableImage metadata: name: no-stable-image-tag spec: match: kinds: - apiGroups: ["apps"] kinds: ["Deployment"] parameters: exemptNamespaces: ["kube-system"] # 豁免kube-system命名空间下的Deployment
规则说明
- 自定义包名为
templates.nostableimage,所有校验规则归属在此包下 - 规则会拦截非豁免命名空间中,容器镜像带有
:stable标签的Deployment - 触发违规时会返回具体的Deployment名称和镜像地址,方便排查定位
内容的提问来源于stack exchange,提问作者Aishvarya Suryawanshi
相关产品推荐
相关产品推荐

