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

Kyverno配置问题:限制LoadBalancer类型Service的端口使用范围

修复Kyverno LoadBalancer Service端口限制规则

你的配置存在几个关键问题导致未达到预期效果,下面是问题分析和修正后的完整配置:

原配置的问题点

  • 规则语法错误:rules字段下的规则定义缺少列表符号 -,Kyverno无法正确识别规则结构
  • 模板语法错误:preconditions中的表达式包含多余空格,正确的模板变量写法是{{request.object.spec.type}}(无空格)
  • 端口校验逻辑不严谨:原pattern仅校验存在一个8000端口,但未限制所有端口必须为8000,无法覆盖多端口Service的场景
  • 排除规则位置错误:exclude应配置在规则层级,确保仅对非ingress命名空间的LoadBalancer Service生效

修正后的ClusterPolicy配置

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: allowed-ports-loadbalancer
spec:
  background: false
  validationFailureAction: enforce
  rules:
    - name: validate-loadbalancer-ports
      match:
        resources:
          kinds:
            - Service
      exclude:
        resources:
          namespaces:
            - ingress
      preconditions:
        all:
          - key: "{{request.object.spec.type}}"
            operator: Equals
            value: "LoadBalancer"
      validate:
        pattern:
          spec:
            ports:
              - port: 8000
        foreach:
          - list: "request.object.spec.ports[]"
            deny:
              conditions:
                all:
                  - key: "{{ element.port }}"
                    operator: NotEquals
                    value: 8000

配置说明

  1. 规则结构修正:给rules添加列表符号 -,确保规则被Kyverno正确解析
  2. 模板语法修正:移除变量中的多余空格,保证表达式能正常求值
  3. 端口校验增强:使用foreach遍历所有端口,拒绝任何非8000的端口,覆盖多端口Service场景
  4. 排除规则调整:将exclude放在规则层级,仅排除ingress命名空间的Service,完全匹配需求逻辑

验证方法

  • 在非ingress命名空间创建LoadBalancer Service,若端口不是8000,会被Kyverno拒绝
  • 在ingress命名空间创建任意端口的LoadBalancer Service,可正常通过校验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:42:05