Субчарты и глобальные значения
До сих пор мы работали только с одним чартом. Но чарты могут иметь зависимости, называемые субчартами, которые также имеют собственные значения и шаблоны. В этом разделе мы создадим субчарт и рассмотрим различные способы доступа к значениям из шаблонов.
Прежде чем перейти к коду, следует узнать несколько важных деталей о субчартах приложений:
- Субчарт считается «автономным», то есть субчарт никогда не может явно зависеть от родительского чарта.
- По этой причине субчарт не может обращаться к значениям родительского чарта.
- Родительский чарт может переопределять значения субчартов.
- В Helm существует концепция глобальных значений, которые доступны всем чартам.
Эти ограничения не обязательно применимы к library-чартам, которые предназначены для предоставления стандартизированных вспомогательных функций.
В процессе изучения примеров этого раздела многие концепции станут понятнее.
Создание субчарта
Для этих упражнений мы начнём с чарта mychart/, созданного в начале руководства, и добавим внутрь него новый чарт.
$ cd mychart/charts
$ helm create mysubchart
Creating mysubchart
$ rm -rf mysubchart/templates/*
Обратите внимание: как и ранее, мы удалили все базовые шаблоны, чтобы начать с нуля. В этом руководстве мы сосредоточены на работе шаблонов, а не на управлении зависимостями. Дополнительную информацию о работе субчартов можно найти в руководстве по чартам.
Добавление значений и шаблона в субчарт
Далее создадим простой шаблон и файл values для нашего чарта 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 в .Values будут доступны только значения, предназначенные специально для mysubchart.
Однако иногда требуется, чтобы определённые значения были доступны всем шаблонам. Это достигается с помощью глобальных значений чарта.
Глобальные значения чарта
Глобальные значения — это значения, к которым можно обращаться из любого чарта или субчарта по одному и тому же имени. Глобальные значения требуют явного объявления. Нельзя использовать существующее неглобальное значение как глобальное.
Тип данных 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 }}
Теперь, если мы выполним пробную установку, мы увидим одинаковое значение в обоих результатах:
# 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.