Helm - values.yaml 中的模板变量

ahs*_*stn 14 templating kubernetes kubernetes-helm

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

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

在某些情况下,这大致是我想要做的:

值.yaml

config:
  key1: value
  key2: value-{{ .Release.Name }}
Run Code Online (Sandbox Code Playgroud)

配置映射文件

kind: ConfigMap
data:
  config-file: |
    {{- range $key, $value := .Values.config }}
    {{ $key }} = {{ $value }}
    {{- end }}
Run Code Online (Sandbox Code Playgroud)

所需的输出是:

掌舵模板 --name v1 mychart/

kind: ConfigMap
data:
  config-file: |
    key1 = value
    key2 = value-v1
Run Code Online (Sandbox Code Playgroud)

我使用模板函数和流水线尝试了一些变体,但无济于事:

{{ $key }} = {{ tpl $value . }}
{{ $key }} = {{ $value | tpl . }}
{{ $key }} = {{ tpl $value $ }}
Run Code Online (Sandbox Code Playgroud)

Rtm*_*tmY 31

我将参考有关 helm 中模板变量的问题标题,并建议使用values.yamlYAML 锚点的另一个选项。

文档参考

正如这里所写:

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

coffee: "yes, please"
favorite: &favoriteCoffee "Cappucino"
coffees:
  - Latte
  - *favoriteCoffee
  - Espresso
Run Code Online (Sandbox Code Playgroud)

在上面,设置了对Cappuccino 的&favoriteCoffee引用。

后来,该引用被用作*favoriteCoffee
所以咖啡就变成了拿铁卡布奇诺浓缩咖啡

一个更实际的例子

指的是通用图像设置(RegistryPullPolicy)的全部values.yaml

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
Run Code Online (Sandbox Code Playgroud)

  • 由于舵锚的工作原理,其用途非常有限。https://helm.sh/docs/chart_template_guide/yaml_techniques/#yaml-anchors :如果您使用 --set 覆盖 Global.Image.Registry,则所有引用将保留锚点的原始值。这很令人讨厌 (5认同)

Abd*_*UMI 11

这篇公关中关于这个话题存在争议。

我知道现在这是可能的,但这需要在内部维护图表(例如 Amrut 的答案)。

让我们总结一下:

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

  1. helm 将来可能会支持这一点(观看有关此主题的线程。)

  2. 在图表内使用 tpl 函数

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


Amr*_*bhu 9

以上也可以这样工作

值.yaml

config:
  key1: "value"
  key2: "value-{{ .Release.Name }}"
Run Code Online (Sandbox Code Playgroud)

配置映射文件

kind: ConfigMap
data:
  config-file: |
    {{- range $key, $value := .Values.config }}
    {{ $key }} = {{ tpl $value $ }}
    {{- end }}
Run Code Online (Sandbox Code Playgroud)

我改变的是:我将值放在引号中value.yamltpl在配置图中使用模板。

  • 如果有人想知道:当在范围块中使用“tpl”函数时,它需要顶级上下文(例如“$”)作为第二个参数,而不是通常的“.”参数。/sf/answers/4747083211/ (5认同)

ahs*_*stn 6

设法使用以下语法解决了这个问题:

配置映射文件

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