首页 > 解决方案 > 在 helm 中模板化外部文件

问题描述

我想使用 application.yaml 文件作为配置映射传递。

所以我写了这个。

 apiVersion: v1
 kind: ConfigMap
 metadata:
  name: conf
data:
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}

我的 application.yaml 存在于 foo 文件夹中,并包含一个服务名称,我需要它通过 helm 插值动态填充。

foo:
  service:
    name: {{.Release.Name}}-service

当我试跑时,我得到了这个

apiVersion: v1
kind: ConfigMap
metadata:
  name: conf
data:
  application.yaml: "ei:\r\n  service:\r\n    name: {{.Release.Name}}-service"

但我想name: {{.Release.Name}}-service包含实际的掌舵版本名称。

是否可以使用 helm 为外部文件进行模板化,如果可以,那么该怎么做?我已经浏览了https://v2-14-0.helm.sh/docs/chart_template_guide/#accessing-files-inside-templates 我没有找到可以解决我的用例的东西。我还可以将内容复制到 config map yaml 并可以进行插值,但我不想这样做。我希望 application.yml 位于一个单独的文件中,这样,处理配置更改会很简单..

标签: kuberneteskubernetes-helm

解决方案


Helm包含一个tpl函数,可用于将任意字符串扩展为 Go 模板。在您的情况下,输出...AsConfig是一个字符串,您可以将其输入模板引擎。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-conf
data:
{{ tpl (.Files.Glob "foo/*").AsConfig . | indent 2 }}

一旦你这样做了,你就可以从配置文件中调用任意模板代码。例如,有一个已定义的模板来生成当前图表的名称前缀是很常见的,因此您的配置文件可以改为指定

foo:
  service:
    name: {{ template "mychart.name" . }}-service

推荐阅读