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
相关产品推荐
相关产品推荐

