Helm 将整个 YAML 部分模板化为 JSON 配置映射

问题描述 投票:0回答:1

我正在尝试将整个 YAML 节作为 JSON 配置映射文件传递到我的服务中。一个简单的例子是

values.yaml:

serviceName: "mySuperCoolService"

configMaps:
  - filename: "file1.json"
    content: "{{ .Values.content1 }}"
  - filename: "file2.json"
    content: "{{ .Values.content2 }}"

content1:
  field1: "value1"
  field2:
    field3: "value3"
    field4: "value4"

content2:
  field5: "value5"
  field6:
    field7: "value7"
    field8: "value8"

模板/configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Values.serviceName }}-jsonConfigMap
data:
  {{- range .Values.configMaps }}
  {{ .filename }}: | 
  {{ tpl .content $ | toPrettyJson | indent 4}}
  {{- end }}

我想要的

configmap.yaml
模板输出是:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mySuperCoolService-jsonConfigMap
data:
  file1.json: | 
    {
      "field1": "value1",
      "field2":
      {
        "field3": "value3",
        "field4": "value4"
      }
    }
  file2.json: | 
    {
      "field5": "value5",
      "field6":
      {
        "field7": "value7",
        "field8": "value8"
      }
    }

然而,无论我尝试什么,它似乎总是会出现:

apiVersion: v1
kind: ConfigMap
metadata:
  name: mySuperCoolService-jsonConfigMap
data:
  file1.json: | 
      "map[field1:value1 field2:map[field3:value3 field4:value4]]"
  file2.json: | 
      "map[field5:value5 field6:map[field7:value7 field8:value8]]"

如何将地图类型对象转换为实际的 JSON?

kubernetes kubernetes-helm
1个回答
0
投票

Go

text/template
语言的几个方面非常面向字符串。
{{ ... }}
双大括号表达式的计算结果始终为字符串;更具体地说,在 Helm 中,
include
tpl
始终返回字符串。如果此处返回映射或列表,它们会使用默认的 Go 序列化转换回字符串,这就是您看到的
map[key:value]
语法。

对此最直接的答案是确保当您在模板表达式中包含部分值时,将其序列化为 JSON:

configMaps:
  - filename: "file1.json"
    content: "{{ .Values.content1 | toPrettyJson }}"
  - filename: "file2.json"
    content: "{{ .Values.content2 | toPrettyJson }}"
{{ tpl .content $ | indent 4}}

不过,我想知道您是否试图使配置过于灵活。您所显示的配置与 Kubernetes ConfigMap 的结构密切相关,以至于编写 ConfigMap YAML 实际上不会更困难。除非 Pod 知道如何访问密钥,否则将密钥单独放入 ConfigMap 中是没有用的。枚举模板文件中特定的已知 ConfigMap 键可能更有意义,在这种特殊情况下,这将完全删除

tpl

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-jsonConfigMap
data:
  file1.json: |
{{ .Values.content1 | toPrettyJson | indent 4 }}
  file2.json: |
{{ .Values.content2 | toPrettyJson | indent 4 }}

甚至将 JSON 结构的核心放入模板代码中,并在需要时采用更具体的配置值:

data:
  file1.json: |
    {
      "field1": {
        "field2": {{ .Values.frobnicationLevel | toJson }}
      }
    }
© www.soinside.com 2019 - 2024. All rights reserved.