Управление релизом 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 развёртывает все поддиаграммы как зависимости для основной диаграммы в кластере Kubernetes.

Вы можете либо создать поддиаграмму с помощью команды 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 позволяет обновлять существующие выпуски как разностную часть всех изменений, которые применяются к диаграмме и ее зависимостям.

Схема показывает, как команда обновления Helm создает разностную часть всех измененных элементов в графике Helm для обновления релиза и создания новой ревизии релиза в кластере Kubernetes.

Например, предположим, что команда разработчиков примера 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

Обратите внимание, как в поле описания отображается номер версии отмены, чтобы вам было проще отслеживать изменения.

Проверка знаний

1.

Предположим, что у вас есть программное решение с двумя критически важными компонентами: веб-приложение и служба, которая обрабатывает онлайн-заказы. Оба компонента являются частью конвейера обработки заказов по сети, но они не имеют зависимости друг от друга. Какая стратегия лучше всего подходит для развертывания этих двух приложений с помощью Helm?

2.

Предположим, у вас есть программное решение, которое имеет веб-сайт в качестве одного из его критически важных компонентов. Веб-сайт является единственным компонентом, который зависит от службы кэширования. Какая стратегия лучше всего подходит для развертывания этих двух приложений с помощью Helm?