在k8s里,有很多处重复的label定义是很常见的场景。这对于运维带来很多不便之处:
增加/修改/删除
某个标签,例如environment: prod, team: frontend...
, 则需要在所有地方都进行修改Helm允许我们将这些重复的标签提取出来放到一个文件(_helpers.tpl
)中,在其他的模板文件中进行调用。有一些值得一提的命名约定:
templates/
中的大多数文件都被视为 Kubernetes 资源清单文件(NOTES.txt 除外)_
开头命名的文件 不会 被当做 Kubernetes 资源清单文件define
关键字可以让我们在模板文件中创建命名模板,它的语法如下所示:
{{ define "MY.NAME" }}
# 模板内容区域
{{ end }}
比如我们可以定义一个模板来封装下 Kubernetes 的 labels 标签:
如果在每处labels定义都使用{{- template "labels" . }}
来进行替换,可能会出现缩进问题。因为 template
只是一个动作,而不是一个函数,所以无法将模板调用的输出传递给其他函数(indent),相当于渲染的结果是这样的:
很明显上面渲染生成的 YAML 文件在第二和第三处labels部分有缩进问题,所以创建资源时肯定会报错。为解决这个问题,Helm 提供了代替 template
的函数 include
,可以将模板的内容导入到当前的管道中,这样就可以在管道中传递给其他函数进行处理了。如下所示,现在我们重新渲染就可以得到正确的结果了,这是因为我们用 include
函数得到模板内容后通过管道传给了后面的 indent
函数来保证了缩进:
在 Helm 模板中最好使用 include
而不是 template
,这样可以更好地处理 YAML 文档的输出格式。
创建新的chart named-templates-lab
:
kongpingfan:~/environment/helm $ helm create named-templates-lab
Creating named-templates-lab
kongpingfan:~/environment/helm $ cd named-templates-lab/
将template目录下除_helpers.tpl
和deployment.yaml
外所有文件都删除,删除后的目录结构如下:
kongpingfan:~/environment/helm/named-templates-lab $ tree
.
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ └── _helpers.tpl
└── values.yaml
2 directories, 4 files
替换_helpers.tpl
内容如下:
{{- define "labels" }}
app.kubernetes.io/name: {{ .Release.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
deployment.yaml
内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .ReleaseName }}-nginx
labels:
{{- template "labels" . }}
spec:
selector:
matchLabels:
{{- include "labels" .|indent 2 }}
template:
metadata:
labels:
{{- include "labels" .| indent 4 }}
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
执行结果: