如何从Helm的values.yaml中获取数组内的host值传入Ingress文件
解决方案
直接引用单个Host值
如果你的values.yaml里只有一个Host条目,直接通过数组索引引用即可,不需要tpl函数:
# templates/ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{ .Release.Name }}-ingress spec: rules: - host: {{ .Values.hosts.0.host }} # 直接取第一个元素的host字段 http: paths: - path: / pathType: Prefix backend: service: name: {{ .Release.Name }}-service port: number: 80
遍历多个Host条目
如果values.yaml里有多个Host需要配置到Ingress中,用range循环遍历数组即可:
# templates/ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{ .Release.Name }}-ingress spec: rules: {{- range .Values.hosts }} # 遍历hosts数组 - host: {{ .host }} # 取当前元素的host字段 http: paths: - path: / pathType: Prefix backend: service: name: {{ $.Release.Name }}-service # 用$引用根上下文的Release变量 port: number: 80 {{- end }}
正确使用tpl函数的场景
如果你的Host值本身包含模板变量(比如需要动态注入Release名称),才需要用tpl函数,核心是要传递模板上下文(.)作为第二个参数:
比如修改values.yaml为:
hosts: - host: "{{ .Release.Name }}.defg.hij.io"
然后在Ingress模板中这样使用tpl:
# templates/ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{ .Release.Name }}-ingress spec: rules: - host: {{ tpl .Values.hosts.0.host . }} # 第二个参数.必须传递,用于解析模板变量 http: paths: - path: / pathType: Prefix backend: service: name: {{ .Release.Name }}-service port: number: 80
之前用tpl失败大概率是因为没传递第二个上下文参数,导致模板无法解析内部变量。
内容的提问来源于stack exchange,提问作者Arun Baby
相关产品推荐
相关产品推荐

