Gatekeeper中如何用Rego校验Map是否包含禁止列表中的Key
Gatekeeper场景下校验禁止注解的Rego实现
核心逻辑为提取资源metadata.annotations下的所有键名,与配置的禁止注解列表做匹配,只要存在任意重叠项就触发违规,全程不校验注解对应取值。
完整Rego规则代码
以下代码可直接嵌入Gatekeeper的Constraint Template中使用,自带字段兜底兼容,不会因资源缺少annotations字段、未配置禁止列表抛出运行时错误:
package k8sdeniedannotations violation[{"msg": msg}] { # 读取资源annotations字段,不存在时兜底为空对象 annotations := object.get(input.review.object.metadata, "annotations", {}) # 读取传入的禁止注解配置,未配置时兜底为空列表 denied_list := object.get(input.parameters, "denied", []) # 遍历当前资源实际存在的所有注解键 existing_key := object.keys(annotations)[_] # 判定注解键是否命中禁止列表 existing_key == denied_list[_] # 生成违规提示信息 msg := sprintf("资源包含禁止使用的注解「%v」,当前生效的禁止注解列表为%v", [existing_key, denied_list]) }
配套Gatekeeper资源示例
约束模板(Constraint Template)
apiVersion: templates.gatekeeper.sh/v1 kind: ConstraintTemplate metadata: name: k8sdeniedannotations spec: crd: spec: names: kind: K8sDeniedAnnotations validation: openAPIV3Schema: type: object properties: denied: type: array items: type: string description: 禁止使用的注解键列表 targets: - target: admission.k8s.gatekeeper.sh rego: | package k8sdeniedannotations violation[{"msg": msg}] { annotations := object.get(input.review.object.metadata, "annotations", {}) denied_list := object.get(input.parameters, "denied", []) existing_key := object.keys(annotations)[_] existing_key == denied_list[_] msg := sprintf("资源包含禁止使用的注解「%v」,当前生效的禁止注解列表为%v", [existing_key, denied_list]) }
约束规则(Constraint)
你可以在约束的parameters.denied字段下配置需要拦截的注解键,同时在spec.match字段指定需要校验的资源范围:
apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sDeniedAnnotations metadata: name: block-forbidden-annotations spec: match: kinds: - apiGroups: [""] kinds: ["Pod", "Service", "ConfigMap"] - apiGroups: ["networking.k8s.io"] kinds: ["Ingress"] parameters: denied: - external-dns.alpha.kubernetes.io/ttl - other-denied-annotation-1 - other-denied-annotation-2
关键逻辑说明
- 采用
object.get做字段空值兜底,兼容无annotations字段的资源、未配置denied列表的场景,避免规则运行时报错 - 先提取资源上实际存在的注解键再做匹配,不会触发不存在键的查询异常,性能也优于遍历禁止列表反向查询注解
- 单资源存在多个禁止注解时,会逐个生成对应的违规提示,不会遗漏告警
内容的提问来源于stack exchange,提问作者carrotcakeslayer
相关产品推荐
相关产品推荐

