# 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
```

**Репозиторий**

<div id="bkmrk-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%94%D0%BE%D0%BF.-%D0%BF%D0%B0%D1%80.-%D0%9E%D0%BF"><table border="1" style="width: 101.548%;"><thead><tr><td class="align-center" style="width: 20.8582%;">Команда</td><td class="align-center" style="width: 21.6994%;">Доп. пар.</td><td class="align-center" style="width: 57.4424%;">Описание</td></tr></thead><tbody><tr><td style="width: 20.8582%;">helm repo</td><td style="width: 21.6994%;">list</td><td style="width: 57.4424%;">Список репозиториев</td></tr><tr><td style="width: 20.8582%;">  
</td><td style="width: 21.6994%;">add repo\_name repo\_url</td><td style="width: 57.4424%;">Добавить репозиторий 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
```

</td></tr><tr><td style="width: 20.8582%;">  
</td><td style="width: 21.6994%;">update</td><td style="width: 57.4424%;">обновить репозиторий

</td></tr><tr><td style="width: 20.8582%;">helm search   
</td><td style="width: 21.6994%;">repo keyword</td><td style="width: 57.4424%;">Поиск чартов по репозиториям ключевого слова keyword

</td></tr><tr><td style="width: 20.8582%;">  
</td><td style="width: 21.6994%;">hub keyword</td><td style="width: 57.4424%;">В официальном репозитории

</td></tr><tr><td style="width: 20.8582%;">  
</td><td style="width: 21.6994%;">--max-col-width=0</td><td style="width: 57.4424%;">\+ hub/repo полный вывод текста

</td></tr><tr><td style="width: 20.8582%;">  
</td><td style="width: 21.6994%;">--output yaml</td><td style="width: 57.4424%;">+hub/repo вывод в yaml

</td></tr><tr><td style="width: 20.8582%;">  
</td><td style="width: 21.6994%;">--versions</td><td style="width: 57.4424%;">Отсортировать по версиям чарта

</td></tr></tbody></table>

</div>**Плагины**

