我正在尝试找出如何转义yml文件的这些部分,以便与helm一起使用。
- 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,此处包含标准kubernetes手动部署https://help.papertrailapp.com/kb/configuration/configuring-centralized-logging-from-kubernetes/的说明。这里有一个完整的yml文件https://help.papertrailapp.com/assets/files/papertrail-logspout-daemonset.yml的链接。
我找到了一些关于如何转义大括号和引号的答案,但似乎仍然不能让它工作。如果有某种方法可以让helm不对每个完整的值求值,这将是最简单的。
我最后一次尝试是这样的,但仍然导致错误。
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
我可以硬编码这两个值,它工作得很好。我不太理解这些环境变量是如何工作的,但是发生的情况是,日志被发送到一个节点中每个pod的书面记录中,其中包含来自每个pod的标签。命名空间、实例名称、容器名称。
env:
- name: ROUTE_URIS
value: "{{ .Values.backend.log.destination }}"
{{ .Files.Get "files/syslog_vars.yaml" | indent 13 }}
发布于 2019-06-25 08:48:31
我想到了两种明智的方法。
一种方法是定义一个可扩展为字符串{{
的模板,此时您可以在变量扩展中使用该字符串。您不需要特别转义}}
。
{{- 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
会在不进行额外处理的情况下将图表呈现为文本,这对调试非常有帮助。
https://stackoverflow.com/questions/56739017
复制相似问题