Как установить программное обеспечение на кластерах Kubernetes с помощью менеджера пакетов Helm 3

Введение

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

Пакеты Helm называются чартами, и они содержат шаблоны определений ресурсов, которые разворачивают и настраивают указанные приложения с минимальными усилиями со стороны пользователя. С помощью шаблонов вы можете управлять чартом, его настройками и поведением, передавая определения переменных, не модифицируя сам чарт. Пользовательские определения ресурсов, а также изменения уже развернутых определений, Helm управляет автоматически. Развернутый чарт, с возможными настройками, называется релизом.

В этом руководстве вы настроите Helm 3 и узнаете, как устанавливать, обновлять, откатывать и управлять чартами и релизами. Вы также узнаете, как создавать и упаковывать собственные чарты, а также настраивать хранилища чартов, которые содержат чарты, которые вы можете установить немедленно.

Предварительные требования

  • Кластер Kubernetes с включенным управлением доступом на основе ролей (RBAC). Для дополнительной информации о релизах вы можете проверить страницу релизов Helm.

  • Командный инструмент kubectl установлен на вашем локальном компьютере и настроен для подключения к вашему кластеру. Более подробную информацию о установке kubectl можно найти в официальной документации.

    Вы можете проверить свою связь с помощью следующей команды:

    1. kubectl cluster-info

    Если вы не получите ошибок, то подключены к кластеру. Если у вас есть доступ к нескольким кластерам с помощью kubectl, убедитесь, что выбран правильный контекст кластера, запустив:

    1. kubectl config get-contexts

    Вывод покажет доступные конфигурации:

    Вывод
    ТЕКУЩИЙ НАЗВАНИЕ КЛАСТЕР AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin

    Здесь звездочка (*) указывает, что мы подключены к кластеру do-fra1-helm3-example. Чтобы переключиться на другие кластеры, выполните:

    1. kubectl config use-context имя-контекста

Когда вы подключены к правильному кластеру, переходите к Шагу 1 для начала установки Helm.

Шаг 1 — Установка Helm 3

В этом разделе вы установите Helm 3, используя предоставленный официальный скрипт оболочки.

Начните с перехода в /tmp, где вы сохраните скрипт установки, выполнив:

  1. cd /tmp

Загрузите скрипт следующей командой:

  1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

Вы можете изучить get_helm.sh в вашем текстовом редакторе, чтобы убедиться, что он безопасен.

Сделайте его исполняемым, установив разрешения на следующие:

  1. chmod u+x get_helm.sh

Наконец, запустите его для установки Helm 3:

  1. ./get_helm.sh

Вы получите вывод, аналогичный следующему:

Output
Downloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz Verifying checksum... Done. Preparing to install helm into /usr/local/bin helm installed into /usr/local/bin/helm

Вы установили Helm 3 на свой компьютер. Теперь вы узнаете о хранилищах диаграмм и о том, как их использовать.

Шаг 2 — Настройка хранилищ диаграмм

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

Чтобы помочь вам найти подходящий репозиторий, вы можете использовать ArtifactHub.io, открытый веб-сайт, управляемый CNCF, который каталогизирует диаграммы Helm и их репозитории. Он также отслеживает популярные и полезные диаграммы, которые используют другие проекты CNCF, поэтому отличается от репозитория stable, из которого работали предыдущие версии Helm. Для общих проектов, таких как входы Nginx или инструменты мониторинга, это отличный источник.

Вы можете искать диаграмму, которую хотели бы установить, через домашнюю страницу. Поиск диаграммы nginx покажет все индексированные диаграммы, которые с ней связаны.

Вы установите общественную версию, управляемую командой Kubernetes. Ищите ingress-nginx, чтобы найти ее в результатах. Выберите ее, чтобы получить доступ к ее странице.

Каждая диаграмма должна иметь описание, описывающее, что она делает, вместе с командами для добавления ее репозитория в вашу установку и установки диаграммы. Если этого нет, вы все равно можете получить необходимые команды, нажав на кнопку INSTALL справа на странице.

Вы можете щелкнуть синюю кнопку рядом с командой, чтобы скопировать ее. Сделайте это для первой команды и выполните ее:

  1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

Чтобы добавить репозиторий в Helm, вы запускаете helm repo add. Параметры, которые он принимает, – это имя репозитория и его местоположение.

Вывод будет:

Output
"ingress-nginx" has been added to your repositories

При добавлении нового репозитория вам нужно сообщить Helm, что он содержит, запустив:

  1. helm repo update

Вы получите следующий вывод, показывающий, что обновление прошло успешно:

