# Helm # Helm Один из самых популярных пакетных менеджеров для Kubernetes. **Управление helm** **Установка helm:** ``` curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null sudo apt-get install apt-transport-https --yes echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list sudo apt-get update sudo apt-get install helm ``` **Репозиторий**
КомандаДоп. пар.Описание
helm repolistСписок репозиториев
add repo\_name repo\_urlДобавить репозиторий repo\_name с адресом repo\_url ``` helm repo add stable https://kubernetes-charts.storage.googleapis.com/ ``` Часто используют bitnami, но в России он сейчас закрыт. Есть зеркало: ``` helm repo add bitnami https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami ```
updateобновить репозиторий
helm search repo keywordПоиск чартов по репозиториям ключевого слова keyword
hub keywordВ официальном репозитории
--max-col-width=0\+ hub/repo полный вывод текста
--output yaml+hub/repo вывод в yaml
--versionsОтсортировать по версиям чарта
**Плагины** Он сам по себе мощный, но [ссылка на плагины](https://helm.sh/docs/community/related/)
КомандаДоп. пар.Описание
helm plugin install url Установка плагина
helm plugin list Список плагинов
helm plugin update pl\_name Обновление плагина
helm plugin unistall pl\_name Удаление плагина
**Переменные окружения** Зависит от переменных окружения. Основные переменные:
ПеременнаяОписание
XDG\_CACHE\_HOMEРазмещение кешированных данных. По умолчанию ~/.cache/helm
XDG\_CONFIG\_HOMEРазмещение конфигурационного файла По умолчанию ~/.config/helm
XDG\_DATA\_HOMEРазмещение плагинов helm По умолчанию ~/.local/share/helm
HELM\_DRIVERДрайвер для хранения данных. Secret - хранение авторизационных данных в файле, может быть configmap и memory
HELM\_NO\_PLUGINSОтключить плагины
KUBECONFIGРазмещение конфигурационного файла kubectl
**Charts**
КомандаДоп. пар.Описание
helm installname\_chart repoУстановить из репозитория repo чарт name\_chart
--...Переменные внутри чарта ``` helm install kubeapps --namespace kubeapps bitnami/kubeapps ```
--debug --dry-run pr\_name path\_to\_chпротестировать без установки чарта
helm inspect values name\_chart > ...Сохранение чарта в файл ``` helm inspect values stable/kube-ops-view > kube-ops-view.yaml ```
helm lint --strict path-to-chart Проверить соответствие values схеме
helm fetch name\_chart Скачать чарт в tar
--untarИ распаковать ``` helm fetch bitnami/wordpress --untar ```
helm ls --namespace namespaceсписок установленных чартов
helm upgrade...Обновление
helm rollback ch\_name count Откатить чарт ch\_name на count назад ``` helm rollback redis 1 --namespace=redis ```
helm uninstall name\_ch ``` helm uninstall kubeapps --namespace kubeapps ```
**Общая структура чарта** Helm автоматически определяет последовательность применения шаблонов в чарте.
Директория/файлОписаниеОбяз.
Chart.yamlМетаданные чарта+
templates/Ресурсы кубера в формате yaml helm (yaml с переменными) Но файлы начинающиеся с \_ не обрабатываются, \_\*.tpl обрабатываются как helper файлы. + если не составной
templates/NOTES.txtИнструкции по использованию-
values.yamlПеременные по умолчанию-
.helmignoreФайлы исключения при упаковке чарта-
charts/Зависимости (другие чарты)-, при отсутствии helm их сгенерирует в соответствии с Chart.yaml
Chart.lockПервично примененные зависимости.-, будет создан автоматически
crds/Зависимости, которые должны быть собраны до основного чарта-
README.mdОписание-
LICENSEЛицензия-
value.shema,jsonШаблон в json формате-
files/Дополнительные файлы
**templates/** Измененные yaml. Добавлены переменные в формате Go шаблонизации. Переменные берутся из файла values.yaml ``` apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }} data: configuration.txt: |- {{ .Values.configurationData }} ``` Родительские пространства имен у переменных:
Пространство именОписание
.ReleaseПеременные, связанные с релизом в устанавливаемой системе. .Release.Name - имя релиза .Release.Namespace - пространство имен релиза .Release.Revision - номер версии
.ValuesПеременные, размещенные в файле values.yaml
.ChartПеременные, получаемые из файла Chart.yaml Например, .Chart.Name, .Chart.Version .Chart.AppVersion
.FilesРабота с файлами в директории из директории files. Если файл не существует - вернется ошибка. .Files.Get - Извлекает содержимое файлов .Files.AsSecrets - Возвращает Base-64 закодированную строку для создания secret .Files.AsConfig - Возвращает данные для использования в виде ConfigMap
.SubchartsПространство имен дочерних чартов. Например .Subchart.MyChart.firstvalue
**values.yaml** В виде обычного key: value yaml **Chart.yaml** Чарты бывают application и library. Application используются для деплоя приложений, library - для предоставления именованных шаблонов, используемых в других чартах. В library чартах не может быть ни одного шаблона, только helper файлы. Обязательные поля:
ПолеОписание
apiVersionВерсия. В helm 3 формате используется v2
nameИмя чарта. Должно совпадать с именем директории чарта. В именах стоит использовать только -, например first-chart
versionВерсия. Формат X.Y.Z
Пример файла
КомандаДоп. пар.Описание
helm create chart\_name Создание шаблона чарта
helm install proj\_name path Создание проекта с названием proj\_name используя чарт по пути path
-f par\_fileссылка на другой файл параметров
--set foo=barРучная установка параметров
helm get manifest proj\_name Получить манифест проекта proj\_name
**Зависимости чарта** Заполняются в разделе dependencies файла Chart.yaml
КомандаДоп. пар.Описание
helm dependency buildпуть до Chart.yamlПерестроить зависимые чарты, базируясь на файле Chart.lock Если этого файла нет - то же что и update
helm dependency list Список зависимостей
helm dependency update Обновление чартов и генерация Chart.lock
В зависимостях могут быть условия: ``` dependencies: - name: dependency1 repository: https://example.com version: 1.x.x condition: dependency1.enabled tags: - monitoring: true - name: dependency2 repository: https://example.com version: 2.x.x condition: dependency2.enabled tags: - monitoring: true ``` В данном случае переменные dependency1.enabled и dependency2.enabled должны быть установлены в values.yaml файле. Можно несколько переменных через запятую, но лучше завести одну общую переменную и в values ее заполнять. Раздел tags разделяет по группам: если в родительском чарте переменная monitoring не выставлена - данные зависимости установлены не будут. Может быть несколько тэгов, но если хотя бы один подходит - будет добавлено. Дочерние параметры чарта могут быть переопределены. Можно импортировать параметры из дочернего чарта (если его параметры отмечены как экспортируемые). Также есть хуки, позволяющие выполнять что-то при достижении определенной стадии. # Go templates Элементы шаблонизации заключены в двойные фигурные скобки, остальные - статический текст. Элементы шаблонизации могут включать переменные, условия, циклы, функции. Конструкция {{- удаляет строку в которой функция. **Условия:** ``` {{ if ConditionOne }} # Do something {{ else if ConditionTwo }} # Do something else {{ else }} # Default case {{ end }} ``` ``` {{ if eq .Values.favorite.drink "coffee" }}mug: "true"{{ end }} ``` **With** Работает так же как и в python ``` apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" {{- with .Values.favorite }} drink: {{ .drink | default "tea" | quote }} food: {{ .food | upper | quote }} {{- end }} ``` **Циклы** values.yaml: ``` favorite: drink: coffee food: pizza pizzaToppings: - mushrooms - cheese - peppers - onions - pineapple ``` cur.yaml: ``` apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" {{- with .Values.favorite }} drink: {{ .drink | default "tea" | quote }} food: {{ .food | upper | quote }} {{- end }} toppings: |- {{- range .Values.pizzaToppings }} - {{ . | title | quote }} {{- end }} ``` **Функции:** Можно использовать pipeline: {{ .Values.favorite.drink | quote }}
ФункцияОписание
quoteДобавляет кавычки ``` {{ quote .Values.favorite.food }} ```
upperВ верхний регистр
repeat nПовтор значения n раз ``` {{ .Values.favorite.drink | repeat 5 | quote }} ```
default "some\_hy"Присвоить значение по умолчанию если отсутствует ``` drink: {{ .Values.favorite.drink | default "tea" | quote }} ```
eq, ne, lt, gt, and, orЛогические функции
indent nПоставить n пробелов перед конструкцией
[Список функций](https://helm.sh/docs/chart_template_guide/function_list/) **Именованные шаблоны** С шаблонами нужно запускать ``` helm install --dry-run --disable-openapi-validation ``` Шаблон внутри \_helpers.tpl файла: ``` {{- define "first.labels" -}} labels: 'app.kubernetes.io/instacce': {{ .Release.Name }} 'app.kubernetes.io/managed-by': {{ .Release.Service }} {{- end }} {{- define "first.nameofchart" -}} {{- printf "mycurname" -}} {{ - end }} ``` ``` apiVersion: v1 kind: ConfigMap metadata: name: {{ include "first.nameofchart" . }} {{- include "first.labels" . | nindent 2 }} data: myvalue: "Hello World" food: {{ .Values.favourite.food }} drink: {{ .Values.favourite.drink }} ``` Точка означает передачу внутрь шаблона всех переменных. Разница между include и template: проще использовать include, template не дает использовать дополнительные функции через pipeline # Пример проекта **Задача:** helm чарт приложения guestbook с БД redis Создаем namespace для теста ``` kubectl create namespace guestbook-learn ``` Создаем шаблон структуры папок ``` helm create guestbook ``` Добавляем зеркало проекта bitnami и находим последнюю версию чарта ``` helm repo add bitnami https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami helm search repo redis --versions NAME CHART VERSION APP VERSION DESCRIPTION bitnami/redis 20.11.4 7.4.2 Redis(R) is an open source, advanced key-value ... bitnami/redis 20.11.3 7.4.2 Redis(R) is an open source, advanced key-value ... bitnami/redis 20.11.2 7.4.2 Redis(R) is an open source, advanced key-value ... ``` В моем случае это 20.11.4. Добавляем зависимость в Chart.yaml ```yaml dependencies: - name: redis version: 20.11.x repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami ``` Попробуем загрузить зависимость ``` guestbook# helm dependency update . Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "bitnami" chart repository Update Complete. ⎈Happy Helming!⎈ Saving 1 charts Downloading redis from repo https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami Pulled: registry-1.docker.io/bitnamicharts/redis:20.11.4 Digest: sha256:51ee4afc621d0e0b26109d41c32bf23f3db114f15dd816c1acf8d1ddbf8d57ed Deleting outdated charts ``` Действительно, в папке charts появился архив ``` guestbook# ls charts/ redis-20.11.4.tgz ``` Для завершения настройки redis посмотрим переменные, необходимые для запуска. ``` helm show values charts/redis-20.11.4.tgz ``` Это выдало портянку (если убрать комментарии) в 698 строк. Был задан вопрос ИИ. Ответ отличался от приведенного варианта в книге и прямое использование не поехало бы. В values.yaml было добавлено