【问题标题】:Helm - Templating variables in values.yamlHelm - 在 values.yaml 中模板化变量
【发布时间】:2019-09-21 07:59:54
【问题描述】:

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

我已经阅读了https://github.com/helm/helm/issues/2492 和https://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 模板 --name v1 mychart/

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

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

{{ $key }} = {{ tpl $value . }}
{{ $key }} = {{ $value | tpl . }}
{{ $key }} = {{ tpl $value $ }}

【问题讨论】:

    标签: kubernetes kubernetes-helm templating


    【解决方案1】:

    上面的方法也可以这样工作

    values.yaml

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

    configmap.yaml

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

    我改变的是:我将值放在 value.yaml 的引号中,并在配置映射中使用模板 tpl。

    【讨论】:

    • 如果有人想知道:当tpl 函数用于范围块时,它需要顶级上下文(例如$)作为第二个参数,而不是通常的@987654328 @ 争论。 stackoverflow.com/a/67815474/392184
    【解决方案2】:

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

    configmap.yaml

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

    【讨论】:

      【解决方案3】:

      关于这个话题有争吵in this PR here。

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

      让我们总结一下:

      要在 values.yaml 中进行模板化,这些是可用的选项:

      1. helm 可能会在未来支持这一点(观看此 thread 关于此主题。)

      2. 在图表中使用 tpl 函数

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

      【讨论】:

      • 看到了 github 线程,如果已经实现,将会很有帮助。我看到更改已合并。这些更改是否正式可用?
      【解决方案4】:

      我将参考有关 helm 中模板变量的问题标题,并建议在 values.yaml 上使用另一个选项,即 YAML Anchors。

      文档参考

      如here中所写:

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

      coffee: "yes, please"
      favorite: &favoriteCoffee "Cappucino"
      coffees:
        - Latte
        - *favoriteCoffee
        - Espresso
      

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

      稍后,该引用被用作*favoriteCoffee。
      所以咖啡变成了Latte、Cappuccino、Espresso。

      一个更实际的例子

      指的是所有values.yaml 中的通用图像设置(Registry 和PullPolicy)。

      注意默认值是如何设置在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
      

      【讨论】:

      • 如果我想将此变量用作 MySql 之类的某个值的一部分,如何使用此方法: Image: Registry: Prefix-*global-docker-registry-Suffix
      • 我没有在值文件中尝试过字符串连接 - 不确定它是否有效。您可以在资源本身中添加前缀/后缀,并让 *global-docker-registry 从全局引用中注入。
      猜你喜欢
      • 2022-08-03
      • 2022-08-16
      • 1970-01-01
      • 2020-12-05
      • 2020-05-16
      • 2022-12-17
      • 2021-12-18
      • 2021-06-17
      相关资源
      最近更新 更多