Named Templates

在k8s里,有很多处重复的label定义是很常见的场景。这对于运维带来很多不便之处:

  1. 编写出的yaml会很冗长;
  2. 如果要 增加/修改/删除 某个标签,例如environment: prod, team: frontend..., 则需要在所有地方都进行修改

image-20211219123843034

Named Templates

Helm允许我们将这些重复的标签提取出来放到一个文件(_helpers.tpl)中,在其他的模板文件中进行调用。有一些值得一提的命名约定:

  • templates/ 中的大多数文件都被视为 Kubernetes 资源清单文件(NOTES.txt 除外)
  • _ 开头命名的文件 不会 被当做 Kubernetes 资源清单文件
  • 下划线开头的文件不会被当做资源清单之外,还可以被其他 chart 模板调用

define 关键字可以让我们在模板文件中创建命名模板,它的语法如下所示:

{{ define "MY.NAME" }}
  # 模板内容区域
{{ end }}

比如我们可以定义一个模板来封装下 Kubernetes 的 labels 标签:

image-20211219124205333

include与template区别

如果在每处labels定义都使用{{- template "labels" . }}来进行替换,可能会出现缩进问题。因为 template 只是一个动作,而不是一个函数,所以无法将模板调用的输出传递给其他函数(indent),相当于渲染的结果是这样的:

image-20211219124643512

很明显上面渲染生成的 YAML 文件在第二和第三处labels部分有缩进问题,所以创建资源时肯定会报错。为解决这个问题,Helm 提供了代替 template 的函数 include,可以将模板的内容导入到当前的管道中,这样就可以在管道中传递给其他函数进行处理了。如下所示,现在我们重新渲染就可以得到正确的结果了,这是因为我们用 include 函数得到模板内容后通过管道传给了后面的 indent 函数来保证了缩进:

image-20211219124844959

在 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.tpldeployment.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

执行结果:

image-20211219205348830