我正在尝试将整个 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?
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 }}
}
}