Шаблони
Ця частина посібника з найкращих практик фокусується на шаблонах.
Структура templates/
Теку templates/
слід структурувати наступним чином:
- Файли шаблонів повинні мати розширення
.yaml
, якщо вони генерують YAML-вихід. Розширення.tpl
можна використовувати для файлів шаблонів, які не генерують форматований контент. - Імена файлів шаблонів повинні використовувати дефіси (
my-example-configmap.yaml
), а не camelCase. - Кожне визначення ресурсу повинно бути у власному файлі шаблону.
- Імена файлів шаблонів повинні відображати тип ресурсу в імені. Наприклад,
foo-pod.yaml
,bar-svc.yaml
.
Імена визначених шаблонів
Визначені шаблони (шаблони, створені всередині директиви {{ define }}
) є глобально доступними. Це означає, що чарт і всі його субчарти матимуть доступ до всіх шаблонів, створених з {{ define }}
.
З цієї причини усі імена визначених шаблонів повинні бути просторово іменовані.
Правильно:
{{- define "nginx.fullname" }}
{{/* ... */}}
{{ end -}}
Неправильно:
{{- define "fullname" -}}
{{/* ... */}}
{{ end -}}
Рекомендується, щоб нові чарти створювалися за допомогою команди helm create
, оскільки імена шаблонів автоматично визначаються відповідно до цієї найкращої практики.
Форматування шаблонів
Шаблони повинні мати відступи у два пробіли (ніколи не табуляцією).
Директиви шаблону повинні мати пробіл після відкриваючих дужок і перед закриваючими дужками:
Правильно:
{{ .foo }}
{{ print "foo" }}
{{- print "bar" -}}
Неправильно:
{{.foo}}
{{print "foo"}}
{{-print "bar"-}}
Шаблони повинні обрізати пробіли, де це можливо:
foo:
{{- range .Values.items }}
{{ . }}
{{ end -}}
Блоки (такі як контрольні структури) можуть мати відступи для вказівки потоку коду шаблону.
{{ if $foo -}}
{{- with .Bar }}Hello{{ end -}}
{{- end -}}
Однак, оскільки YAML є мовою, орієнтованою на пробіли, часто неможливо, щоб відступи коду слідували цій конвенції.
Пробіли у згенерованих шаблонах
Бажано мінімізувати кількість пробілів у згенерованих шаблонах. Особливо слід уникати численних порожніх рядків, які йдуть один за одним. Але випадкові порожні рядки (особливо між логічними секціями) допустимі.
Це краще:
apiVersion: batch/v1
kind: Job
metadata:
name: example
labels:
first: first
second: second
Це прийнятно:
apiVersion: batch/v1
kind: Job
metadata:
name: example
labels:
first: first
second: second
Але це слід уникати:
apiVersion: batch/v1
kind: Job
metadata:
name: example
labels:
first: first
second: second
Коментарі (Коментарі YAML vs. Коментарі шаблонів)
Як YAML, так і шаблони Helm мають маркери коментарів.
Коментарі YAML:
# Це коментар
type: sprocket
Коментарі шаблонів:
{{- /*
Це коментар.
*/}}
type: frobnitz
Коментарі шаблонів слід використовувати для документування функцій шаблону, наприклад, пояснюючи визначений шаблон:
{{- /*
mychart.shortname надає скорочену версію імені релізу до 6 символів.
*/}}
{{ define "mychart.shortname" -}}
{{ .Release.Name | trunc 6 }}
{{- end -}}
Всередині шаблонів коментарі YAML можуть використовуватися, коли це корисно для користувачів Helm (можливо) бачити коментарі під час налагодження.
# Це може спричинити проблеми, якщо значення більше ніж 100Gi
memory: {{ .Values.maxMem | quote }}
Вищенаведений коментар видимий, коли користувач виконує helm install --debug
, тоді як коментарі, вказані в секціях {{- /* */}}
, не видно.
Остерігайтеся додавання #
коментарів YAML у секції шаблону, що містять значення Helm, які можуть бути потрібні для деяких функцій шаблону.
Наприклад, якщо функція required
вводиться у наведеному вище прикладі, і maxMem
не встановлено, коментар #
YAML спричинить помилку рендерингу.
Правильно: helm template
не рендерить цей блок
{{- /*
# Це може спричинити проблеми, якщо значення більше ніж 100Gi
memory: {{ required "maxMem must be set" .Values.maxMem | quote }}
*/ -}}
Неправильно: helm template
повертає Error: execution error at (templates/test.yaml:2:13): maxMem must be set
# Це може спричинити проблеми, якщо значення більше ніж 100Gi
# memory: {{ required .Values.maxMem "maxMem must be set" | quote }}
Огляньте Налагодження шаблонів для іншого прикладу цієї поведінки того, як коментарі YAML залишаються недоторканими.
Використання JSON у шаблонах і виході шаблонів
YAML є надмножиною JSON. У деяких випадках використання синтаксису JSON може бути більш читабельним, ніж інші представлення YAML.
Наприклад, цей YAML ближчий до звичайного методу представлення списків у YAML:
arguments:
- "--dirname"
- "/foo"
Але його легше читати, коли його стисло представлено у стилі списку JSON:
arguments: ["--dirname", "/foo"]
Використання JSON для підвищення читабельності є корисним. Однак синтаксис JSON не слід використовувати для представлення cкладніших конструкцій.
При роботі з чистим JSON, вбудованим всередині YAML (наприклад, конфігурація контейнера ініціалізації), звичайно, доречно використовувати формат JSON.