如何在 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 -}}
这里的关键是fromYaml
、toYaml
和merge
函数。 merge
有一些变体,顺序很重要,您需要准确决定您想要的方式。您可以查看文档 http://masterminds.github.io/sprig/dicts.html
也就是说,最好不要在应用程序标签中包含选择器标签,以便完全避免该问题。
假设我们在 _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 -}}
这里的关键是fromYaml
、toYaml
和merge
函数。 merge
有一些变体,顺序很重要,您需要准确决定您想要的方式。您可以查看文档 http://masterminds.github.io/sprig/dicts.html
也就是说,最好不要在应用程序标签中包含选择器标签,以便完全避免该问题。