Что-то я давно ничего не писал о Kubernetes. А ведь в нём куча всего интересного происходит. Вот, например, посмотрели мы в прошлый раз как создавать k8s объекты через YAML конфигурацию, и было то хорошо. Но неудобно. Файлов же может быть много, копировать их туда-сюда тоже то ещё удовольствие. А если использовать менеджер пакетов helm, то как бы всё приятно сразу становится.
Кто такой helm
Helm — это установщик пакетов для Kubernetes. Примерно такой же, как npm
для nodejs или apt-get
для цивилизованного мира. Говоря helm, мы на самом деле подразумеваем целых два приложения: клиентский helm и его серверного, живущего в Kubernetes компаньона — tiller. На пару они могут искать, устанавливать, апгрэйдить и удалять пакеты-приложения, в хельмовской терминологии называемые чартами (chart).
‘Chart’ — не единственный странный выбор слов. Например, чарт, установленный в Kubernetes, уже называется релиз (release). Если установить чарт-пакет два раза, то получится два релиза. И т.п.
Но зато репозиторий для чартов так и называется — репозиторий. Ну и конечно, есть как «дефолтный» репозиторий, так и собственные, локальные.
Разобравшись с терминологией, теперь можно посмотреть на хельм поближе.
Установка
Тут всё просто. Для всех основных осей и их пакетных менеджеров (brew, apt-get, chocolatey) уже есть готовый пакет, и, например, для Мака brew install helm
делает всё, что нужно.
Правда, таким образом устанавливается только клиентская утилита. Tiller всё ещё нужно устанавливать в k8s кластер руками. Но просто. Свой локальный кластер я запустил через minikube start
, а tiller в него попал при помощи helm init
.
Кстати, можно посмотреть, как именно выглядит конфигурация установки tiller. Если заменить команду установки на helm init --output yaml
, то оказывается, что серверный компонент — это банальный Deployment с единственным контейнером внутри:
1 2 3 4 5 6 7 8 9 |
#... kind: Deployment #... spec: template: spec: containers: - image: gcr.io/kubernetes-helm/tiller:v2.9.1 #... |
Основные операции
Акей, helm готов, нужно с ним чего-нибудь поделать. Например, найти какой-нибудь стандартный чарт и установить его, проверить статус и удалить к такой-то бабушке.
Поиск
helm search
сразу выплёвывает все известные чарты, но на самом деле я уже примерно представляю, что именно мне нужно. Так что, сузив поиск при помощи helm search prometheus
, нужный кандидат оказывается вверху списка, и можно сразу переходить к его установке:
1 2 3 4 5 |
helm search prometheus #NAME CHART VERSION APP VERSION DESCRIPTION #stable/prometheus 6.8.0 2.3.1 Prometheus is a monitoring system and time seri... #stable/prometheus-blackbox-exporter 0.1.0 0.12.0 Prometheus Blackbox Exporter #... |
Установка
stable/prometheus
— вот, что мы будем устанавливать, и чего уж тут медлить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
helm install stable/prometheus #NAME: willing-grizzly #... #RESOURCES: #==> v1/PersistentVolumeClaim #... #==> v1/Pod(related) #... #==> v1beta1/Deployment #... #NOTES: #... #The Prometheus alertmanager can be accessed via port 80 on the following DNS name from within your cluster: #willing-grizzly-prometheus-alertmanager.default.svc.cluster.local # #Get the Alertmanager URL by running these commands in the same shell: # export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}") # kubectl --namespace default port-forward $POD_NAME 9093 #... |
Вот что, кстати, удобно. В конце логов установки идёт секция Notes
, в которой сразу есть насколько полезных советов. Например, в строках 17-18 есть команды для проброса порта 9093 наружу, так что мы сможем зайти в админку одного из установленных прометеевских сервисов — Alertmanager
.
Посмотреть Notes можно и позже с командой helm status %release name%
.
Смотрим установленные чарты (релизы)
Посмотреть, что уже установлено, тоже довольно просто:
1 2 3 |
helm list #NAME REVISION UPDATED STATUS CHART NAMESPACE #willing-grizzly 1 Mon Jul 9 23:08:26 2018 DEPLOYED prometheus-6.8.0 default |
Кстати, запомните число во втором столбце (REVISION
) — оно очень пригодится, когда мы будем делать апгрэйды и их откаты.
Удаляем релиз
Это вообще просто — helm delete %release name%
и всё. Правда, удалять его прямо сейчас я не хочу, поэтому в конце команды добавлю флаг --dry-run
, чтобы всё прошло понарошку:
1 2 |
helm delete willing-grizzly --dry-run # release "willing-grizzly" deleted |
Продвинутые операции
Кастомизируем установку
Устанавливать чарты «как есть» — просто, но бесполезно. Хотелось бы, конечно, сначала подстроить её под себя.
Смотрим, что вообще можно настроить
Изменить можно практически любой параметр чарта, но где вообще их искать? Ну, например, в helm inspect values
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#$ helm inspect values stable/prometheus rbac: create: true #... alertmanager: ## If false, alertmanager will not be installed ## enabled: true ## alertmanager container name ## name: alertmanager |
Применяем настройки
Я серьёзно подрезал вывод команды inspect, но кастомизируемых параметров она вывела уйму. Например, один из первых параметров контролирует, будет ли Alertmanager, админку которого мы смотрели недавно, установлен. В теории, если положить что-то вроде alertmanager.enabled=false
в файл конфигурации (нужно синтаксис проверить), то его можно передать сразу в install
:
1 |
helm install -f config.yaml stable/prometheus |
Но можно обойтись без файлов и подавать параметры напрямую:
1 |
helm install --set alertmanager.enabled=false stable/prometheus |
Но есть ещё один момент. Так как Alertmanager уже был установлен, то почему бы просто не избавиться от него, проапгрэйдив уже существующий релиз?
Апгрэйд и откат назад
Апгрэйд релиа
Банально заменив install
на upgrade
, можно передать параметры кастомизации уже установленному чарту:
1 2 3 4 5 6 |
helm upgrade --set alertmanager.enabled=false willing-grizzly stable/prometheus #Release "willing-grizzly" has been upgraded. Happy Helming! #LAST DEPLOYED: Tue Jul 10 00:02:19 2018 #NAMESPACE: default #STATUS: DEPLOYED #... |
В этот раз в выводе команды alertmanager
уже не встречался, но можно пообщаться с Kubernetes напрямую и убедиться, что alertmanager действительно ушёл:
1 2 3 4 5 6 7 |
kubectl get svc #NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE #... #willing-grizzly-prometheus-kube-state-metrics ClusterIP None <none> 80/TCP 48m #willing-grizzly-prometheus-node-exporter ClusterIP None <none> 9100/TCP 48m #willing-grizzly-prometheus-pushgateway ClusterIP 10.99.116.205 <none> 9091/TCP 48m #willing-grizzly-prometheus-server ClusterIP 10.105.214.102 <none> 80/TCP 48m |
Откат релиза
Если вдруг мы передумаем, есть команда для отката назад. Нужно только найти номер последней успешной ревизии (помните тот второй столбец в helm list
, который был равен единице?) передать её в rollback
:
1 2 |
helm rollback willing-grizzly 1 #Rollback was a success! Happy Helming! |
Список всех доступных ревизий можно глянуть через history
:
1 2 3 4 5 |
helm history willing-grizzly #REVISION UPDATED STATUS CHART DESCRIPTION #1 Mon Jul 9 23:08:26 2018 SUPERSEDED prometheus-6.8.0 Install complete #2 Mon Jul 9 23:57:01 2018 SUPERSEDED prometheus-6.8.0 Upgrade complete #3 Tue Jul 10 00:16:41 2018 DEPLOYED prometheus-6.8.0 Rollback to 1 |
Создаём свой чарт
Разумеется, хельм был бы бесполезным, если бы мы не могли создавать свои чарты.
Бойлерплейт
Есть классная команда helm create
, которая создаст бойлерплейт, с которого уже можно двигаться дальше:
1 2 |
helm create demo-chart # Creating demo-chart |
1 2 3 4 5 6 7 8 9 10 11 |
tree demo-chart/ # demo-chart/ # ├── Chart.yaml # ├── charts # ├── templates # │ ├── NOTES.txt # │ ├── _helpers.tpl # │ ├── deployment.yaml # │ ├── ingress.yaml # │ └── service.yaml # └── values.yaml |
Chart.yaml
, судя по всему, задаёт имя чарта, его версию и прочую стандартную ерунду. В папку же charts
вроде бы кладут чарты-зависимости. Самый интересный файл чарта на этом этапе — values.yaml.
Именно из него шли те кастомизируемые параметры для install
/upgrade
, которые выдавал helm inspect values
.
Папка templates
Полазив по папке templates можно сделать интересное наблюдение — все эти деплойменты, сервисы и прочая Kubernetes-магия, которую мы и будем поставлять с чартом — всё это может быть шаблонами.
Это полезно. Например, я не хотел бы, чтобы мой деплйомент шёл со статическим именем. Лучше бы взять имя релиза, под которым его установят, и просто добавить какой-нибудь суффикс. Вот так:
1 2 3 4 5 |
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-deployment #... |
.Release
(как и .Values
) — один из предустановленных объектов, на которые шаблоны могут ссылаться. Есть и другие места, откуда можно взять значения и даже целые куски конфигурации для подстановки, но замена значений не единственное, что шаблоны могут делать. Можно, например, ещё использовать управляющие конструкции вроде if
или range
, функции и даже конвейерные инструкции, так что {{ .Release.Name | upper }}
— вполне себе валидная строка.
Упаковка и установка чарта
Папку с чартом прямо так можно и устанавливать — helm install ./demo-chart
и все дела. Но если отгружать чарт в какой-нибудь репозиторий, или просто делиться им с друзьями, то лучше сначала его упаковать:
1 2 |
helm package demo-chart/ # Successfully packaged chart and saved it to: /Users/pav/Documents/helm/demo-chart-0.1.0.tgz |
В результате получится тарбол (tarball), который, кстати, точно также можно устанавливать локально.
Мораль
Вот такой он, helm. Вполне себе, кстати, ничего — легко устанавливается, понятно работает, и если всё то, что я видел в его шаблонах, правда, то он просто невероятно мощный. Есть, правда, одна проблема. У меня локально уже установлено штуки четыре пакетных менеджера — brew для Мака и три для JavaScript. Куда так много? Можно их как-нибудь объединить в один? USB-C вроде ж победил остальные разъёмы, почему с пакетными менеджерами нельзя так же?
годно, спасибо
> USB-C вроде ж победил остальные разъёмы, почему с пакетными менеджерами нельзя так же?
потому, что утром рано…
с одной стороны есть системный пжкэдж-манагер для разных дистро; с другой — какой-нибудь cpan, pip или, не приведи господи, какой-нибудь npm, они кроссплатформенные, они не хотят ложиться в дистро; с третьей — счастье а-ля helm и иже. и каждый лепит своё, это оправдано, ибо «мне так лучше, я так вижу». как говорил герой одного фильма «всем на всё насрать».
по идее имиджи для контейнеров должны были стать универсальными пакетами. не стали.
на деле единственная система пэкэджей, которая везде работает — тарболл с сырцами и с автоконфигом. при условии, что сырцы собираются. девы чааасто такое юзают… да кому я рассказываю? 😉
наконец-то что-то краткое и понятное про хелм. Жаль нет тегов для навигации по статьям.
Даа, с разумной навигацией между постами пока проблема. Хорошо бы исправить, но пока это проигрывает по приоритету остальным задачам 🙁
коротко о главном… респект )
Спасибо за статью!