You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:03:25