Основные понятия:
Чарт (chart) это пакет из шаблонов манифестов и файла значений по умолчанию. Релиз (release) это установленный в кластер экземпляр чарта с конкретными значениями. Один чарт можно поставить несколько раз под разными именами, скажем webapp-dev и webapp-stage в разных namespace.
Helm 3 работает без серверной части (Tiller остался во второй версии), история релизов хранится прямо в кластере в виде Secret в namespace релиза. Ставится одним бинарником: на macOS через brew, на Linux пакетом дистрибутива или скриптом установки.
Собственный чарт:
Код: Выделить всё
helm create webapp
webapp/
Chart.yaml # имя и версия чарта, версия приложения
values.yaml # значения по умолчанию
templates/ # шаблоны манифестов
deployment.yaml
service.yaml
ingress.yaml
_helpers.tpl # вспомогательные куски шаблонов
Код: Выделить всё
# templates/deployment.yaml (фрагмент)
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
# values.yaml
replicaCount: 2
image:
repository: registry.example.ru/shop/webapp
tag: "1.4.2"
Рабочий цикл:
Код: Выделить всё
helm lint ./webapp
helm template webapp ./webapp -f webapp/values-prod.yaml
helm upgrade --install webapp ./webapp \
-n shop --create-namespace \
-f webapp/values-prod.yaml \
--set image.tag=1.4.3 \
--atomic --timeout 3m
helm history webapp -n shop
helm rollback webapp 2 -n shop
Ставить лучше через upgrade --install, а не чистый install: команда идемпотентна, нет релиза, создаст, есть, обновит. Одна и та же строка в CI работает и для первого деплоя, и для сотого. Флаг --atomic откатит релиз, если поды не поднялись за timeout. rollback возвращает манифесты любой прошлой ревизии из history. Откатываются только объекты Kubernetes: миграции базы Helm за вас не отменит, это ваша забота.
Чужие чарты:
Вторая половина пользы Helm, готовые чарты для инфраструктуры. Ingress-контроллер из седьмой главы в реальных кластерах ставят именно так:
Код: Выделить всё
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm show values ingress-nginx/ingress-nginx > nginx-defaults.yaml
helm install ingress-nginx ingress-nginx/ingress-nginx \
-n ingress-nginx --create-namespace
Типичные грабли:
--set конвертирует типы по своим правилам. Версия 1.20 превратится в число 1.2, true станет булевым, хотя шаблон ждал строку. Для отдельных случаев есть --set-string, но в целом все, что сложнее одного простого флага, передавайте файлом значений.
Если поправить ресурс руками через kubectl edit, следующий helm upgrade может молча перезаписать правку. Правьте values и катите через Helm, иначе кластер разъедется с тем, что лежит в git, и отлаживать это будете долго.
CRD из папки crds чарта Helm ставит только при первой установке и никогда не обновляет сам. При апгрейде чарта с CRD читайте его changelog: обновление CRD почти всегда отдельный ручной шаг.
Не путайте version и appVersion в Chart.yaml: version это версия самого чарта, appVersion это версия приложения внутри. Поменяли шаблон, поднимайте version, даже если образ приложения тот же, иначе реестр чартов не примет пакет.
Что усвоили:
Helm убирает копипасту манифестов: чарт плюс свой values на окружение, идемпотентный деплой через upgrade --install, откат через rollback, готовые чарты для инфраструктуры. В последней главе закроем вопрос доступов: RBAC, ServiceAccount и кто вообще имеет право делать helm upgrade в вашем проде.