← Назад к вопросам

Какие знаешь темплейты в Helm?

2.3 Middle🔥 211 комментариев
#Kubernetes

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Мои знания о Helm шаблонах (Templates)

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

Основные типы шаблонов и их структура

  1. Базовые манифесты Kubernetes:
    *   `deployment.yaml` — шаблон для создания Deployment.
    *   `service.yaml` — шаблон для Service.
    *   `configmap.yaml` — шаблон для ConfigMap.
    *   `secret.yaml` — шаблон для Secret (часто с использованием функций `b64enc`).
    *   `ingress.yaml` — шаблон для Ingress.

  1. Специализированные шаблоны:
    *   `_helpers.tpl` — **ключевой файл**, содержащий общие определения шаблонов (например, `{{- define "chart.name" -}}`). Эти определения затем используются в других шаблонах через `{{ include "chart.name" . }}`.
    *   `NOTES.txt` — шаблон для сообщений, которые выводятся после установки chart. Это инструкции для пользователя.
    *   `tests/` — директория для тестовых манифестов (например, `test-connection.yaml`), которые можно запустить через `helm test`.

Примеры шаблонов с кодом

Рассмотрим пример deployment.yaml с использованием переменных и функций:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "chart.fullname" . }}
  labels:
    {{- include "chart.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "chart.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "chart.selectorLabels" . | nindent 8 }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: {{ .Values.service.port }}
          env:
            {{- range $key, $value := .Values.env }}
            - name: {{ $key }}
              value: {{ $value | quote }}
            {{- end }}

И пример определения в _helpers.tpl:

{{- define "chart.fullname" -}}
{{- if .Values.fullnameOverride -}}
{{- .Values.fullnameOverride | trunc 63 -}}
{{- else -}}
{{- printf "%s-%s" .Chart.Name .Release.Name | trunc 63 -}}
{{- end -}}
{{- end -}}

Ключевые возможности шаблонов Helm

  • Переменные и объекты: доступ к .Values, .Chart, .Release, .Capabilities (для проверки версии Kubernetes).
  • Функции и pipelines: использование функций Go template (quote, default, toYaml) и Helm (include, toYaml). Pipelines позволяют последовательно применять функции: {{ .Values.text | upper | repeat 3 }}.
  • Управление пробелами с помощью модификаторов пробелов: {{- удаляет пробелы слева, -}} — справа. Это критично для чистого YAML.
  • Условные операторы и циклы: {{ if .Values.enabled }} ... {{ end }}, {{ range .Values.list }} ... {{ end }}.
  • Партинг шаблонов (subtemplate) через {{- template "name" . }} или более современный {{- include "name" . }}, который позволяет передавать контекст.

Пример использования условий и партинг

# Пример условного создания Ingress
{{- if .Values.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ include "chart.fullname" . }}
spec:
  rules:
  {{- range .Values.ingress.hosts }}
    - host: {{ .host }}
      http:
        paths:
        {{- range .paths }}
          - path: {{ .path }}
            pathType: Prefix
            backend:
              service:
                name: {{ include "chart.fullname" . }}
                port:
                  number: {{ .Values.service.port }}
        {{- end }}
  {{- end }}
{{- end }}

Практические советы по шаблонам

  • Избегайте сложной логики в шаблонах. Если шаблон становится слишком сложным, возможно, стоит пересмотреть структуру values.yaml или использовать _helpers.tpl.
  • Проверяйте валидность генерируемого YAML с помощью helm template --debug, который выводит результат рендеринга и показывает ошибки.
  • Для секретов всегда используйте функции шифрования (b64enc для данных, но помните, что сами шаблоны не шифруют — секреты должны управляться осторожно).

В итоге, Helm шаблоны — это мощный инструмент для создания параметризованных, повторно используемых конфигураций Kubernetes. Правильное использование _helpers.tpl, функций и управления пробелами позволяет создавать чистые, поддерживаемые и безопасные charts.

Какие знаешь темплейты в Helm? | PrepBro