我有一个包含多个子图表的图表,这些子图表都应使用与主图表相同的注释,并且我只想在我的主图表中定义一次所述注释
values.yaml
。据我了解,_helpers.tbl
中定义的函数也可供子图使用。不过,我无法进行设置以将注释传播到子图中。
以下是相关片段:
# Source: mainchart/values.yaml
serviceAnnotations:
propagated: "true"
...
---
# Source: mainchart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
{{- include "automate.annotations" . | nindent 4 }}
...
---
# Source: mainchart/templates/_helpers.tbl
{{/*
Global annotations
*/}}
{{- define "automate.annotations" -}}
{{- with .Values.serviceAnnotations }}
{{- toYaml . }}
{{- end }}
{{- end }}
...
---
# Source: mainchart/charts/subchart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
{{- include "automate.annotations" . | nindent 4 }}
...
通过以下方式检查填充的图表:
helm install mainchart mainchart/ --dry-run
当您
define
辅助模板时,它采用单个参数,就像其他编程语言中的函数一样。在模板代码中,.
指的是模板参数,.Values
是该模板参数中名为 Values
的字段。
这样做的重要后果是,
define
d 模板不会“捕获”其定义的上下文。您从两个不同的地方调用 (include
) 模板两次。在这两种情况下,您都传递 .
作为参数。在主图表中, .
是顶级 Helm 对象,但在子图表中,它的范围已经限定为仅包含子图表的值;即使您正在调用顶级图表中定义的模板,您也无法返回顶级值。
Helm 为您提供的一种机制是 全局图表值:
.Values.global
会原封不动地传播到所有子图表中。如果你在助手中使用这个
{{- define "automate.annotations" -}}
{{- toYaml .Values.global.serviceAnnotations }}
{{- end }}
并移动主
values.yaml
文件中的定义
# Source: mainchart/values.yaml
global:
serviceAnnotations:
propagated: "true"
它就会有你想要的效果。