Helm模板转换JSON报错:如何将values.yaml的JSON字符串转为列表?
问题分析与解决
你的核心问题不是JSON转列表的失败,而是模板渲染后生成的YAML结构不符合Kubernetes网络策略的语法要求:你把ports部分放在了egress列表的外部,导致YAML解析时找不到对应的父键。
修正后的实现方案
首先,fromJson函数已经正确将JSON字符串转换成了列表,只需调整模板结构,让ports成为每个egress条目的子属性(因为每个出站规则需要同时指定目标IP和端口):
修改后的netpol.yaml
spec: podSelector: matchLabels: name: log-forwarder policyTypes: - Egress egress: {{- $json := .Values.network.cidrs | fromJson -}} {{- range $cidr := $json }} - to: - ipBlock: cidr: {{ $cidr }} ports: - protocol: TCP port: 443 {{- end }}
额外优化建议
如果你的values.yaml不需要兼容非Helm的场景,其实可以直接定义为YAML列表,省去JSON转义的麻烦:
优化后的values.yaml
network: cidrs: - "123.123.123.123/32" - "123.124.125.125/32"
对应的模板也可以简化为:
spec: podSelector: matchLabels: name: log-forwarder policyTypes: - Egress egress: {{- range $cidr := .Values.network.cidrs }} - to: - ipBlock: cidr: {{ $cidr }} ports: - protocol: TCP port: 443 {{- end }}
内容的提问来源于stack exchange,提问作者devcodes
相关产品推荐
相关产品推荐