Output
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "ingress-nginx" chart repository Update Complete. ⎈Happy Helming!⎈

На этом этапе вы узнали о ArtifactHub и то, что он предлагает. Вы также добавили новый репозиторий в свою установку Helm. В следующем шаге вы установите диаграмму Helm.

Шаг 3 — Установка диаграммы Helm

В предыдущем разделе вы добавили репозиторий для диаграммы ingress-nginx. Теперь вы установите ее на свой кластер.

Каждая диаграмма имеет конфигурационные переменные, которые вы можете установить, чтобы изменить ее поведение. Эти переменные хранятся в файле, называемом values.yaml, который является частью диаграммы. Если вы не загрузили диаграмму на свой компьютер, вам придется выполнить следующую команду, чтобы просмотреть ее:

  1. helm show values chart_name

Чтобы показать доступные переменные для ingress-nginx, замените chart_name:

  1. helm show values ingress-nginx/ingress-nginx

Вывод будет длинным и покажет содержимое values.yaml для ingress-nginx.

Для установки диаграммы вы можете использовать helm install:

  1. helm install release_name repository/chart_name

A release is a deployed instance of the chart, and here you’re calling it ingress-nginx.

Эта команда установит диаграмму в ваш кластер со значениями переменных по умолчанию. Если вы хотите изменить некоторые из них, вы можете передать новые значения переменных, используя --set:

  1. helm install ingress-nginx/ingress-nginx --set variable_name=variable_value

Вы можете повторить использование --set для стольких переменных, сколько вам нужно. Поскольку мы сейчас не будем настраивать их, установите диаграмму так, как есть, выполнив:

  1. helm install ingress-nginx ingress-nginx/ingress-nginx

Вывод будет аналогичным следующему:

Output
NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 10:12:37 2021 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The ingress-nginx controller has been installed. It may take a few minutes for the LoadBalancer IP to be available. You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller' ...

Обратите внимание, что NAME соответствует имени релиза, которое вы указали. Helm также перечисляет общую информацию, такую как статус релиза и пространство имен, в котором он развернут. Раздел NOTES различается для разных диаграмм и обычно содержит руководство по быстрому старту или предупреждает о некоторых распространенных проблемах при использовании ресурсов диаграммы. Здесь отмечается, что создается балансировщик нагрузки и это может занять некоторое время.

Для проверки развернутых диаграмм используйте helm list:

  1. helm list

Вы увидите, что ingress-nginx – единственная развернутая диаграмма на данный момент:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION ingress-nginx default 1 2021-02-24 10:12:37.281049711 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0

Вы можете найти услуги, предоставляемые в вашем кластере, запустив:

  1. kubectl get services

Вывод будет похож на следующий:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.245.211.81 46.101.68.67 80:30704/TCP,443:30700/TCP 7m19s ingress-nginx-controller-admission ClusterIP 10.245.50.17 <none> 443/TCP 7m19s kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 83m

Теперь, когда вы развернули релиз в вашем кластере, вы сможете изменить его конфигурацию, пока он развернут.

Шаг 4 — Обновление Релиза

После того как релиз развернут, вам не нужно полностью разрушать его и заново развертывать, когда вам нужно изменить его конфигурацию. Вы можете использовать команду helm upgrade для обновления релиза с новой версией чарта или для установки новых настроек.

Чарт ingress-nginx предоставляет переменную controller.replicaCount, которая контролирует количество развернутых подов контроллера. По умолчанию она установлена на один, что вы можете проверить, перечислив доступные поды:

  1. kubectl get pods

Вы обнаружите, что там только один:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m

Если вы хотите, чтобы их было больше для обеспечения избыточности (например, три), вы можете обновить релиз и установить переменную в 3, запустив:

  1. helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values

Вы также передаете --reuse-values, что указывает Helm использовать ваши изменения поверх развернутого релиза, сохраняя предыдущую конфигурацию.

В выводе Helm увеличит ревизию, чтобы указать, что релиз был обновлен:

Output
NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 12:07:54 2021 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None NOTES: ...

Вы можете перечислить доступные поды, запустив:

  1. kubectl get pods

Вы обнаружите, что перечислено три пода, вместо одного:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-4hk9g 1/1 Running 0 18s ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 22m ingress-nginx-controller-7fc74cf778-wz595 1/1 Running 0 18s

Затем вы откатите изменения и удалите все выпуски.

Шаг 5 — Откат и удаление выпуска

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

