Kyverno中JMESPath过滤投影被跳过的技术咨询
关于Kyverno中JMESPath过滤投影的问题
我配置了如下ClusterPolicy与Deployment资源,意图当特定容器c2的内存请求大于1Gi时触发策略:
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: enforce-memory spec: rules: - name: require-memory-less-than-16Gi match: any: - resources: kinds: - Pod preconditions: any: - key: "{{ request.object.spec.containers[?name=='c2'].resources.requests.memory}}" operator: GreaterThan value: 1Gi validate: ... --- apiVersion: apps/v1 kind: Deployment ... spec: template: spec: containers: - env: name: c1 resources: requests: memory: 100Mi - env: name: c2 resources: requests: memory: 16Gi
我使用JMESPath的过滤投影筛选c2容器,但在Kyverno Playground中评估策略时,?name=='c2'过滤投影被标记为Skipped。若改用基于索引的过滤(如spec.containers[1].resources),条件则可正常满足。
我的问题如下:
- Kyverno是否支持JMESPath Filter Projections?
- 若支持,为何示例中的
?name=='c2'过滤投影会被跳过?
问题解答
1. Kyverno对JMESPath过滤投影的支持情况
Kyverno支持JMESPath过滤投影,但存在使用场景限制:过滤投影仅能在foreach循环、变量定义,或match/preconditions之外的字段中正常生效。直接在preconditions的key字段中使用过滤投影,会因Kyverno的表达式评估逻辑限制,无法正确解析执行。
2. 示例中过滤投影被跳过的原因
你遇到的问题主要有两个原因:
- Kyverno在处理
preconditions的key字段时,会将整个JMESPath过滤投影表达式当作字符串处理,无法执行实际的过滤逻辑; - 过滤投影返回的结果是一个数组(即便只有一个匹配容器),而
GreaterThan运算符要求输入单个数值或字符串值,类型不匹配直接导致条件被跳过。
正确实现方式
要实现针对c2容器的内存请求校验,推荐使用Kyverno的foreach循环遍历容器,先匹配目标容器再校验规则:
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: enforce-memory spec: rules: - name: require-memory-less-than-16Gi match: any: - resources: kinds: - Pod preconditions: any: - key: "{{ request.object.spec.containers[].name }}" operator: Contains value: "c2" validate: message: "容器c2的内存请求必须小于16Gi" foreach: - list: "request.object.spec.containers" preconditions: any: - key: "{{ element.name }}" operator: Equals value: "c2" deny: conditions: any: - key: "{{ element.resources.requests.memory }}" operator: GreaterThan value: 1Gi
这个策略先判断Pod中是否存在c2容器,再通过foreach遍历容器,仅对c2执行内存校验,能正确触发预期规则。
内容的提问来源于stack exchange,提问作者E. Pratt
相关产品推荐
相关产品推荐

