【问题标题】:Helm Templating in Configmap for values.yaml用于 values.yaml 的 Configmap 中的 Helm 模板
【发布时间】:2022-08-03 01:06:19
【问题描述】:

我正在寻求帮助来创建可以支持多种服务的通用 configmap.yaml。

values.yaml(这工作)

value1:  val1

genericConfigMapProperties:
  application.properties: |-
    prop1=prop1value
    prop2=prop2value

configmap.yaml

apiVersion: 1
kind: ConfigMap
...
...
data:
{{ (toYaml .Values.genericConfigMapProperties)  . | ident 4 }}

模板{{ (toYaml .Values.genericConfigMapProperties) . | ident 4 }} 几乎是完美的。它正确呈现application.properties

data:
  application.properties: |-
    prop1=prop1value
    prop2=prop2value

values.yaml(这不起作用)

value1:  val1

genericConfigMapProperties:
  cmValue1: {{ .Values.value1 | default \"default val1\" | quote }}

  application.properties: |-
    prop1=prop1value
    prop2=prop2value

呈现cmValue1 时出现错误。我期待这个答案:

data:
  cmValue1: val1

  application.properties: |-
    prop1=prop1value
    prop2=prop2value

错误:

Error: failed to parse values.yaml: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{\".Values.value1 | default \\\"default val1\\\" | quote\":interface {}(nill)}
helm.go:88: [debug]  error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{\".Values.value1 | default \\\"default val1\\\" | quote\":interface {}(nill)}
failed to parse values.yaml

我还需要哪些额外的 helm 模板代码来支持 cmValue1 渲染?

谢谢你。

  • 为什么不能将此内容写入templates/configmap.yml;为什么通过 Helm 值不仅指定配置而且指定实际逻辑的间接路径?

标签: templates kubernetes-helm


【解决方案1】:

Helm 不支持二次渲染,但是可以使用yaml anchor来实现这个功能,或者间接地通过使用named templates.

A计划:锚

值.yaml

value1: &value1 val1

genericConfigMapProperties:
  cmValue1: *value1

  application.properties: |-
    prop1=prop1value
    prop2=prop2value

模板/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: test
data: 
  config.yaml: |
    {{- toYaml $.Values.genericConfigMapProperties | nindent 4 }}

输出

apiVersion: v1
kind: ConfigMap
metadata:
  name: test
data: 
  config.yaml: |
    application.properties: |-
      prop1=prop1value
      prop2=prop2value
    cmValue1: val1

计划 B:命名模板

值.yaml

value1: val1

模板/_helpers.tpl

{{/*
cmValue template
*/}}
{{- define "genericConfigMapProperties" -}}
cmValue1: {{ .Values.value1 | default "default val1" | quote }}
application.properties: |-
  prop1=prop1value
  prop2=prop2value
{{- end -}}

模板/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: test
data: 
  config.yaml: |
     {{- include "genericConfigMapProperties" . | nindent 4 }}

输出

apiVersion: v1
kind: ConfigMap
metadata:
  name: test
data: 
  config.yaml: |
    cmValue1: "val1"
    application.properties: |-
      prop1=prop1value
      prop2=prop2value

【讨论】:

    【解决方案2】:

    感谢您的回复。

    我从 bitnami 通用模板中找到了这个很棒的解决方案。它几乎可以在任何地方使用。

    https://github.com/bitnami/charts/blob/master/bitnami/common/templates/_tplvalues.tpl

    复制此模板文件:

    {{/* vim: set filetype=mustache: */}}
    {{/*
    Renders a value that contains template.
    Usage:
    {{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }}
    */}}
    {{- define "common.tplvalues.render" -}}
        {{- if typeIs "string" .value }}
            {{- tpl .value .context }}
        {{- else }}
            {{- tpl (.value | toYaml) .context }}
        {{- end }}
    {{- end -}}
    

    使用它来模板化 configmap.yaml 或 deployment.yaml 或其他任何地方的任何值......

    值.yaml:

    configMapProperties:
      cmValue1: "val1"
      application.properties: |-
        prop1=prop1value
        prop2=prop2value
    

    configmap.yaml

    data:
        {{- if .Values.configMapProperties }}
        {{- include "common.tplvalues.render" ( dict "value" .Values.configMapProperties "context" $ ) | nindent 2 }}
        {{- end }}
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 2021-05-15
      • 2019-06-25
      • 2020-10-07
      • 2022-08-16
      • 2019-09-21
      • 2019-09-15
      相关资源
      最近更新 更多