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

Rego遍历嵌套列表实现K8s按命名空间校验LoadBalancer服务白名单

按命名空间维度管控LoadBalancer服务的修改方案

需要同步调整ConstraintTemplate的参数校验Schema和Rego匹配逻辑,具体修改如下:

1. 修改ConstraintTemplate

首先更新openAPIV3Schema的结构定义,适配「命名空间对应允许服务列表」的参数格式,再重写白名单匹配逻辑,同时修复原有Rego代码中sprintf语句缺少逗号的语法问题。
完整可用的ConstraintTemplate配置:

spec:
  crd:
    spec:
      names:
        kind: K8sMetalLBServicesGK
      validation:
        openAPIV3Schema:
          properties:
            allowedLBServices:
              type: array
              items:
                type: object
                # 数组元素为单键值对:key是命名空间名称,value是该空间允许创建的LB服务名列表
                additionalProperties:
                  type: array
                  items:
                    type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8smetallbservicesgk

        violation[{"msg": msg}] {
          is_not_getting_deleted
          is_type_loadbalancer
          svc := input.review.object.metadata.name
          ns := input.review.object.metadata.namespace
          # 拉取当前请求所属命名空间的允许服务列表
          allowed_patterns := get_allowed_services_for_ns(ns)
          # 匹配服务名,无匹配规则则拦截
          satisfied := [good | pattern := allowed_patterns[_] ; good = glob.match(pattern, [], svc)]
          not any(satisfied)
          msg := sprintf("命名空间%v中LoadBalancer服务%v创建被Gatekeeper拦截,无对应创建权限", [ns, svc])
        }

        # 工具方法:获取指定命名空间配置的允许服务列表,未配置则返回空数组
        get_allowed_services_for_ns(ns) = patterns {
          entry := input.parameters.allowedLBServices[_]
          patterns := entry[ns]
        }
        get_allowed_services_for_ns(ns) = [] {
          not entry := input.parameters.allowedLBServices[_][ns]
        }

        is_not_getting_deleted() = true {
          input.review.operation != "DELETE"
          not input.review.object.metadata.deletionTimestamp
        }

        is_type_loadbalancer() = true {
          input.review.object.spec.type == "LoadBalancer"
        }

规则保留了原有的glob通配符匹配能力,服务名支持写通配符做批量放通,比如配置"*-api"即可匹配所有后缀为-api的服务;如果要放通某命名空间下所有LoadBalancer服务,在对应命名空间的列表里加"*"即可。


2. Constraint配置使用

你给出的目标Constraint结构无需调整,直接应用即可实现预期效果:

  • ham命名空间仅允许创建pakalu、papito两个LoadBalancer服务
  • spam命名空间仅允许创建pakalu、foo两个LoadBalancer服务
  • 未在allowedLBServices中配置的命名空间,创建任何LoadBalancer服务都会被拦截
  • 所有匹配*-system后缀的命名空间保持豁免,不受该规则限制

完整Constraint参考:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sMetalLBServicesGK
metadata:
  name: metallb-lb-service-whitelist
spec:
  match:
    excludedNamespaces: ["*-system"]
    kinds:
      - apiGroups: ["*"]
        kinds: ["Service"]
  parameters:
    allowedLBServices:
      - ham:
          - pakalu
          - papito
      - spam:
          - pakalu
          - foo

内容的提问来源于stack exchange,提问作者carrotcakeslayer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:48:18