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

使用Helm Range遍历Values.yaml生成Service.yaml遇字段差异问题求助

解决方案:用Helm Range迭代异构服务配置生成Service资源

首先建议优化你的Values.yaml结构,把分散的service1/service2/service3整理成数组格式,更便于Helm的Range迭代处理:

优化后的Values.yaml

metadata:
  name: my-app
services:
  - name: nginx
    protocol: TCP
    type: ClusterIP
    port: 8080
  - protocol: TCP
    port: 9000
    type: ClusterIP
  - name: nginx
    protocol: TCP
    port: 8080
    extraPorts:
      - name: userstore
        port: 1233
    store: abcstore
    type: ClusterIP

如果不想修改原有Values结构,也可以直接迭代顶层的service*键,不过需要过滤非服务类字段。以下是两种场景的模板实现:


基于优化后数组结构的Service模板

创建templates/service.yaml,核心逻辑是处理可选字段和额外端口:

{{- range $idx, $service := .Values.services }}
apiVersion: v1
kind: Service
metadata:
  # 无name时自动生成名称
  name: {{ $service.name | default (printf "service-%d" $idx) }}
  namespace: {{ $.Release.Namespace }}
spec:
  selector:
    app: {{ $.Values.metadata.name }}
  ports:
    # 生成主端口配置
    - name: {{ $service.name | default (printf "port-%d" $service.port) }}
      protocol: {{ $service.protocol | default "TCP" }}
      port: {{ $service.port }}
      targetPort: {{ $service.port }}
    # 处理额外端口
    {{- if $service.extraPorts }}
    {{- range $extraPort := $service.extraPorts }}
    - name: {{ $extraPort.name }}
      protocol: {{ $extraPort.protocol | default $service.protocol | default "TCP" }}
      port: {{ $extraPort.port }}
      targetPort: {{ $extraPort.port }}
    {{- end }}
    {{- end }}
  type: {{ $service.type | default "ClusterIP" }}
---
{{- end }}

模板逻辑说明

  • 用range遍历服务数组,$idx作为索引处理无name的服务,自动生成名称
  • 用| default给缺失字段设置默认值,比如默认协议为TCP、默认服务类型为ClusterIP
  • 通过{{- if $service.extraPorts }}判断是否存在额外端口,存在则迭代生成对应配置

兼容原Values结构的Service模板

如果坚持使用原有的顶层service1/service2/service3结构,可使用以下模板:

{{- range $key, $service := .Values }}
{{- if hasPrefix "service" $key }}
apiVersion: v1
kind: Service
metadata:
  name: {{ $service.name | default $key }}
  namespace: {{ $.Release.Namespace }}
spec:
  selector:
    app: {{ $.Values.metadata.name }}
  ports:
    - name: {{ $service.name | default (printf "%s-port" $key) }}
      protocol: {{ $service.protocol | default "TCP" }}
      port: {{ $service.port }}
      targetPort: {{ $service.port }}
    # 特殊处理service3的userstore字段
    {{- if $service.userstore }}
    - name: userstore
      protocol: {{ $service.protocol | default "TCP" }}
      port: {{ $service.userstore }}
      targetPort: {{ $service.userstore }}
    {{- end }}
  type: {{ $service.type | default "ClusterIP" }}
---
{{- end }}
{{- end }}

模板逻辑说明

  • 用hasPrefix "service" $key过滤出所有服务配置项
  • 对service3特有的userstore字段单独判断生成端口条目,适合字段差异较少的场景

示例生成结果

以优化后的Values为例,第三个服务会生成包含额外端口的配置:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
spec:
  selector:
    app: my-app
  ports:
    - name: nginx
      protocol: TCP
      port: 8080
      targetPort: 8080
    - name: userstore
      protocol: TCP
      port: 1233
      targetPort: 1233
  type: ClusterIP
---

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:15:34