Управление релизом Helm
Использование функций в шаблоне Helm
Язык шаблона Helm определяет функции , которые используются для преобразования значений из файла values.yaml
. Синтаксис функции следует структуре {{ functionName arg1 arg2 ... }}. Рассмотрим функцию quote
в качестве примера для просмотра этого синтаксиса.
Функция quote
упаковывает значение в кавычки, чтобы указать использование string
. Предположим, что вы определите следующий файл values.yaml
:
apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes
ingress:
enabled: true
Вы решили использовать значение ingress.enabled
в качестве логического значения при определении необходимости создания манифеста входящего трафика. Чтобы использовать значение enabled
в качестве логического значения, вы ссылаетесь на это значение с помощью {{ .Values.ingress.enabled }}
.
Позже вы решили отобразить поле в виде строки в файле templates/Notes.txt
. Таким образом, поскольку правила приведения типов YAML могут привести к труднодоступным ошибкам в шаблонах, вы решаете следовать рекомендациям и быть явными при включении строк в свои шаблоны. Например, enabled: false
не равно enabled: "false"
.
Чтобы отобразить значение в виде строки, используйте {{ quote .Values.ingress.enabled }}
для ссылки на логическое значение как на строку.
Использование конвейеров в шаблоне Helm
Конвейеры используются, когда более одной функции необходимо работать с значением. Конвейер позволяет отправлять значение или результат функции в другую функцию. Например, можно переписать указанную выше функцию quote
как {{ .Values.ingress.enabled | quote }}
. Обратите внимание, что |
указывает, что значение отправляется в функцию quote
.
Вот еще один пример. Предположим, что вы хотите преобразовать значение в верхний регистр и заключить его в кавычки. Утверждение можно написать как {{ .Values.ingress.enabled | upper | quote }}
. Обратите внимание, как значение обрабатывается функцией upper
, а затем quote
функцией.
Язык шаблона включает более 60 функций, которые позволяют предоставлять, искать и преобразовывать значения и объекты в шаблонах.
Использование условного управления потоком в шаблоне Helm
Условное управление потоком позволяет определить структуру или данные, которые будут включены в создаваемый файл манифеста. Например, может потребоваться включить различные значения на основе целевого объекта развертывания или элемента управления, если создается файл манифеста.
Блок if / else
является такой структурой потока управления и соответствует следующему макету:
{{ if | pipeline | }}
# Do something
{{ else if | other pipeline | }}
# Do something else
{{ else }}
# Default case
{{ end }}
Предположим, вы решите, что файл манифеста входа для чарта создается только в определенных случаях. В следующем примере показано, как выполнить это с помощью инструкции if
:
{{ if .Values.ingress.enabled }}
apiVersion: extensions/v1
kind: Ingress
metadata:
name: ...
labels:
...
annotations:
...
spec:
rules:
...
{{ end }}
Помните, что плейсхолдеры можно использовать для добавления метаданных в шаблон. Файлы шаблонов анализируются и оцениваются последовательно с помощью языка шаблона сверху вниз. В предыдущем примере подсистема шаблонов создает только содержимое файла манифеста, если значение .Values.ingress.enabled
равно true
.
При обработке инструкции обработчик шаблонов удаляет содержимое, объявленное внутри синтаксиса {{ }}
, и оставляет оставшиеся пробелы. Этот синтаксис приводит к тому, что обработчик шаблонов включает новую строку для строки инструкции if
. Если вы оставляете содержимое предыдущего файла as-is, вы заметите, что в YAML появляются пустые строки, и создаётся файл входного манифеста.
YAML дает смысл пробелам. Поэтому вкладки, пробелыи символы новой строки считаются важными. Чтобы устранить проблему нежелательного пробела, можно перезаписать файл следующим образом:
{{- if .Values.ingress.enabled -}}
apiVersion: extensions/v1
kind: Ingress
metadata:
name: ...
labels:
...
annotations:
...
spec:
rules:
...
{{- end }}
Обратите внимание на использование символа -
в составе начальной {{-
и конечной -}}
последовательности инструкции. Символ -
указывает парсеру удалить пробельные символы.
{{-
удаляет пробелы в начале строки, а -}}
— в конце строки, включая символ новой строки.
Как выполнить итерацию по коллекции значений в шаблоне Helm
YAML позволяет определять коллекции элементов и использовать отдельные элементы в качестве значений в шаблонах. Доступ к элементам в коллекции возможен с помощью индексатора. Однако язык шаблона Helm поддерживает итерацию коллекции значений с помощью оператора range
.
Предположим, вы определите список значений в файле values.yaml
, чтобы указать дополнительные узлы входящего трафика. Ниже приведен пример значений:
ingress:
enabled: true
extraHosts:
- name: host1.local
path: /
- name: host2.local
path: /
- name: host3.local
path: /
Оператор диапазона позволяет обработчику шаблонов выполнять итерацию по .Values.ingress.extraHosts
. В следующем фрагменте кода показан сжатый пример с помощью оператора range
:
{{- if .Values.ingress.enabled -}}
apiVersion: extensions/v1
kind: Ingress
metadata:
...
spec:
rules:
...
{{- range .Values.ingress.extraHosts }}
- host: {{ .name }}
http:
paths:
- path: {{ .path }}
...
{{- end }}
...
{{- end }}
Как управлять объёмом значений в шаблоне Helm
Когда у вас есть значения, определенные на нескольких уровнях вложенности, ваш синтаксис может стать длинным и громоздким при их включении в шаблон. Действие with
позволяет ограничить область действия переменных в шаблоне.
Помните, что .
, используемый в шаблоне Helm, ссылается на текущую область. Например, .Values
указывает обработчику шаблонов найти объект Values в текущей области. Предположим, что вы используете файл values.yaml
из более ранних версий для создания файла манифеста карты конфигурации:
ingress:
enabled: true
extraHosts:
- name: host1.local
path: /
- name: host2.local
path: /
- name: host3.local
path: /
Вместо доступа к значению пути каждого элемента с помощью {{ .Values.ingress.extraHosts.path }}
можно использовать действие with
. В следующем фрагменте кода показан пример с помощью оператора range
для создания файла манифеста карты конфигурации:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- with .Values.ingress.extraHosts }}
hostname: {{ .name }}
path: {{ .path }}
{{ end }}
{{- with .Values.ingress.extraHosts }}
ограничивает область значений массивом .Values.ingress.extraHosts
.
Действие with
ограничивает область. Доступ к другим объектам из родительской области невозможно. Предположим, что вы также хотите получить доступ к {{ .Release.Name }}
диаграммы в блоке кода with
. Чтобы получить доступ к родительским объектам, необходимо указать корневую область с помощью символа $
или перезаписать код. Ниже приведен обновленный код, показывающий, как включить родительские объекты с помощью символа $
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- with .Values.ingress.extraHosts }}
hostname: {{ .name }}
path: {{ .path }}
release: {{ $.Release.Name}}
{{ end }}
Заметка
Существует несколько конструкций, доступных на языке шаблона Helm для управления потоком. Сводная часть этого модуля содержит раздел со ссылками на документацию Helm, чтобы узнать больше.
Как в Helm определить зависимости чарта
Чарт позволяет объявить зависимости для поддержки основного приложения и является частью установленного релиза.
Вы можете либо создать поддиаграмму с помощью команды helm create
, указав расположение новой диаграммы в папке /charts
, либо использовать команду helm dependency
. Помните, что папка /charts
может содержать поддиаграммы, развернутые как часть выпуска основной диаграммы.
Команда helm dependency
позволяет управлять зависимостями, включенными из репозитория Helm. Команда использует метаданные, определенные в разделе dependencies
файла значений диаграммы. Укажите имя, номер версии и репозиторий для установки подчарта. Ниже приведён фрагмент файла values.yaml
, где диаграмма MongoDB указана в списке зависимостей.
apiVersion: v2
name: my-app
description: A Helm chart for Kubernetes
...
dependencies:
- name: mongodb
version: 10.27.2
repository: https://marketplace.azurecr.io/helm/v1/repo
После определения метаданных зависимостей выполните команду helm dependency build
, чтобы получить упаковаемую диаграмму tar. Команда сборки диаграммы загружает диаграмму в папку charts/
.
helm dependency build ./app-chart
Подграфики управляются отдельно от основной диаграммы и могут потребовать обновления по мере выхода новых версий. Команда для обновления поддиаграмм helm dependency update
. Эта команда получает новые версии субчарта, удаляя устаревшие пакеты.
helm dependency update ./app-chart
Помните, что зависимость диаграммы не ограничивается другими приложениями. Вы можете повторно использовать логику шаблонов во всех ваших диаграммах и создать зависимость специально для управления этой логикой в качестве составляющей зависимости диаграмм. Вы получите пример этой стратегии в следующем упражнении.
Как обновить выпуск Helm
Helm позволяет обновлять существующие выпуски как разностную часть всех изменений, которые применяются к диаграмме и ее зависимостям.
Например, предположим, что команда разработчиков примера webapp
в этом уроке вносит изменения кода, влияющие только на функциональные возможности веб-сайта. Команда обновляет файл Chart.yaml
, чтобы отразить новую версию приложения:
- Обновляет образ контейнера веб-приложения и присваивает ему тег
webapp: linux-v2
при публикации образа в реестре контейнеров. - Обновляет значение
dockerTag
наlinux-v2
и значение версии диаграммы на0.2.0
в файле значений диаграммы.
Ниже приведен пример обновленного файла values.yaml
:
apiVersion: v2
name: my-app
description: A Helm chart for Kubernetes
type: application
version: 0.2.0
appVersion: 1.0.0
registry: "my-acr-registry.azurecr.io"
dockerTag: "linux-v2"
pullPolicy: "Always"
Вместо удаления текущего выпуска используйте команду helm upgrade
для обновления существующего выпуска Helm.
helm upgrade my-app ./app-chart
Помните, что Helm создает разницу в изменениях, внесенных в диаграмму Helm при обновлении релиза. Таким образом, обновление Helm обновляет только компоненты, определенные в разностном режиме. В этом примере повторно развертывается только веб-сайт.
После завершения обновления можно просмотреть историю развертывания релиза с помощью команды helm history
с именем релиза.
helm history my-app
Команда history возвращает несколько полей, которые описывают выпуск, как показано в примере ниже:
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Oct 11 17:25:33 2021 deployed aspnet-core-1.3.18 3.1.19 Install complete
Обратите внимание на поле revision
в результате. Helm отслеживает информацию о выпуске всех выпусков, выполненных для диаграммы Helm. При установке новой версии чартов Helm число ревизий увеличивается на одну, а информация о новом выпуске связывается с этой ревизией.
Ниже приведен пример той же команды журнала, выполняемой после новой версии веб-приложения:
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Oct 11 17:25:33 2021 superseded aspnet-core-1.3.18 3.1.19 Install complete
2 Mon Oct 11 17:35:13 2021 deployed aspnet-core-1.3.18 3.1.19 Upgrade complete
Как откатить релиз Helm
Helm позволяет выполнить откат текущего релиза Helm до предыдущего установленного релиза. Напомним, что ранее Helm отслеживает информацию о выпуске всех выпусков чарта Helm.
Команда helm rollback
используется для отката к определенной редакции выпуска Helm. Эта команда использует два параметра. Первый параметр определяет имя выпуска, а второй — номер редакции выпуска.
helm rollback my-app 2
Команда helm rollback
откатывает версию релиза приложения до указанной ревизии и обновляет историю релизов приложения. Следующий запуск команды helm history
отображает последний активный номер ревизии как последнюю запись в выпуске.
Например, допустим, что команда разработчиков примера webapp
в этом разделе обнаруживает ошибку в веб-приложении для отслеживания дронов и нужно откатиться к предыдущему выпуску. Вместо удаления текущего выпуска и установки предыдущей версии они откатятся к рабочему выпуску.
helm rollback my-app 1
После завершения отката вы можете просмотреть историю развертывания с помощью команды helm history
.
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Oct 11 17:25:33 2021 superseded aspnet-core-1.3.18 3.1.19 Install complete
2 Mon Oct 11 17:35:13 2021 superseded aspnet-core-1.3.18 3.1.19 Rolled back to 1
3 Mon Oct 11 17:38:13 2021 deployed aspnet-core-1.3.18 3.1.19 Upgrade complete
Обратите внимание, как в поле описания отображается номер версии отмены, чтобы вам было проще отслеживать изменения.