如何在 Helm 中合并命名模板

How to merge named templates in Helm

假设我们在 _helpers.tpl 中有以下内容:

{{- define "app.selectorLabels" -}}
app.kubernetes.io/name: app
app.kubernetes.io/instance: instance
{{- end }}

{{- define "app.component.selectorLabels" -}}
{{ include "app.selectorLabels" . }}
app.kubernetes.io/component: component
{{- end }}

{{- define "app.labels" -}}
foo: bar
{{ include "app.selectorLabels" . }}
{{- end }}

{{- define "app.component.labels" -}}
{{ include "app.labels" . }}
{{ include "app.component.selectorLabels" . }}
{{- end }}

现在 app.component.labels 命名模板 - 例如,在 svc.yaml 或其他地方的某个地方使用 include - 将包含 app.selectorLabels 的内容两次,并将呈现为以下:

foo: bar
app.kubernetes.io/name: app
app.kubernetes.io/instance: instance
app.kubernetes.io/name: app
app.kubernetes.io/instance: instance
app.kubernetes.io/component: component

有什么方法可以合并 app.component.labels 定义中的两个包含项,以便合并重复项吗?

您不能合并模板,因为它们只输出文本,而不是实际的结构化数据。但是你可以用听写做一些技巧。

{{- define "app.component.labels" -}}
{{- $appLabels := fromYaml (include "app.labels" .) -}}
{{- $selectorLabels := fromYaml (include "app.component.selectorLabels" .) -}}
{{- $labels := merge $appLabels $selectorLabels -}}
{{ toYaml $labels }}
{{- end -}}

这里的关键是fromYamltoYamlmerge函数。 merge 有一些变体,顺序很重要,您需要准确决定您想要的方式。您可以查看文档 http://masterminds.github.io/sprig/dicts.html


也就是说,最好不要在应用程序标签中包含选择器标签,以便完全避免该问题。