转义头盔yml以进行部署

时间:2019-06-24 14:44:00

标签: kubernetes kubernetes-helm

我正在尝试找出如何转义这些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 }}

1 个答案:

答案 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会在不尝试进行其他处理的情况下将图表呈现为文本,这对于调试非常有帮助。