Чтобы вернуть количество подов обратно к одному, вы можете снова выполнить helm upgrade и вручную установить количество, потому что это небольшое изменение. Однако при работе с большими чартами с множеством переменных вручную откатывать непосильно и должно быть автоматизировано.

Чтобы откатить выпуск, используйте helm rollback:

  1. helm rollback release_name release_revision

Вы можете использовать его, чтобы откатить изменения, сделанные в ingress-nginx, откатившись к ревизии 1:

  1. helm rollback ingress-nginx 1

Вы получите следующий вывод, указывающий, что действие выполнено успешно:

Output
Rollback was a success! Happy Helming!

Вы можете проверить текущую ревизию, перечислив выпуски:

  1. helm list

Вы увидите, что ревизия теперь 3, а не 1:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION ingress-nginx default 3 2021-02-24 12:43:21.523664768 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0

Helm считает каждое изменение, включая откаты, как новую ревизию выпуска. Вы можете убедиться, что ревизия 3 равна первой, проверив количество развернутых подов, запустив:

  1. kubectl get pods

Вы увидите, что их всего один:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m

Чтобы удалить выпуск и все его ревизии, вы можете использовать helm delete:

  1. helm delete release_name

Поскольку вам больше не понадобится, удалите ingress-nginx, выполнив следующую команду:

  1. helm delete ingress-nginx

Результат будет:

Output
release "ingress-nginx" uninstalled

Вы можете перечислить релизы, чтобы проверить, что их нет:

  1. helm list

Таблица вывода не будет содержать строк:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

Теперь, когда релиз удален, вы можете повторно использовать его имя для будущих развертываний.

Шаг 6 — (Необязательно) Создание пользовательских графиков

На этом необязательном этапе вы узнаете, как создать пользовательский график, куда поместить ваши определения ресурсов и как упаковать его для дальнейшего распространения.

Вы создадите новый график под названием example-chart. Запустите следующую команду, чтобы создать его:

  1. helm create example-chart

Это создаст новый каталог под названием example-chart со следующими файлами и структурой:

example-chart/
charts/
templates/
├─ tests/
│  ├─ test-connection.yaml
├─ deployment.yaml
├─ hpa.yaml
├─ ingress.yaml
├─ NOTES.txt
├─ service.yaml
├─ serviceaccount.yaml
├─ _helpers.tpl
Chart.yaml
values.yaml

Определения ресурсов, которые ваш график установит на целевых кластерах, находятся в каталоге templates. Созданные Helm по умолчанию в качестве отправной точки развертывают контроллер входящего потока Nginx. Несмотря на то, что их расширение файла – YAML, они используют синтаксис шаблонов Go для сохранения настройки с помощью выделенных переменных, которые можно передавать. Вы можете проверить, показав содержимое service.yaml, выполнив:

  1. cat example-chart/templates/service.yaml

Вы увидите, что в нем есть директивы шаблонизации для генерации значений, окруженных двойными фигурными скобками:

Output
apiVersion
: v1 kind: Service metadata: name: {{ include "mychart.fullname" . }} labels: {{- include "mychart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "mychart.selectorLabels" . | nindent 4 }}

Переменные, на которые ссылаются пользователи и которые определены в values.yaml, доступны для пользователя. Текст NOTES, который Helm показывает после развертывания, сохраняется в NOTES.txt и также является шаблонизированным. Метаданные диаграммы, такие как имя, версия и версия развертываемого программного обеспечения, указываются в Chart.yaml:

example-chart/Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes

...
type: application

...
version: 0.1.0

...
appVersion: "1.16.0"

Чтобы проверить, что Helm развернет, вы можете передать --dry-run и --debug в helm install, указывая на директорию диаграммы:

  1. helm install example-chart --dry-run --debug ./example-chart

Вывод будет длинным и содержать все окончательные определения ресурсов, которые будут применены к вашему кластеру. Пока вы работаете над своей диаграммой, вы можете использовать helm upgrade, чтобы загружать новые версии в Kubernetes.

Когда придет время поделиться своей готовой диаграммой, вы можете упаковать ее для дистрибуции, запустив:

  1. helm package ./example-chart

Вывод будет:

Output
Successfully packaged chart and saved it to: .../example-chart-0.1.0.tgz

Упакованную диаграмму можно установить так же, как и те, что добавлены из репозиториев:

  1. helm install example-chart example-chart-0.1.0.tgz

На этом шаге вы создали пользовательскую диаграмму и развернули ее. Вы также упаковали ее и узнали о ее структуре.

Заключение

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

Для получения дополнительной информации о создании пользовательских диаграмм посетите официальное руководство.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-3-package-manager