在 helm 子图的 tpl 函数中使用父值

问题描述 投票:0回答:1

假设我有一个名为“child”的 Helm 图表,包含以下内容

values.yaml

name: "John"
greeting: "Hello {{ .Values.name }}"

还有一个模板

test.yaml
包含以下内容:

result: {{ tpl .Values.greeting $ }}

如果我运行

helm template .
命令,我得到这个输出:

---
# Source: child/templates/test.yaml
result: Hello John

现在我有一个依赖于“子”子图的“父”图。它在

Chart.yaml
中声明为:

dependencies:
  - name: child
  version: "0.1.0"
  repository: "file://charts/child"

父图表的

values.yaml
包含:

rename: "Wilson"
child:
  name: {{ .Values.rename }}

如果我从父图表目录运行

helm template .
命令,我得到这个错误:

Error: cannot load values.yaml: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.rename":interface {}(nil)}

我想得到输出:

---
# Source: parent/charts/child/templates/test.yaml
result: Hello Wilson

有什么方法可以将值“重命名”从父子图传递给子子图吗?

注意事项

  • 我不想使用全局变量或 yaml 锚点
  • 我无法修改子图
  • 应该保留“重命名”值,因为它在其他父模板中使用
kubernetes-helm
1个回答
1
投票

这是不可能的,即使你可以修改子图表。

Helm 不会让父图表对传递给子图表的值有任何控制。它始终是

child
值的内容合并了
global
值。模板代码或
Chart.yaml
中的任何内容都不能修改它。

即使您可以修改子图表,通常的方法是使用 Helm

tpl
函数,但是当子图表可以看到这个值时,父值已经被隐藏了。

在父图表中,如果您只是想避免这种重复,您可以看到

.Values.child
并可以像使用任何其他值一样使用它。

# parent/templates/test.yaml
resultFromParent: {{ .Values.child.name }}

可以预处理值文件或使用允许其他构造的其他工具。我熟悉的一个工具是 Helmfile,它允许您使用 Helm 风格的模板来为 Helm 图表构建值;它还允许您并行安装多个图表,这可以解决一些需要“伞状”图表的情况。

© www.soinside.com 2019 - 2024. All rights reserved.