Субчарти та глобальні значення
До цього моменту ми працювали тільки з одним чартом. Але чарти можуть мати залежності, які називаються субчартами, що також мають свої власні значення і шаблони. У цьому розділі ми створимо субчарт і розглянемо різні способи доступу до значень зсередини шаблонів.
Перед тим, як перейти до коду, є кілька важливих деталей, які слід знати про субчарти:
- Субчарт вважається "автономним", що означає, що субчарт ніколи не може прямо залежати від батьківського чарту.
- Тому субчарт не може отримувати доступ до значень свого пращура.
- Батьківський чарт може перевизначати значення для субчартів.
- Helm має концепцію глобальних значень, які можуть бути доступні всім чартам.
Ці обмеження не завжди застосовуються до бібліотечних чартів, які розроблені для надання стандартної функціональності.
Під час роботи з прикладами в цьому розділі ці концепції стануть зрозумілішими.
Створення субчарту
Для цих вправ ми почнемо з чарту mychart/
, який ми створили на початку цього посібника, і додамо новий чарт всередину його.
$ cd mychart/charts
$ helm create mysubchart
Creating mysubchart
$ rm -rf mysubchart/templates/*
Зверніть увагу, що ми видалили всі базові шаблони, щоб почати з нуля. У цьому посібнику ми зосереджені на тому, як працюють шаблони, а не на управлінні залежностями. Але Посібник з Чартів містить більше інформації про те, як працюють субчарти.
Додавання значень та шаблону до субчарту
Далі створимо простий шаблон і файл значень для чарту mysubchart
. У mychart/charts/mysubchart
вже має бути файл values.yaml
. Налаштуємо його так:
dessert: cake
Далі створимо новий шаблон ConfigMap у mychart/charts/mysubchart/templates/configmap.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
Оскільки кожен субчарт є самостіним чартом, ми можемо протестувати mysubchart
окремо:
$ helm install --generate-name --dry-run --debug mychart/charts/mysubchart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/helm.sh/helm/_scratch/mychart/charts/mysubchart
NAME: newbie-elk
TARGET NAMESPACE: default
CHART: mysubchart 0.1.0
MANIFEST:
---
# Source: mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: newbie-elk-cfgmap2
data:
dessert: cake
Перевизначення значень з батьківського чарту
Наш оригінальний чарт, mychart
, тепер є батьківським чартом для mysubchart
. Ці стосунки базується виключно на тому, що mysubchart
знаходиться в mychart/charts
.
Оскільки mychart
є батьківським чартом, ми можемо вказати конфігурацію в mychart
і передати цю конфігурацію в mysubchart
. Наприклад, ми можемо змінити mychart/values.yaml
таким чином:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
Зверніть увагу на останні два рядки. Будь-які директиви всередині секції mysubchart
будуть передані в чарт mysubchart
. Отже, якщо ми виконаємо helm install --generate-name --dry-run --debug mychart
, однією з речей, які ми побачимо, буде ConfigMap mysubchart
:
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: unhinged-bee-cfgmap2
data:
dessert: ice cream
Значення на верхньому рівні тепер перевизначило значення субчарту.
Важливо помітити, що ми не змінили шаблон mychart/charts/mysubchart/templates/configmap.yaml
, щоб вказати на .Values.mysubchart.dessert
. З точки зору цього шаблону, значення все ще розташоване в .Values.dessert
. Оскільки шаблонний движок передає значення далі, він встановлює область видимості. Отже, для шаблонів mysubchart
тільки значення, специфічні для mysubchart
, будуть доступні в .Values
.
Іноді, проте, ви хочете, щоб певні значення були доступні всім шаблонам. Це досягається за допомогою глобальних значень чарту.
Глобальні значення чарту
Глобальні значення — це значення, які можуть бути доступні з будь-якого чарту або субчарту під тим самим імʼям. Глобальні значення потребують явного оголошення. Ви не можете використовувати вже наявні неглобальні значення як глобальні.
Тип даних Values має зарезервовану секцію Values.global
, де можна задати глобальні значення. Визначимо одне в нашому файлі mychart/values.yaml
.
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
global:
salad: caesar
Завдяки способу роботи глобальних значень, як mychart/templates/configmap.yaml
, так і mysubchart/templates/configmap.yaml
повинні мати змогу отримати це значення як {{ .Values.global.salad }}
.
mychart/templates/configmap.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
salad: {{ .Values.global.salad }}
mysubchart/templates/configmap.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
salad: {{ .Values.global.salad }}
Тепер, якщо ми виконаємо установку в режимі dry run, ми побачимо одне й те ж значення в обох виводах:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-configmap
data:
salad: caesar
---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-cfgmap2
data:
dessert: ice cream
salad: caesar
Глобальні значення корисні для передачі такої інформації, хоча це вимагає певного планування, щоб переконатися, що правильні шаблони налаштовані для використання глобальних значень.
Поширення шаблонів з субчартами
Батьківські чарти та субчарти можуть ділитися шаблонами. Будь-який визначений блок у будь-якому чарті доступний іншим чартам.
Наприклад, ми можемо визначити простий шаблон таким чином:
{{- define "labels" }}from: mychart{{ end }}
Згадайте, як мітки на шаблонах є глобально спільними. Отже, шаблон labels
можна включити з будь-якого іншого чарту.
Хоча розробники чартів можуть вибирати між include
та template
, однією з переваг використання include
є те, що include
може динамічно посилатися на шаблони:
{{ include $mytemplate }}
Вищезазначене призведе до розʼєднання посилань на $mytemplate
. Функція template
, навпаки, приймає тільки рядковий літерал.
Уникнення використання блоків
Мова шаблонів Go надає ключове слово block
, яке дозволяє розробникам надати стандартну реалізацію, яка потім перевизначається. У чарті Helm блоки не є найкращим інструментом для перевизначення, оскільки якщо кілька реалізацій одного блоку надаються, вибір однієї з них є непередбачуваним.
Рекомендація — використовувати include
.