Какие шаблоны (templates) вы знаете в Helm?

«Какие шаблоны (templates) вы знаете в Helm?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Helm шаблоны — это файлы в директории templates/ чарта, написанные на языке Go Templates с расширениями Helm. Они генерируют валидные Kubernetes-манифесты при установке или обновлении релиза.

Основные типы и концепции шаблонов:

  1. Основные шаблоны манифестов: Файлы с именами, соответствующими создаваемым ресурсам: deployment.yaml, service.yaml, configmap.yaml, ingress.yaml и т.д.
  2. Вспомогательные шаблоны (Named Templates): Определяются в файлах (часто _helpers.tpl) с помощью {{- define "имя.шаблона" -}} ... {{- end -}}. Позволяют переиспользовать код. Вызываются через {{ include "имя.шаблона" . }}.
  3. Шаблон заметок (NOTES.txt): Специальный шаблон, вывод которого показывается пользователю после helm install. Содержит инструкции по доступу к приложению.

Ключевые объекты и функции в шаблонах:

  • .Values: Доступ к значениям из values.yaml или переданным через --set.
  • .Release, .Chart: Метаинформация о релизе и чарте.
  • .Capabilities: Информация о кластере Kubernetes (версия API, поддержка ресурсов).
  • Функции: toYaml, toJson, indent, default, required (для валидации), tpl (для рендеринга строк как шаблонов).

Пример структурированного шаблона deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    {{- include "mychart.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "mychart.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "mychart.selectorLabels" . | nindent 8 }}
        {{- with .Values.podLabels }}
        {{ toYaml . | indent 8 }}
        {{- end }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        {{- if .Values.env }}
        env:
        {{- range $key, $value := .Values.env }}
        - name: {{ $key }}
          value: {{ $value | quote }}
        {{- end }}
        {{- end }}

Файл _helpers.tpl для этого примера:

{{- define "mychart.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

{{- define "mychart.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
{{ include "mychart.selectorLabels" . }}
{{- end -}}

{{- define "mychart.selectorLabels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end -}}