Helm - 在 values.yaml 中使用模板变量

38

我正在尝试将values.yaml中的映射变量模板化到我的最终Kubernetes ConfigMap YAML中。

我已经阅读了https://github.com/helm/helm/issues/2492https://helm.sh/docs/chart_template_guide/,但似乎找不到答案。

为了提供一些背景,这大致是我想做的:

values.yaml

config:
  key1: value
  key2: value-{{ .Release.Name }}

configmap.yaml

kind: ConfigMap
data:
  config-file: |
    {{- range $key, $value := .Values.config }}
    {{ $key }} = {{ $value }}
    {{- end }}

期望的输出结果如下:

helm template --name v1 mychart/

kind: ConfigMap
data:
  config-file: |
    key1 = value
    key2 = value-v1

我尝试使用模板函数和管道的几种变化,但都没有成功:

{{ $key }} = {{ tpl $value . }}
{{ $key }} = {{ $value | tpl . }}
{{ $key }} = {{ tpl $value $ }}
4个回答

30

针对Helm中的模板变量问题,我将提供另一种在values.yaml中使用的选项,即YAML Anchors。

文档参考

此处所述:

YAML规范提供了一种存储值引用并稍后通过引用引用该值的方法。 YAML将其称为“Anchoring”:

coffee: "yes, please"
favorite: &favoriteCoffee "Cappucino"
coffees:
  - Latte
  - *favoriteCoffee
  - Espresso
在上述代码中,&favoriteCoffee将引用设置为Cappuccino
稍后,该引用作为*favoriteCoffee使用。
所以coffees变成了LatteCappuccinoEspresso
更实际的例子是,所有values.yaml中都引用了一个常见的图像设置(RegistryPullPolicy)。
请注意,在引用定义开始的&旁边设置默认值的位置Global.Image
Global:
  Image:
    Registry: &global-docker-registry "12345678910.dkr.ecr.us-west-2.amazonaws.com" # <--- Default value
    PullPolicy: &global-pull-policy "IfNotPresent" # <--- Default value

Nginx:
  Image:
    Registry: *global-docker-registry
    PullPolicy: *global-pull-policy
    Version: 1.21.4
    Port: 80

MySql:
  Image:
    Registry: *global-docker-registry
    PullPolicy: *global-pull-policy
    Name: mysql
    Version: 8.0.27
    Port: 3306

1
如果我想要将这个变量作为某个值的一部分使用,该怎么使用这种方法呢?MySql: Image: Registry: Prefix-*global-docker-registry-Suffix - Prabhat
1
我尚未在值文件中尝试字符串连接,不确定它是否有效。您可以在资源本身中添加前缀/后缀,并让*global-docker-registry从全局引用注入。 - RtmY
5
由于Helm锚点的工作方式,它只适用于非常有限的用例。如果使用--set参数覆盖Global.Image.Registry,则所有引用仍将保持原始锚点值,这是一种很糟糕的情况。 - Dmitry

29

上述方法也可以这样工作

values.yaml

config:
  key1: "value"
  key2: "value-{{ .Release.Name }}"

配置映射.yaml

kind: ConfigMap
data:
  config-file: |
    {{- range $key, $value := .Values.config }}
    {{ $key }} = {{ tpl $value $ }}
    {{- end }}
我所改变的是:我在value.yaml中将值放入引号中,并在配置映射中使用了模板tpl

5
如果有人想知道:当在范围块中使用tpl函数时,它需要顶层上下文(例如 $)作为第二个参数,而不是通常的 . 参数。https://dev59.com/HMDqa4cB1Zd3GeqPoe6J#67815474 - Lee Grissom

14

使用以下语法成功解决了此问题:

configmap.yaml

kind: ConfigMap
data:
  config-file: |
    {{- range $key, $value := .Values.config }}
    {{ $key }} = {{ tpl ($value | toString) $ }}
    {{- end }}

1
很高兴能将您的答案标记为答案或https://dev59.com/DlMI5IYBdhLWcg3wi8Eb#62896363。 - mpromonet
是的...提问者应该总是标记解决方案,这样其他人就可以确切地知道在你的情况下起作用的是什么。:-) - undefined

11

关于这个话题,这个PR里有争议。

现在是可以实现的,但需要内部维护Chart(例如Amrut的回答)。

总结一下:

要在values.yaml中使用模板,以下是可用选项:

  1. 未来Helm可能会支持这个功能(请关注这个话题

  2. 在Chart内使用tpl函数

  3. 在Helm之上使用另一个工具:terraform或helmfile。


看到了 Github 的讨论串,如果已经实现的话会很有帮助。我看到更改已经合并了。这些更改是否已经正式发布可用? - Sudhanva c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接