为何Gatekeeper ConstraintTemplate多Rego规则生效而合并规则失效?
Gatekeeper副本数约束规则生效差异解析
生效的双规则实现
以下是能正确阻止副本数超出限制的Deployment的ConstraintTemplate规则:
package minmaxreplicasreplicaset violation[{"msg": msg}] { replicas := input.review.object.spec.replicas min :=input.parameters.min max := input.parameters.max not (replicas > min) msg := sprintf("replicas %v not between %v %v", [replicas, min, max]) } violation[{"msg": msg}] { replicas := input.review.object.spec.replicas min :=input.parameters.min max := input.parameters.max not (replicas < max) msg := sprintf("replicas %v not between %v %v", [replicas, min, max]) }
不生效的单规则实现
而将边界条件合并到同一个violation规则后,无法触发违规拦截:
package minmaxreplicasreplicaset violation[{"msg": msg}] { replicas := input.review.object.spec.replicas min :=input.parameters.min max := input.parameters.max not (replicas > min) not (replicas < max) msg := sprintf("replicas %v not between %v %v", [replicas, min, max]) }
差异原因
这是因为Gatekeeper依赖的OPA规则逻辑是所有条件同时满足才会触发violation:
分开的两个规则分别覆盖了两种违规场景:
- 第一个规则:当副本数≤最小值(
not (replicas > min))时触发违规 - 第二个规则:当副本数≥最大值(
not (replicas < max))时触发违规
这刚好覆盖了所有超出[min, max]范围的情况,所以能正确拦截不符合要求的Deployment。
- 第一个规则:当副本数≤最小值(
合并后的规则要求两个条件同时成立:副本数≤最小值 且 副本数≥最大值。正常配置下
min < max,这种矛盾的情况根本不存在,所以规则永远不会触发,自然无法拦截违规操作。
内容的提问来源于stack exchange,提问作者somedude
相关产品推荐
相关产品推荐

