Здесь мы сосредоточимся на том, как разумно управлять приложениями с помощью Helm.
Contents
Что такое Хелм?
Helm — это менеджер пакетов для Kubernetes. Helm — это проект с открытым исходным кодом, изначально созданный DeisLabs и переданный в дар Cloud Native Foundation ( CNCF ). В настоящее время CNCF поддерживает проект и завершил его. Это означает, что она зрелая, а не просто причуда.
Управление пакетами — не новая концепция в индустрии программного обеспечения. В дистрибутивах Linux вы управляете установкой и удалением программного обеспечения с помощью менеджеров пакетов, таких как YUM/RPM или APT . В Windows вы можете использовать Chocolatey или Homebrew на Mac.
Helm позволяет упаковывать и развертывать готовые приложения в Kubernetes. Пакет называется ” Диаграмма” . Helm использует систему шаблонов, основанную на шаблоне Go , для рендеринга манифестов Kubernetes из диаграмм. Диаграмма — это согласованная структура, разделяющая шаблоны и значения.
Как пакет, диаграмма также может управлять зависимостями с другими диаграммами. Например, если вашему приложению для работы требуется база данных MySQL, вы можете включить диаграмму в качестве зависимости. Когда Helm запускается на верхнем уровне каталога диаграммы, он устанавливает целые зависимости. У вас есть всего одна команда для рендеринга и выпуска вашего приложения в Kubernetes.
В диаграммах Helm версии используются для отслеживания изменений в ваших манифестах, поэтому вы можете установить конкретную версию диаграммы для определенных конфигураций инфраструктуры. Helm хранит историю выпусков всех развернутых диаграмм в выделенной рабочей области. Это упрощает обновление и откат приложений, если что-то пойдет не так.
Helm позволяет сжимать графики. Результатом этого является артефакт, сравнимый с образом Docker. Затем вы можете отправить его в удаленный репозиторий для повторного использования и совместного использования.
Каковы преимущества использования Helm?
- Helm предоставляет вам возможность устанавливать приложения с помощью одной команды. Диаграмма может содержать другие диаграммы в качестве зависимостей. Следовательно, вы можете развернуть весь стек с помощью Helm. Вы можете использовать Helm как docker-compose, но для Kubernetes.
- Диаграмма включает шаблоны для различных ресурсов Kubernetes для формирования законченного приложения. Это снижает сложность микросервисов и упрощает управление ими в Kubernetes.
- Графики можно сжимать и отправлять в удаленное хранилище. Это создает артефакт приложения для Kubernetes. Вы также можете получить и развернуть существующие диаграммы Helm из репозиториев. Это сильная сторона повторного использования и совместного использования.
- Helm хранит историю развернутых выпусков в рабочей области Helm. Когда что-то пойдет не так, откатиться к предыдущей версии очень просто — канареечный выпуск упрощается с помощью Helm для развертывания с нулевым временем простоя.
- Helm делает развертывание легко настраиваемым. Приложения можно настраивать «на лету» во время развертывания. Изменяя параметры, вы можете использовать одну и ту же диаграмму для нескольких сред, таких как разработка, подготовка и производство.
- Оптимизация конвейеров CI/CD — передовой опыт GitOps.
Быстрый взгляд на проблему, которую решает Helm
Основная практика Kubernetes — писать манифесты YAML вручную. Мы создадим минимум файлов YAML для развертывания NGINX в Kubernetes.
Вот развертывание, которое создаст поды:
Служба выставляет NGINX наружу. Связь с подом осуществляется через селектор:
Теперь нам нужно создать предыдущие ресурсы с помощью команды kubectl:
$ kubectl create -f deployment.yaml
$ kubectl create -f service.yaml
Проверяем работоспособность всех ресурсов:
$ kubectl get deployment -l app=nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 8m29s
$ kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-65b89996ff-dcfs9 1/1 Running 0 2m26s
$ kubectl get svc -l app=nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP 10.106.79.171 <none> 80/TCP 4m58s
- Конкретные значения в манифестах YAML жестко закодированы и не могут использоваться повторно.
- Избыточная информация для указания, такая как метки и селекторы, приводит к потенциальным ошибкам.
- Kubectl не обрабатывает потенциальные ошибки после выполнения. Вы должны развернуть каждый файл один за другим.
- Отслеживание изменений невозможно.
Создайте диаграмму Helm с нуля
Helm может создать структуру диаграммы в одной командной строке:
$ helm create nginx
Понимание структуры диаграммы Helm
Chart.yaml
: файл YAML, содержащий информацию о диаграмме.charts
: Каталог, содержащий любые диаграммы, от которых зависит эта диаграмма.templates
: здесь Helm находит определения YAML для ваших служб, развертываний и других объектов Kubernetes. Вы можете добавить или заменить сгенерированные файлы YAML своими собственными.templates/NOTES.txt
: это шаблонный текстовый файл, который распечатывается после успешного развертывания диаграммы. Здесь полезно кратко описать следующие шаги по использованию диаграммы.templates/_helpers.tpl
: этот файл является расположением по умолчанию для частичных шаблонов. Предполагается, что файлы, имя которых начинается с символа подчеркивания, не имеют внутри манифеста. Эти файлы не отображаются в определениях объектов Kubernetes, но доступны везде в других шаблонах диаграмм для использования.templates/tests
: тесты, которые подтверждают, что ваша диаграмма работает должным образом, когда она установлена.values.yaml
: значения конфигурации по умолчанию для этой диаграммы.
Настройка шаблонов
По values.yaml
умолчанию загружается автоматически при развертывании диаграммы. Здесь мы устанавливаем тег изображения 1.21.5
:
Вы можете указать конкретный values.yaml
файл, чтобы настроить развертывание для конкретных параметров среды.
Установите диаграмму руля
Хороший совет перед развертыванием чарта Helm — запустить линтер, если вы сделали обновление:
$ helm lint nginx
==> Linting nginx
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
Запустите Helm, чтобы установить диаграмму в пробном режиме и в режиме отладки, чтобы убедиться, что все в порядке:
$ helm install --debug --dry-run nginx nginx
Использование helm linter и пробной установки с режимом отладки сэкономит вам драгоценное время при разработке.
Чтобы установить график, снимите --dry-run
флажок:
$ helm install nginx nginx
NAME: nginx
LAST DEPLOYED: Mon Mar 14 12:01:46 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=nginx,app.kubernetes.io/instance=nginx" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
Вы можете увидеть шаблонное содержимое, NOTES.txt
объясняющее, как подключиться к приложению.
Теперь вы можете получить релиз в рабочей области Helm:
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nginx default 1 2022-03-14 12:01:46.926038 +0100 CET deployed nginx-0.1.0 1.0.0
Обновите выпуск Helm
Представьте, что вы хотите обновить образ контейнера 1.21.6
для целей тестирования.
Вместо создания нового values.yaml
мы изменим настройку из командной строки.
$ helm upgrade nginx nginx --set image.tag=1.21.6
Release "nginx" has been upgraded. Happy Helming!
NAME: nginx
LAST DEPLOYED: Mon Mar 14 12:04:40 2022
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=nginx,app.kubernetes.io/instance=nginx" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
Модуль также использует новый образ контейнера:
$ kubectl get pod -l app.kubernetes.io/name=nginx -o jsonpath='{.items[0].spec.containers[0].image}'
nginx:1.21.6
Обновление видно в истории графика:
$ helm history nginx
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Mar 14 12:07:33 2022 superseded nginx-0.1.0 1.0.0 Install complete
2 Mon Mar 14 12:08:25 2022 deployed nginx-0.1.0 1.0.0 Upgrade complete
Изменение можно проверить с помощью helm diff
:
$ helm diff revision nginx 1 2
default, nginx, Deployment (apps) has changed:
# Source: nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
helm.sh/chart: nginx-0.1.0
app.kubernetes.io/name: nginx
app.kubernetes.io/instance: nginx
app.kubernetes.io/version: "1.0.0"
app.kubernetes.io/managed-by: Helm
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: nginx
app.kubernetes.io/instance: nginx
template:
metadata:
labels:
app.kubernetes.io/name: nginx
app.kubernetes.io/instance: nginx
spec:
serviceAccountName: nginx
securityContext:
{}
containers:
- name: nginx
securityContext:
{}
- image: "nginx:1.21.5"
+ image: "nginx:1.21.6"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{}
Откат выпуска Helm
Обновление не было окончательным, и вы хотите вернуться. Поскольку Helm сохраняет все изменения, откат выполняется очень просто:
$ helm rollback nginx 1
Rollback was a success! Happy Helming!
Под теперь вернулся к 1.21.5
образу контейнера:
$ kubectl get pod -l app.kubernetes.io/name=nginx -o jsonpath='{.items[0].spec.containers[0].image}'
nginx:1.21.5
Удалить диаграмму Helm
Удаление диаграммы Helm тривиально, так как установка:
$ helm uninstall nginx
Повторное использование существующих диаграмм Helm
Многие известные проекты предоставляют диаграмму Helm, чтобы сделать интеграцию более удобной. Они предоставляют диаграммы через репозиторий. Вам нужно просто добавить его на своей стороне:
$ helm repo add bitnami https://charts.bitnami.com/bitnami
После добавления обновите локальный кеш, чтобы синхронизировать информацию с удаленными репозиториями:
$ helm repo update
Теперь вы можете установить диаграмму в свой кластер Kubernetes:
$ helm install nginx bitnami/nginx
Диаграммы развертываются со значениями по умолчанию. Вы можете вдохновить и указать обычай values.yaml
в соответствии с вашими потребностями!
$ helm install my-release bitnami/nginx -f values.yaml