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

如何将Helm Chart域名配置提取至独立文件并通过ArgoCD引用?

问题原因

你犯了一个关键错误:Helm的values文件(比如values.dev.yaml)不能包含模板语法{{ ... }}。values文件是用来提供配置值的文件,Helm不会解析其中的模板表达式,直接写{{ .Values.subdomains }}会导致YAML解析失败——YAML解析器把{{当成非法字符,因此报错找不到预期的冒号。

解决方法

要实现域名列表复用,需要在Chart的模板文件中直接引用subdomains数组,而非在values文件里使用模板语法。具体步骤如下:

1. 保留独立的subdomains配置文件

继续使用values.subdomains.dev.yaml定义域名数组:

subdomains:
 - test.example.com
 - test2.example.com

2. 修改Chart的Ingress模板文件

找到Chart中templates/ingress.yaml文件,调整其中的规则和TLS配置,直接引用.Values.subdomains:

原模板片段(示例):

spec:
  rules:
  {{- range .Values.ingress.hostname }}
    - host: {{ . }}
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: {{ include "app.fullname" . }}
                port:
                  number: 80
  {{- end }}
  {{- if .Values.ingress.tls }}
  tls:
  {{- range .Values.ingress.tls }}
    - secretName: {{ .secretName }}
      hosts:
      {{- range .hosts }}
        - {{ . }}
      {{- end }}
  {{- end }}
  {{- end }}

修改后的模板片段:

spec:
  rules:
  {{- range .Values.subdomains }}
    - host: {{ . }}
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: {{ include "app.fullname" $ }}  # 用$引用根上下文
                port:
                  number: 80
  {{- end }}
  {{- if .Values.ingress.tls }}
  tls:
  {{- range .Values.ingress.tls }}
    - secretName: {{ .secretName }}
      hosts:
      {{- range $.Values.subdomains }}  # 用$引用根上下文的subdomains
        - {{ . }}
      {{- end }}
  {{- end }}
  {{- end }}

3. 简化values.dev.yaml

既然模板直接引用subdomains,values.dev.yaml里不需要再重复配置hostname和tls.hosts:

ingress:
  enabled: true
  ingressClassName: nginx
  tls:
    - secretName: wildcard-subdomain-cert
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 40m
    nginx.ingress.kubernetes.io/server-tokens: "false"

4. 验证配置

本地先执行Helm模板命令测试:

helm template . --name-template app --namespace frontend --values values.dev.yaml --values values.subdomains.dev.yaml

如果能正常生成Ingress资源,说明配置正确,再通过ArgoCD同步应用即可。

替代方案(无需修改Chart模板)

如果无法修改Chart模板,可以通过ArgoCD的parameters字段传递合并后的数组:
在ArgoCD应用Manifest中添加:

spec:
  source:
    helm:
      valueFiles:
        - values.dev.yaml
        - values.subdomains.dev.yaml
      parameters:
        - name: ingress.hostname
          value: "{{ .Values.subdomains }}"
        - name: ingress.tls[0].hosts
          value: "{{ .Values.subdomains }}"

但这种方式不如修改模板优雅,且需要注意数组的传递格式,优先推荐修改模板的方案。

内容的提问来源于stack exchange,提问作者Mr.P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:25:23