如何从values.yaml的列表结构中填充deployment.yaml部署值?
解决K8s Deployment中嵌套列表配置的环境变量注入问题
原始配置(values.yaml)
S3Catalogs: Catalogs: - CatalogName: BotVoice Url: "http://sandbox5.*.com" - CatalogName: WrongVoice Url: "http://sandbox5.*.com"
问题场景
需要将上述嵌套列表结构的配置注入到Deployment的环境变量中,但尝试过索引(如[0])、扁平键名(如S3Catalogs__Catalogs)等写法均无法生效,比如以下写法完全不起作用:
- name: S3Catalogs__Catalogs value: "{{ .Values.S3Catalogs.Catalogs }}" - name: S3Catalogs__Catalogs__Url value: "{{ .Values.S3Catalogs.Catalogs.Url}}"
可行解决方案
方案1:将列表序列化为JSON字符串注入
如果你的应用程序支持解析JSON格式的环境变量,直接把整个Catalogs列表序列化为JSON:
env: - name: S3_CATALOGS value: "{{ toJson .Values.S3Catalogs.Catalogs }}"
注入后环境变量的值会是标准JSON结构:
[{"CatalogName":"BotVoice","Url":"http://sandbox5.*.com"},{"CatalogName":"WrongVoice","Url":"http://sandbox5.*.com"}]
方案2:遍历列表生成独立环境变量
如果需要为每个Catalog单独生成环境变量,用Helm的range循环遍历列表项:
env: {{- range $index, $catalog := .Values.S3Catalogs.Catalogs }} - name: S3_CATALOG_{{$index}}_NAME value: "{{ $catalog.CatalogName }}" - name: S3_CATALOG_{{$index}}_URL value: "{{ $catalog.Url }}" {{- end }}
渲染后会生成对应每个列表项的环境变量:
env: - name: S3_CATALOG_0_NAME value: "BotVoice" - name: S3_CATALOG_0_URL value: "http://sandbox5.*.com" - name: S3_CATALOG_1_NAME value: "WrongVoice" - name: S3_CATALOG_1_URL value: "http://sandbox5.*.com"
原写法失效原因
- 直接引用
.Values.S3Catalogs.Catalogs会输出Go模板默认的列表字符串格式(类似[{BotVoice http://sandbox5.*.com} {WrongVoice http://sandbox5.*.com}]),不是应用能识别的有效结构。 .Values.S3Catalogs.Catalogs.Url是错误语法:Catalogs是列表类型,必须通过索引(如.Values.S3Catalogs.Catalogs[0].Url)或遍历才能访问内部字段,直接访问会返回空值。
内容的提问来源于stack exchange,提问作者Iceforest
相关产品推荐
相关产品推荐

