Быстрый старт с шаблоном Helm

Kubernetes

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.IsInstalltrue, если текущим действием является установка
  • 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

Ссылаться на

helm.is/docs/chart_…