我正在尝试找出如何转义这些yml文件片段以便与头盔一起使用。
- name: SYSLOG_TAG
value: '{{ index .Container.Config.Labels "io.kubernetes.pod.namespace" }}[{{ index .Container.Config.Labels "io.kubernetes.pod.name" }}]'
- name: SYSLOG_HOSTNAME
value: '{{ index .Container.Config.Labels "io.kubernetes.container.name" }}'
yml文件是一个DaemonSet,用于将日志发送到papertrail,并在此处提供标准kubernetes手动部署https://help.papertrailapp.com/kb/configuration/configuring-centralized-logging-from-kubernetes/的说明。这是指向完整yml文件https://help.papertrailapp.com/assets/files/papertrail-logspout-daemonset.yml的链接。
我找到了一些有关如何转义大括号和引号的答案,但似乎仍然无法使其正常工作。如果有某种方法可以让舵手不对每个值进行评估,那将是最简单的。
我最后一次尝试的是这个,但仍然会导致错误。
value: ''"{{" index .Container.Config.Labels \"io.kubernetes.pod.namespace\" "}}"["{{" index .Container.Config.Labels \"io.kubernetes.pod.name\" "}}"]''
- name: SYSLOG_HOSTNAME
value: ''"{{" index .Container.Config.Labels \"io.kubernetes.container.name\" "}}"''
这是错误:
Error: UPGRADE FAILED: YAML parse error on templates/papertrail-logspout-daemonset.yml: error converting YAML to JSON: yaml: line 21: did not find expected key
我可以为这两个值硬编码,并且可以正常工作。我不太了解这些env变量是如何工作的,但是发生的是,将日志发送到节点中每个吊舱的papertrail,其中包含每个吊舱中的标签。命名空间,窗格名称和容器名称。
env:
- name: ROUTE_URIS
value: "{{ .Values.backend.log.destination }}"
{{ .Files.Get "files/syslog_vars.yaml" | indent 13 }}
答案 0 :(得分:2)
想到两种明智的方法。
一种方法是定义一个扩展为字符串{{
的模板,此时可以在变量扩展中使用该模板。您不需要专门转义}}
。
{{- define "cc" }}{{ printf "{{" }}{{ end -}}
- name: SYSLOG_HOSTNAME
value: '{{cc}} index .Container.Config.Labels "io.kubernetes.container.name" }}'
第二种方法是,创建一个包含这些环境变量片段的外部文件,耗时较长,但转义较少。
# I am files/syslog_vars.yaml
- name: SYSLOG_HOSTNAME
value: '{{ index .Container.Config.Labels "io.kubernetes.container.name" }}'
然后您可以include the file。这在文件中不应用任何模板,只是将其读取为文字文本。
env:
{{ .Files.Get "files/syslog_vars.yaml" | indent 2 }}
最后一种技术的重点以及您在问题中遇到的问题是,Helm读取任意文件,展开所有模板,然后尝试将结果文本解释为YAML。 indent 2
部分需要与env:
块的其余部分匹配;如果这在部署规范中很深,则可能需要8或10个空间。 helm template
会在不尝试进行其他处理的情况下将图表呈现为文本,这对于调试非常有帮助。