Helm include vs template: в чём разница и как использовать

В Helm-шаблонах часто можно встретить функции include и template. Обе они позволяют встраивать фрагменты шаблонов в другие файлы, но работают немного по-разному.
Разберём, в чём их отличие и как правильно их применять.


Основная разница

ФункцияВозвращаетОсобенности
templateНичего (пишет сразу в вывод)Подходит для прямой вставки подшаблонов
includeСтрокуДаёт больше гибкости — можно обрабатывать вывод

Пример 1: template

Функция template просто вставляет содержимое указанного шаблона в текущий вывод.

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "myapp.fullname" . }}
spec:
  template:
    spec:
      containers:
        - name: myapp
          image: nginx
          {{- template "myapp.env" . }}

Подшаблон myapp.env может выглядеть так:

# templates/_env.tpl
{{- define "myapp.env" -}}
env:
  - name: ENV
    value: "production"
{{- end }}

Результат — содержимое блока env вставится напрямую.

Пример 2: include

Функция include возвращает строку, которую можно обработать с помощью indent, nindent и других функций.

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "myapp.fullname" . }}
spec:
  template:
    spec:
      containers:
        - name: myapp
          image: nginx
          {{ include "myapp.env" . | nindent 10 }}

Это удобно, если нужно контролировать отступы или собирать строки:

annotations:
  checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}

Когда использовать

СценарийЧто выбрать
Вставка шаблона напрямуюtemplate
Использование результата как строки (с indent, printf, sha256sum и т.д.)include
Использование шаблонов в аннотациях, лейблах, значенияхinclude
Генерация целых ресурсов (YAML документов)template

Заключение

  • template — вставляет шаблон сразу в вывод.
  • include — возвращает результат как строку, позволяя его модифицировать.

На практике в большинстве случаев DevOps-инженеры предпочитают include,
так как она более гибкая и совместима с другими функциями Helm.

💡 Совет: всегда добавляйте | nindent N, чтобы сохранить правильные отступы при использовании include.