Helm — это инструмент управления пакетами для Kubernetes.Если сравнить его с операционной системой, то Helm похож на yum, apt-get и homebrew. Использование шаблона Helm может облегчить нам развертывание и управление нашими собственными приложениями. Эта статья поможет вам быстро начать работу с шаблоном Helm на основе Helm3.0+.
Prerequisite
Для выполнения этого примера необходимо подготовить:
- Установить Helm (Helm 3.0+)
- Кластер Kubernetes
Quick Start
Прежде чем мы начнем, давайте кратко разберемся с основными принципами шаблона Helm. На самом деле это очень просто: Helm использует язык шаблонов gotemplate для написания файлов шаблонов, представляющих ресурсы Kubernetes (развертывание, сервис и т. д.), и предоставляет пользователям возможность настраивать эти переменные шаблона. Во время развертывания Helm преобразует шаблоны в настоящие файлы ресурсов Kubernetes с помощью механизма шаблонов и развертывает их на узлах.
Создайте шаблон с помощью следующей команды:
$ helm create mychart
Эта команда создаст папку со следующей структурой в текущем каталоге:
mychart
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
-
templates/
Каталог содержит файлы шаблонов.Когда Helm нужно сгенерировать диаграммы, он отобразит файлы шаблонов в этом каталоге и отправит результаты рендеринга в kubernetes. -
values.yaml
файл сохраняет значения шаблона по умолчанию, пользователь можетhelm install
илиhelm upgrade
Новое значение может быть указано вместо значения по умолчанию. -
Chart.yaml
Файл содержит основную информацию описания диаграммы, и на эту информацию описания также можно ссылаться в шаблоне. -
_helper.tpl
Используется для сохранения некоторых шаблонов, которые можно повторно использовать в этой диаграмме.
Шаблон инициализации подготавливает для нас общие ресурсы, такие как деплоймент, вход, сервис, в Quick Start нам эти ресурсы не нужны./templates
Файлы в папке удаляются и создаютсяmychart/templates/configmap.yaml
документ:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
Этот файл является представлениемConfigMap
файл шаблона, который{{ .Release.Name }}
это синтаксис шаблона gotemplate, использующийhelm install
Разверните шаблон:
# 其中clunky-serval是releaseNamed
$ helm install clunky-serval ./mychart
NAME: clunky-serval
LAST DEPLOYED: Tue Nov 1 17:45:37 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None
После успешного развертывания используйтеhelm get manifest clunky-serval
Команда может увидеть развернутый файл yaml:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: clunky-serval-configmap
data:
myvalue: "Hello World"
можно увидеть,{{ .Release.Name }}
был заменен наclunky-serval
.
Основы шаблона Go
Шаблон Helm написан с помощью шаблона go, поэтому сначала нам нужно освоить базовый синтаксис gotemplate. директива шаблона gotemplate задается{{
и}}
пакеты, такие как в Quick Start{{ .Release.Name }}
, имя текущего Релиза будет выведено после рендеринга шаблона. Значения, передаваемые в шаблоны, можно рассматривать как объекты с пространствами имен, где(.)
Элементы для каждого пространства имен разделены. далеко слева(.)
Представляет самое верхнее пространство имен в текущей области. Объект Release — это один из встроенных объектов Helm, который мы рассмотрим более подробно позже.
Шаблонные методы и конвейеры
В дополнение к переменным шаблона мы также можем использовать методы шаблона и конвейеры для создания шаблонов, которые являются функциями, предоставляемыми шаблоном go. Например, используйтеquote
метод добавления двойных кавычек к строкам:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ quote .Values.favorite.drink }}
food: {{ quote .Values.favorite.food }}
gotemplate не предоставляет много методов изначально, многие методы в helm взяты из этой библиотеки:GitHub.com/мастермайндс…
Полный список методов Helm:helm.is/docs/chart_…
Pipeline — это мощная функция, предоставляемая шаблоном go, который заимствует концепцию операции конвейера (|) в UNIX (cat foo.txt | grep bar). Конвейеры — это эффективный способ последовательного выполнения нескольких задач. Перепишите приведенный выше пример, используя каналы:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | quote }}
food: {{ .Values.favorite.food | quote }}
В этом примере мы используем оператор канала (|) вместо исходного вызова функции. Как и каналы UNIX, каналы шаблонов поддерживают операции объединения в цепочки:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | quote }}
# 大写,然后双引号包裹
food: {{ .Values.favorite.food | upper | quote }}
В цепной операцииЗначение на левой стороне канала используется как последний параметр в функции на правой стороне канала.,Напримерrepeat
Функциональная подпись функцииrepeat COUNT STRING
, вы можете использовать конвейер для передачи таких параметров:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
# repeat 5 .Values.favorite.drink
drink: {{ .Values.favorite.drink | repeat 5 | quote }}
food: {{ .Values.favorite.food | upper | quote }}
При написании шаблонов Helm рекомендуется использовать каналы вместо вызовов функций.
поток управления
IF/ELSE
Синтаксис оператора if/else следующий:
{{ if PIPELINE }}
# Do something
{{ else if OTHER PIPELINE }}
# Do something else
{{ else }}
# Default case
{{ end }}
когдаPIPELINE
Значение следующее, оцениваемое какfalse
:
- логическое значение false
- цифровой ноль
- пустая строка
- nil
- Пустая коллекция (карта, массив)
Следующий шаблон определит,.Values.favorite.drink == "coffee"
затем добавьтеmug: true
.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}
{{ if eq .Values.favorite.drink "coffee" }}mug: true{{ end }}
With
{{ with PIPELINE }}
# with声明的作用域
{{ end }}
with
для изменения текущей области (.
). упоминалось выше в{{ .Release.Name }}
, самый левый (.
) представляет пространство имен верхнего уровня в текущей области,.Values
Укажите шаблону искать пространство имен верхнего уровня текущей области.Values
объект. использоватьwith
Чтобы изменить текущую область действия переменной шаблона, поместите (.
) к другому объекту:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
{{- end }}
В приведенном выше примере вwith
в пределах ({- with .xxxx}
прибыть{{- end}}
между) можно напрямую сослаться.drink
и.food
,Это потому что{{- with .Values.favorite}}
ПучокValues.favorite
назначенный текущей области (.
).
range
range
Используется для перебора массива или карты. Напримерvalues.yaml
Файл содержит следующую информацию:
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
использовать{{ range}}...{{ end}}
цикл операторов циклаpizzaToppings
множество:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
toppings: |-
{{- range .Values.pizzaToppings }}
- {{ . | title | quote }}
{{- end }}
Результат рендеринга приведенного выше шаблона выглядит следующим образом:
apiVersion: v1
kind: ConfigMap
metadata:
name: RELEASE-NAME-configmap
data:
toppings: |-
- "Mushrooms"
- "Cheese"
- "Peppers"
- "Onions"
можно увидеть,range
пройденный.Values.pizzaToppings
массив и область внутри цикла (.
) устанавливается в значение для каждого цикла.range
Вы также можете получить итерируемые объекты одновременноkey
,value
, например следующий шаблон:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
toppings: |-
{{- range $index, $topping := .Values.pizzaToppings }}
{{ $index }}: {{ $topping }}
{{- end }}
Результат рендеринга следующий:
apiVersion: v1
kind: ConfigMap
metadata:
name: RELEASE-NAME-configmap
data:
toppings: |-
0: mushrooms
1: cheese
2: peppers
3: onions
обработка пробелов
В приведенном выше примере шаблона вы заметите, что в некоторых директивах шаблона появляется тире.-
,Например{{- xxx}}
или{{xxx -}}
. Эффект этого подчеркивания заключается в удалении не только пробелов. Например, следующий шаблон:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}
{{ if eq .Values.favorite.drink "coffee" }}
mug: true
{{ end }}
Отрендеренный результат:
apiVersion: v1
kind: ConfigMap
metadata:
name: telling-chimp-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
mug: true
Видно, что вmug: true
Перед и после есть лишняя пустая строка, потому что в процессе рендеринга шаблона удалить{{
и}}
, но оставьте остальные пробелы. использовать-
Чтобы исключить пробелы, занятые операторами шаблона, чтобы визуально продемонстрировать эффект удаления, в следующих примерах звездочки (*) обозначают удаленные пробелы:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}*
**{{- if eq .Values.favorite.drink "coffee" }}
mug: true*
**{{- end }}
Результат рендеринга:
...
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
mug: true
...
черточка слева({{- xxx}}
) означает убрать пробел слева, а тире справа ({{xxx -}}
) означает устранение пробелов справа. Будьте осторожны, не пишите:
...
food: {{ .Values.favorite.food | upper | quote }}
{{- if eq .Values.favorite.drink "coffee" -}}
mug: true
{{- end -}}
...
Результатом этого рендеринга будет:food: "PIZZA"mug:true
.
Помимо использования-
Помимо устранения пробелов в шаблонах, Helm также предоставляетindent
Функции добавляют пробелы для отступа:
...
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
{{ "mug: true" | indent2 }} # 为"mug: true"增加两个空格的缩进。
...
встроенные объекты
Прицел верхнего уровня Helm(.)
Объекты, на которые можно напрямую ссылаться ниже, называются встроенными объектами, как и наиболее распространенные в приведенном выше примере..Values.xxx
,этоValues
Это один из встроенных объектов Helm. Объекты могут содержать методы в дополнение к значениям.
Ссылка на документацию:helm.is/docs/chart_…
Release
Указывает текущую версию
-
Release.Name
Текущее название выпуска -
Release.Namespace
Пространство имен для публикации (пространство имен k8s) -
Release.IsUpgrade
Установите значение true, если текущая операция является обновлением или откатом. -
Release.IsInstall
true, если текущим действием является установка -
Release.Revision
Текущая версия выпуска, начиная с 1 и увеличивающаяся при каждом обновлении или откате. -
Release.Service
всегда "руль"
e.g:
{{ .Release.Name}}
Values
Переменные, используемые для отображения шаблонов, такие какvalues.yaml
переменные в файле и указанные пользователем при развертывании. (-установить, -f).
Chart
Chart.yaml
Переменные в файловых файлах, например:{{ .Chart.Name }}-{{ .Chart.Version}}
выводmychart-0.1.0
.
Files
Предоставляет методы доступа к файлам
-
Files.Get
Получить содержимое файла с указанным именем файла -
Files.GetBytes
Возвращает двоичный массив файлов, используемый при чтении двоичных файлов (например, изображений). -
Files.Glob
Возвращает массив файлов, соответствующих заданному шаблону глобуса оболочки, например:{{ .Files.Glob "*.yaml" }}
-
Files.Lines
Итерация по файлу строка за строкой -
Files.AsSecrets
Возвращает кодировку Base 64 содержимого файла. -
Files.AsConfig
Возвращает карту YAML, соответствующую содержимому файла.
Capabilities
Предоставляет информацию о кластере Kubernetes.
- Capabilities.APIVersions Список версий API, поддерживаемых кластером.
- Capabilities.APIVersions.Has $version указывает, поддерживает ли текущий кластер текущую версию API (например, пакетную/v1) или ресурс (например, apps/v1/Deployment).
- Capabilities.KubeVersion / Capabilities.KubeVersion.Version Номер версии Kubernetes
- Capabilities.KubeVersion.Major Номер основной версии Kubernetes
- Capabilities.KubeVersion.Minor Номер подрывной деятельности Kubernetes
обработка файлов
комбинироватьFiles
Встроенные переменные, мы можем встраивать содержимое файла в шаблон, наиболее распространенным использованием которого является использование файла конфигурации приложения в качествеConfigMap
илиSecret
Опубликовано вместе с приложением. В разделе встроенных переменных выше было представленоFiles
Это встроенная переменная, вы уже грамотно догадалисьFiles.AsConfig
иFiles.AsSecrets
используется для преобразования файла конфигурации вConfigMap
иSecret
из. В этом разделе мы приводим пример использования этих двух функций.
Предположим, у нас естьfoo.yaml
иbar.yaml
Два файла конфигурации (хранятся вvalues.yaml
в том же каталоге):
# foo.yaml
foo: true
fileName: foo.yaml
# bar.yaml
bar: true
fileName: bar.yaml
Используйте следующим образомConfigMap
шаблон:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
data:
{{(.Files.Glob "*.yaml").AsConfig | indent 2 }}
Результат рендеринга:
apiVersion: v1
kind: ConfigMap
metadata:
name: RELEASE-NAME-config
data:
bar.yaml: |-
bar: true
fileName: bar.yaml
foo.yaml: |-
foo: true
fileName: foo.yaml
В приведенном выше примере мы используем.Files.Glob
функция, чтобы получить все*.yaml
файл шаблона, затем вызовитеAsConfig
Вывод метода принимает имя файла в качестве ключа и содержимое файла в качестве значения.yaml
формат, использованиеindent
добавить правильный отступ, чтобы обеспечитьyaml
Синтаксическая корректность файла, используемого в этом примереident 2
сделать отступ на два пробела.AsSecret
Использование аналогично:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
data:
{{(.Files.Glob "*.yaml").AsSecrets | indent 2 }}
Результат рендеринга:
apiVersion: v1
kind: ConfigMap
metadata:
name: RELEASE-NAME-config
data:
bar.yaml: YmFyOiB0cnVlCmZpbGVOYW1lOiBiYXIueWFtbA==
foo.yaml: Zm9vOiB0cnVlCmZpbGVOYW1lOiBmb28ueWFtbA==
Дополнительные методы обработки файлов см. в документации:helm.is/docs/chart_…
Ссылки на шаблоны/вложенность
Вложение шаблонов позволяет нам вводить другой шаблон в один шаблон, и мы можем отделить повторно используемые шаблоны и повторно вводить их, когда они используются. Например, мы хотим, чтобы все опубликованные ресурсы содержали одинаковый набор меток.На данный момент нам не нужно копировать и вставлять код шаблона метки в шаблон каждого ресурса (такого как деплоймент, сервис, configmap.. ..), но может отображать шаблон метки, который определяется отдельно, а затем ссылается на него в каждом шаблоне ресурса. Ниже мы используем пример, чтобы проиллюстрировать, как ссылаться на шаблоны.
Перед примером давайте взглянем на соглашения об именах файлов Helm:
-
template/
Большинство файлов рассматриваются как манифесты ресурсов Kubernetes (будут отправлены в Kubernetes для создания соответствующих ресурсов). -
NOTES.txt
является исключением - Файлы, имена которых начинаются со знака подчеркивания (_), не отправляются в Kubernetes как ресурсы, но на них могут ссылаться другие шаблоны.
Эти файлы, начинающиеся со знака подчеркивания, используются для определения локальных шаблонов. На самом деле, когда мы впервые создали mychart, мы увидели файл с именем _helpers.tpl. Этот файл является расположением по умолчанию для частичных шаблонов.
helm create mychart
В созданном шаблоне по умолчанию для нас был предоставлен набор частичных шаблонов.Следующее берет шаблон по умолчанию в качестве примера, чтобы продемонстрировать, как ссылаться на шаблон.
определить шаблон
использовать{{ define}}...{{end}}
Шаблоны могут быть определены:
{{ define "MY.NAME" }}
# body of template here
{{ end }}
Например, в_helpers.tpl
, Helm определяет некоторые шаблоны, взяв за пример метку ресурса Kubernetes:
...
{{- define "mychart.labels" -}}
helm.sh/chart: {{ include "mychart.chart" . }}
{{ include "mychart.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
...
использовать{{ include 模板名称}}
эталонный шаблон, вdeployment.yaml
Есть:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . }}
# include引用mychart.labels
labels:{{ include "mychart.labels" . | nindent 4 }}
Обратите внимание, что при использованииdefine
При определении шаблона не делайте отступ шаблона, а используйтеinclude
При цитированииnindent
илиindent
делать отступ.nindent
иindent
метод аналогичен, ноnindent
добавит пустую строку в начале, если вы используетеindent
, приведенный выше шаблон можно записать так:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . | indent 2}}
labels:
{{ include "mychart.labels" . | indent 4 }}
Приложение: Общие команды
helm create
helm create используется для создания шаблонов
# 创建一个名为mychart的template
$ helm create mychart
helm install
helm install используется для развертывания диаграммы
# 部署./redis目录,并设置release name为myredis
$ helm install myredis ./redis
# 通过-f指定变量文件,(覆盖默认的values.yaml)
$ helm install -f myvalues.yaml myredis ./redis
# -n 指定需要部署的命名空间
$ helm install myredis ./redis -n redis
# 使用--set 覆盖values.yaml中的默认值
$ helm install --set name=prod myredis ./redis
helm uninstall
Удалить диаграмму на основе названия выпуска
# 卸载默认命名空间下的myredis
$ helm uninstall myredis
# 卸载redis命名空间下的myredis
$ helm uninstall myredis -n redis
helm list
Список релизов
# 列出默认命名空间下的所有release
$ helm list
# 列出redis命名空间下的release
$ helm list -n redis
# 列出所有命名空间下的release
$ helm list -A
--dry-run & --debug
использовать--dry-run
и--debug
шаблон отладки параметров
# 输出chart的渲染结果
helm install mychart --debug ./mychart
# 输出chart的渲染结果,并模拟部署(kubectl apply --dry-run ...)
helm install mychart --debug --dry-run./mychart