【问题标题】:Escaping helm yml for deployment转义 helm yml 进行部署
【发布时间】:2019-06-24 14:44:00
【问题描述】:

我试图弄清楚如何转义 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,用于将日志发送到 papertrail,此处提供标准 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

我可以对这两个值进行硬编码,而且效果很好。我不太明白这些 env 变量是如何工作的,但是会发生什么情况是日志被发送到节点中每个 pod 的 papertrail 中,并带有每个 pod 的标签。命名空间、pod 名称和容器名称。

          env:
            - name: ROUTE_URIS
              value: "{{ .Values.backend.log.destination }}"
{{ .Files.Get "files/syslog_vars.yaml" | indent 13 }}

【问题讨论】:

  • 预期输出是什么?换句话说,你想要达到的 SYSLOG_TAG 和 SYSLOG_HOSTNAME 的值是多少?
  • 你能发布完整的papertrail-logspout-daemonset.yml文件吗?
  • @PaulLalonde 这些值就是原始 yml 文件中的值。所需的功能是获取节点中每个正在运行的容器的命名空间、容器名称和 pod 名称以发送到 papertrail。仅在不使用 helm 的情况下手动部署时效果很好。

标签: kubernetes kubernetes-helm


【解决方案1】:

想到了两种明智的方法。

一种是定义一个扩展为字符串{{ 的模板,此时您可以在变量扩展中使用它。你不需要专门转义}}

{{- 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 会在不做额外处理的情况下将图表呈现为文本,这对调试很有帮助。

【讨论】:

  • 谢谢。我正在尝试文件方法,但似乎无法让它工作。我已经弄乱了缩进号,但没有成功。收到此错误。 ```错误:升级失败:在“模板/syslog_vars.yaml”中呈现错误:模板:模板/syslog_vars.yaml:2:29:在<.container.config.la ...>:无法评估类型接口 {} ``` 中的字段配置
  • 奇怪的是,当我尝试对感兴趣的单个文件使用helm template 方法时,会呈现不同的文件。
  • 文件必须不在templates目录中。
  • 单独使用时有效。我还有第三个环境变量,应该由 helm 评估。它也可以单独使用,但由于某种原因,它们在一起时不起作用。有关代码,请参见上面的编辑。无法阻止此评论。
  • 搞定了。只是间距问题。包含外部文件会增加一个我没想到的额外空间。
猜你喜欢
  • 2022-09-29
  • 2022-09-28
  • 2019-01-12
  • 1970-01-01
  • 2020-03-19
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
相关资源
最近更新 更多