Он сам по себе мощный, но [ссылка на плагины](https://helm.sh/docs/community/related/)

<table border="1" id="bkmrk-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%94%D0%BE%D0%BF.-%D0%BF%D0%B0%D1%80.-%D0%9E%D0%BF-1" style="width: 101.548%;"><thead><tr><td class="align-center" style="width: 20.8582%;">Команда</td><td class="align-center" style="width: 18.5973%;">Доп. пар.</td><td class="align-center" style="width: 60.5446%;">Описание</td></tr></thead><tbody><tr><td style="width: 20.8582%;">helm plugin install url</td><td style="width: 18.5973%;"> </td><td style="width: 60.5446%;">Установка плагина</td></tr><tr><td style="width: 20.8582%;">helm plugin list</td><td style="width: 18.5973%;">  
</td><td style="width: 60.5446%;">Список плагинов</td></tr><tr><td style="width: 20.8582%;">helm plugin update pl\_name</td><td style="width: 18.5973%;">  
</td><td style="width: 60.5446%;">Обновление плагина</td></tr><tr><td style="width: 20.8582%;">helm plugin unistall pl\_name  
</td><td style="width: 18.5973%;">  
</td><td style="width: 60.5446%;">Удаление плагина</td></tr></tbody></table>

**Переменные окружения**

Зависит от переменных окружения. Основные переменные:

<table border="1" id="bkmrk-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%94%D0%BE%D0%BF.-%D0%BF%D0%B0%D1%80.-%D0%9E%D0%BF-2" style="width: 100%;"><thead><tr><td class="align-center" style="width: 25.6257%;">Переменная</td><td class="align-center" style="width: 74.3743%;">Описание</td></tr></thead><tbody><tr><td style="width: 25.6257%;">XDG\_CACHE\_HOME</td><td style="width: 74.3743%;">Размещение кешированных данных. По умолчанию ~/.cache/helm</td></tr><tr><td style="width: 25.6257%;">XDG\_CONFIG\_HOME</td><td style="width: 74.3743%;">Размещение конфигурационного файла По умолчанию ~/.config/helm</td></tr><tr><td style="width: 25.6257%;">XDG\_DATA\_HOME</td><td style="width: 74.3743%;">Размещение плагинов helm По умолчанию ~/.local/share/helm</td></tr><tr><td style="width: 25.6257%;">HELM\_DRIVER</td><td style="width: 74.3743%;">Драйвер для хранения данных. Secret - хранение авторизационных данных в файле, может быть configmap и memory</td></tr><tr><td style="width: 25.6257%;">HELM\_NO\_PLUGINS</td><td style="width: 74.3743%;">Отключить плагины</td></tr><tr><td style="width: 25.6257%;">KUBECONFIG</td><td style="width: 74.3743%;">Размещение конфигурационного файла kubectl</td></tr></tbody></table>

**Charts**

<table border="1" id="bkmrk-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%94%D0%BE%D0%BF.-%D0%BF%D0%B0%D1%80.-%D0%9E%D0%BF-3" style="width: 101.548%;"><thead><tr><td class="align-center" style="width: 20.8582%;">Команда</td><td class="align-center" style="width: 18.5973%;">Доп. пар.</td><td class="align-center" style="width: 60.5446%;">Описание</td></tr></thead><tbody><tr><td style="width: 20.8582%;">helm install</td><td style="width: 18.5973%;">name\_chart repo</td><td style="width: 60.5446%;">Установить из репозитория repo чарт name\_chart</td></tr><tr><td style="width: 20.8582%;">  
</td><td style="width: 18.5973%;">--...</td><td style="width: 60.5446%;">Переменные внутри чарта ```
helm install kubeapps --namespace kubeapps bitnami/kubeapps
```

</td></tr><tr><td style="width: 20.8582%;">  
</td><td style="width: 18.5973%;">--debug --dry-run pr\_name path\_to\_ch</td><td style="width: 60.5446%;">протестировать без установки чарта</td></tr><tr><td style="width: 20.8582%;">helm inspect values   
</td><td style="width: 18.5973%;">name\_chart &gt; ...</td><td style="width: 60.5446%;">Сохранение чарта в файл

```
helm inspect values stable/kube-ops-view > kube-ops-view.yaml
```

</td></tr><tr><td style="width: 20.8582%;">helm lint --strict path-to-chart</td><td style="width: 18.5973%;">  
</td><td style="width: 60.5446%;">Проверить соответствие values схеме

</td></tr><tr><td style="width: 20.8582%;">helm fetch name\_chart</td><td style="width: 18.5973%;">  
</td><td style="width: 60.5446%;">Скачать чарт в tar

</td></tr><tr><td style="width: 20.8582%;">  
</td><td style="width: 18.5973%;">--untar</td><td style="width: 60.5446%;">И распаковать

```
helm fetch bitnami/wordpress --untar
```

</td></tr><tr><td style="width: 20.8582%;">helm ls   
</td><td style="width: 18.5973%;">--namespace namespace</td><td style="width: 60.5446%;">список установленных чартов

</td></tr><tr><td style="width: 20.8582%;">helm upgrade</td><td style="width: 18.5973%;">...</td><td style="width: 60.5446%;">Обновление

</td></tr><tr><td style="width: 20.8582%;">helm rollback ch\_name count</td><td style="width: 18.5973%;">  
</td><td style="width: 60.5446%;">Откатить чарт ch\_name на count назад

```
helm rollback redis 1 --namespace=redis
```

</td></tr><tr><td style="width: 20.8582%;">helm uninstall name\_ch</td><td style="width: 18.5973%;">  
</td><td style="width: 60.5446%;">```
helm uninstall kubeapps --namespace kubeapps
```

</td></tr></tbody></table>

**Общая структура чарта**

Helm автоматически определяет последовательность применения шаблонов в чарте.

<table border="1" id="bkmrk-%D0%94%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D1%8F%2F%D1%84%D0%B0%D0%B9%D0%BB-%D0%9E%D0%BF%D0%B8%D1%81" style="width: 101.548%; height: 357.563px;"><thead><tr style="height: 29.7969px;"><td class="align-center" style="width: 19.0725%; height: 29.7969px;">Директория/файл</td><td class="align-center" style="width: 55.1826%; height: 29.7969px;">Описание</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">Обяз.</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">Chart.yaml</td><td style="width: 55.1826%; height: 29.7969px;">Метаданные чарта</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">+</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">templates/</td><td style="width: 55.1826%; height: 29.7969px;">Ресурсы кубера в формате yaml helm (yaml с переменными)

Но файлы начинающиеся с \_ не обрабатываются, \_\*.tpl обрабатываются как helper файлы.

</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">+ если не составной</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">templates/NOTES.txt</td><td style="width: 55.1826%; height: 29.7969px;">Инструкции по использованию</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">-</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">values.yaml</td><td style="width: 55.1826%; height: 29.7969px;">Переменные по умолчанию</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">-</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">.helmignore</td><td style="width: 55.1826%; height: 29.7969px;">Файлы исключения при упаковке чарта</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">-</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">charts/</td><td style="width: 55.1826%; height: 29.7969px;">Зависимости (другие чарты)</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">-, при отсутствии helm их сгенерирует в соответствии с Chart.yaml</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">Chart.lock</td><td style="width: 55.1826%; height: 29.7969px;">Первично примененные зависимости.</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">-, будет создан автоматически</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">crds/</td><td style="width: 55.1826%; height: 29.7969px;">Зависимости, которые должны быть собраны до основного чарта</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">-</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">README.md</td><td style="width: 55.1826%; height: 29.7969px;">Описание</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">-</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">LICENSE</td><td style="width: 55.1826%; height: 29.7969px;">Лицензия</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">-</td></tr><tr style="height: 29.7969px;"><td style="width: 19.0725%; height: 29.7969px;">value.shema,json</td><td style="width: 55.1826%; height: 29.7969px;">Шаблон в json формате</td><td class="align-center" style="width: 25.7449%; height: 29.7969px;">-</td></tr><tr><td style="width: 19.0725%;">files/</td><td style="width: 55.1826%;">Дополнительные файлы</td><td style="width: 25.7449%;">  
</td></tr></tbody></table>

**templates/**

Измененные yaml. Добавлены переменные в формате Go шаблонизации. Переменные берутся из файла values.yaml

```
apiVersion: v1
kind: ConfigMap
metadata: 
  name: {{ .Release.Name }}
data:
  configuration.txt: |-
    {{ .Values.configurationData }}
```

Родительские пространства имен у переменных:

<table border="1" id="bkmrk-%D0%9F%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE-%D0%B8%D0%BC%D0%B5%D0%BD-%D0%9E%D0%BF" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 30.0596%;"></col><col style="width: 70.0596%;"></col></colgroup><thead><tr><td class="align-center">Пространство имен</td><td class="align-center">Описание</td></tr></thead><tbody><tr><td>.Release</td><td>Переменные, связанные с релизом в устанавливаемой системе. .Release.Name - имя релиза .Release.Namespace - пространство имен релиза .Release.Revision - номер версии  
</td></tr><tr><td>.Values</td><td>Переменные, размещенные в файле values.yaml</td></tr><tr><td>.Chart</td><td>Переменные, получаемые из файла Chart.yaml Например, .Chart.Name, .Chart.Version .Chart.AppVersion   
</td></tr><tr><td>.Files</td><td>Работа с файлами в директории из директории files. Если файл не существует - вернется ошибка.

.Files.Get - Извлекает содержимое файлов

.Files.AsSecrets - Возвращает Base-64 закодированную строку для создания secret

.Files.AsConfig - Возвращает данные для использования в виде ConfigMap

</td></tr><tr><td>.Subcharts</td><td>Пространство имен дочерних чартов. Например .Subchart.MyChart.firstvalue

</td></tr></tbody></table>

**values.yaml**

В виде обычного key: value yaml

**Chart.yaml**

Чарты бывают application и library. Application используются для деплоя приложений, library - для предоставления именованных шаблонов, используемых в других чартах. В library чартах не может быть ни одного шаблона, только helper файлы.

Обязательные поля:

<table border="1" id="bkmrk-%D0%9F%D0%BE%D0%BB%D0%B5-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-apiver" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 30.0596%;"></col><col style="width: 70.0596%;"></col></colgroup><thead><tr><td class="align-center">Поле</td><td class="align-center">Описание</td></tr></thead><tbody><tr><td>apiVersion</td><td>Версия. В helm 3 формате используется v2</td></tr><tr><td>name</td><td>Имя чарта. Должно совпадать с именем директории чарта. В именах стоит использовать только -, например first-chart</td></tr><tr><td>version</td><td>Версия. Формат X.Y.Z</td></tr></tbody></table>

Пример файла

<table border="1" id="bkmrk-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%94%D0%BE%D0%BF.-%D0%BF%D0%B0%D1%80.-%D0%9E%D0%BF-4" style="width: 101.548%;"><thead><tr><td class="align-center" style="width: 24.6677%;">Команда</td><td class="align-center" style="width: 17.883%;">Доп. пар.</td><td class="align-center" style="width: 57.4494%;">Описание</td></tr></thead><tbody><tr><td style="width: 24.6677%;">helm create chart\_name</td><td style="width: 17.883%;"> </td><td style="width: 57.4494%;">Создание шаблона чарта</td></tr><tr><td style="width: 24.6677%;">helm install proj\_name path</td><td style="width: 17.883%;">  
</td><td style="width: 57.4494%;">Создание проекта с названием proj\_name используя чарт по пути path</td></tr><tr><td style="width: 24.6677%;">  
</td><td style="width: 17.883%;">-f par\_file</td><td style="width: 57.4494%;">ссылка на другой файл параметров</td></tr><tr><td style="width: 24.6677%;">  
</td><td style="width: 17.883%;">--set foo=bar</td><td style="width: 57.4494%;">Ручная установка параметров</td></tr><tr><td style="width: 24.6677%;">helm get manifest proj\_name</td><td style="width: 17.883%;">  
</td><td style="width: 57.4494%;">Получить манифест проекта proj\_name</td></tr></tbody></table>

**Зависимости чарта**

Заполняются в разделе dependencies файла Chart.yaml

<table border="1" id="bkmrk-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%94%D0%BE%D0%BF.-%D0%BF%D0%B0%D1%80.-%D0%9E%D0%BF-5" style="width: 101.548%;"><thead><tr><td class="align-center" style="width: 24.6677%;">Команда</td><td class="align-center" style="width: 17.883%;">Доп. пар.</td><td class="align-center" style="width: 57.4494%;">Описание</td></tr></thead><tbody><tr><td style="width: 24.6677%;">helm dependency build</td><td style="width: 17.883%;">путь до Chart.yaml</td><td style="width: 57.4494%;">Перестроить зависимые чарты, базируясь на файле Chart.lock Если этого файла нет - то же что и update</td></tr><tr><td style="width: 24.6677%;">helm dependency list</td><td style="width: 17.883%;"> </td><td style="width: 57.4494%;">Список зависимостей</td></tr><tr><td style="width: 24.6677%;">helm dependency update</td><td style="width: 17.883%;"> </td><td style="width: 57.4494%;">Обновление чартов и генерация Chart.lock</td></tr></tbody></table>

В зависимостях могут быть условия:

```
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 не выставлена - данные зависимости установлены не будут. Может быть несколько тэгов, но если хотя бы один подходит - будет добавлено.

Дочерние параметры чарта могут быть переопределены.

Можно импортировать параметры из дочернего чарта (если его параметры отмечены как экспортируемые).

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