无法从传入非全局上下文的命名模板访问 helm .Values

Pet*_*ars 3 kubernetes-helm

我正在尝试使用 Helm 命名模板,我计划将其包含在多个不同的上下文中,并且该模板具有许多对于所有上下文都相同的值。

每当我将上下文传递给命名模板templateinclude调用命名模板时,对的引用都.Values不起作用,这是可以理解的,因为我显式设置了较低的上下文。

的 Helm 文档with中,它声称有一个“全局”变量$,允许引用全局.Values例如, {{ $.Values... }}。这不起作用(下面的示例显示了错误)。

我还尝试定义变量(使用:=)并“封闭”该变量定义中的包含内容(通过缩进 - 我不知道这是否重要)以使该变量在命名模板中可用,但这也不起作用。

我还尝试将它们放入“全局变量”中,如此处所述,这更像是一个子图,但这也不起作用。

因此,我已经没有 Helm 技巧来完成这项工作,并且遗憾的是必须多次重新定义这些相同的变量 - 这使得整个命名模板解决方案有点不那么优雅 - 或者只是回到大部分重复部分 -参数化模板。

我缺少什么?

$ helm version
Client: &version.Version{SemVer:"v2.9+unreleased", GitCommit:"", GitTreeState:"clean"}
Run Code Online (Sandbox Code Playgroud)

值.yaml:

---
commonSetting1: "common1"
commonSetting2: "common2"
context1:
  setting1: "c1s1"
  setting2: "c1s2"
context2:
  setting1: "c2s1"
  setting2: "c2s2"
Run Code Online (Sandbox Code Playgroud)

部署.yaml:

---
{{- define "myNamedTemplate" }}
      - name: {{ .setting1 }}
        image: {{ $.Values.commonSetting1 }}

{{- include "myNamedTemplate" .Values.context1 }}
{{- include "myNamedTemplate" .Values.context2 }}
Run Code Online (Sandbox Code Playgroud)
$ helm template test-0.1.0.tgz 
Error: render error in "test/templates/deployment.yaml": template: test/templates/deployment.yaml:7:4: executing "test/templates/deployment.yaml" at <include "myNamedTemp...>: error calling include: template: test/templates/deployment.yaml:4:19: executing "myNamedTemplate" at <$.Values.commonSetti...>: can't evaluate field commonSetting1 in type interface {}
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 8

当我这样做时,我倾向于显式传递顶级上下文对象作为参数。这有点棘手,因为 Go 文本/模板模板只接受单个参数,因此您需要使用 (Helm/Sprig) 函数list将多个参数打包在一起,然后使用 (标准文本/模板)index函数将它们解包。

模板定义如下所示:

{{- define "myNamedTemplate" }}
{{- $top := index . 0 }}
{{- $context := index . 1 }}
- name: {{ $context.setting1 }}
  image: {{ $top.Values.commonSetting1 }}
{{ end }}
Run Code Online (Sandbox Code Playgroud)

当您调用它时,您需要显式传递当前上下文作为参数:

{{ include "myNamedTemplate" (list . .Values.context1) }}
Run Code Online (Sandbox Code Playgroud)