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

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),条件则可正常满足。

我的问题如下:

  1. Kyverno是否支持JMESPath Filter Projections?
  2. 若支持,为何示例中的?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:51:03