Charts
https://helm.sh/docs/topics/charts/
В helm пакеты называются chart'ами
Чарт это коллекция файлов которые описывают связанные ресурсы кубернетеса
Одиночный чарт может быть использован как для деплоя чего-то простого (под с memcache), так и для деплоя комплексного приложения из многих компонентов (базы данных, http-серверы, итд)
Чарты создаются в виде файлов и могут быть запакованы в архив
Через helm pull chartrepo/chartname
можно скачать и посмотреть чарт без его установки
The Chart File Structure
Чарт организован как структура файлов в какой-то директории, название этой директории и есть название чарта
Внутри этой директории хелм ожидает увидеть следующую структуру файлов
wordpress/
Chart.yaml # A YAML file containing information about the chart
LICENSE # OPTIONAL: A plain text file containing the license for the chart
README.md # OPTIONAL: A human-readable README file
values.yaml # The default configuration values for this chart
values.schema.json # OPTIONAL: A JSON Schema for imposing a structure on the values.yaml file
charts/ # A directory containing any charts upon which this chart depends.
crds/ # Custom Resource Definitions
templates/ # A directory of templates that, when combined with values,
# will generate valid Kubernetes manifest files.
templates/NOTES.txt # OPTIONAL: A plain text file containing short usage notes
В Хелм зарезервированы перечисленные выше имена файлов, остальное он проигнорит (остальное можно использовать под свои нужды)
The Chart.yaml File
Chart.yaml
требуется для чарта
О его содержимом можно почитать тут https://helm.sh/docs/topics/charts/#the-chartyaml-file
Обязательных полей только три
apiVersion: The chart API version (required)
name: The name of the chart (required)
version: A SemVer 2 version (required)
Каждый чарт должен иметь версию, версии подчиняются SemVer2 стандарту
helm package
запакует чарт в архив с именем NAME-VERSION.tgz
Сложные SemVer имена версий также будут работать
[19:40:00] vandud@macbook: test-chart [0]$ grep 'version:' Chart.yaml
version: 1.2.3-alpha.1+ef365
[19:40:10] vandud@macbook: test-chart [0]$ helm package .
Successfully packaged chart and saved it to: /tmp/test-chart/test-charnthnth-1.2.3-alpha.1+ef365.tgz
[19:40:14] vandud@macbook: test-chart [0]$
apiVersion: v2
должен быть v2
для 3 helm, и v1
для второго
appVersion
указывает на версию приложения в чарте
Например в чарте для drupal указано appVersion: "8.2.1"
, это значит что внутрь чарта заключен drupal версии "8.2.1"
Это поле не связано с версией чарта
Рекомендуется заключать это поле в кавычки (интерпретатору yaml так легче)
kubeVersion
полезное поле, в нем указывается допустимая для этого чарта версия кубера
Если версия не совпадает, то чарт не задеплоится
Эту версию можно указывать гибко, например:
>= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0
Пробел это И
Две палки это ИЛИ
Доступны символы сравнения = != > < >= <=
Диапазоны, вайлдкарды, диапазоны по патчверсиям, диапазоны по минорным версиям, итд
Подробнее об этом https://helm.sh/docs/topics/charts/#the-kubeversion-field
Поле deprecated
помечает чарт как устаревший, если последняя версия чарта в репозитории помечена как deprecated
, то весь чарт считается deprecated
Можно выложить новую версию без этой пометки, тогда все будет обычно
Есть два типа чартов (type
)
- application - by default
- library - предоставляет утилиты для chart builder'а
Chart LICENSE, README and NOTES
Файл LICENSE содержит лицензию на чарт в виде обычного текста
Файл README.md обычно содержит описание приложения, рекомендации по запуску чарта, описание опций в values.yaml
и их дефолтных значений и какую-то еще полезную информацию
Файл templates/NOTES.txt обрабатывается как темплейт и содержит какие-то рекомендации по использованию, следующие шаги после установки, любую другую полезную инфу (например url до webui или данные для подключения к базе)
Выводится после helm install
или helm status
Chart Dependencies
Чарт может зависеть от какого-либо количества других чартов
Эти зависимости могут динамически линковаться через поле dependencies
в Chart.yaml
Или вручную через директорию /charts
В секции dependencies можно перечислить чарты от которых зависит наш чарт
dependencies:
- name: apache
version: 1.2.3
repository: https://example.com/charts
- name: mysql
version: 3.2.1
repository: https://another.example.com/charts
- name - имя чарта который нам нужен
- version - версия этого чарта
-
ropository - url до репозитория (нужно будет сперва сделать
helm repo add
чтобы сработало) - Также можо использовать имя добавленного репозитория вместо полного урла
$ helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com
dependencies: - name: awesomeness version: 1.0.0 repository: "@fantastic-charts"
Команда helm dependency update
загрузит все зависимости в папку charts/
charts/
apache-1.2.3.tgz
mysql-3.2.1.tgz
С помощью alias
можно установить установить несколько раз один и тот же чарт
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
alias: new-subchart-1
- name: subchart
repository: http://localhost:10191
version: 0.1.0
alias: new-subchart-2
- name: subchart
repository: http://localhost:10191
version: 0.1.0
condition: subchart1.enabled, global.subchart1.enabled
Condition позволяет указать в себе yaml-path'ы через запятую (один или более) и если путь резолвится из values.yaml в булево значение, то зависимость отключается или включается
Используется первый успешно разрезолвленный путь
Если ни одного пути нет в values то и нет condition
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
condition: subchart1.enabled, global.subchart1.enabled
tags:
- front-end
- subchart1
- name: subchart2
repository: http://localhost:10191
version: 0.1.0
condition: subchart2.enabled,global.subchart2.enabled
tags:
- back-end
- subchart2
# values.yaml
subchart1:
enabled: true
tags:
front-end: false
back-end: true
Кондишены установленные через values перекрывают тэги, используется первый найденный путь из values, останые игнорятся
Тэги обрабатываются так: если хоть один из тэгов true
, то чарт включен
Секция tags:
доложна быть в корне values (не должна быть вложенной)
Можно экспортировать values из дочернего чарта
# parent's Chart.yaml file
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
import-values:
- data
# child's values.yaml file
exports:
data:
myint: 99 # эта пара key-value попадет в родительский values
Все зависимости объединяются в один общий набор и создаются/обновляются по алфавиту
Templates and Values
Шаблоны и values описываются на языке go templates
https://pkg.go.dev/text/template
В темплейтах используются функции из https://github.com/Masterminds/sprig/blob/master/docs/index.md
Темплейты хранятся в папке templates/
и при рендеринге чарта пропускаются сквозь template engine
values'ы появляются из values.yaml файла который положил разработчик чарта (в нем дефолтные значения)
А так же пользователь чарта при установке может использовать свой файл (скормив его команде helm install
)
Значения из values.yaml или те что установлены через --set
, доступны внутри шаблонов через объект .Values
Есть ряд предустановленных значений
Их нельзя перезаписать и они доступны в любом шаблоне
Через объект Release
: имя чарта, namespace куда зарелижен чарт, устанавливается или обновляется релиз
Объект Chart
содержит контент файла Chart.yaml
Объект Files
позволяет получить доступ к другим файлам чарта (не шаблоны и не из файла .helmignore)Capabilities
про версию куба
Values'ы добавленные через ключ --values
при установке, мерджатся с дефолтными
title: "My WordPress Site" # Sent to the WordPress template
mysql:
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
port: 8080 # Passed to Apache
Можно определять значения для дочерних чартов
Из примера выше, wordpress-chart видит .Values.mysql.password
, а mysql-chart видит .Values.password
Mysql-chart не увидит title
Есть секция global
Она доступна всем сабчартам
title: "My WordPress Site" # Sent to the WordPress template
global:
app: MyWordPress
mysql:
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
port: 8080 # Passed to Apache
Превратится в
title: "My WordPress Site" # Sent to the WordPress template
global:
app: MyWordPress
mysql:
global:
app: MyWordPress
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
global:
app: MyWordPress
port: 8080 # Passed to Apache
С помощью values.schema.json можно валидировать финальные values объекты (смердженные дефолтный values.yaml, кастомный values, и то что передано через set)
В этом файле можно задавать какие типы данных должны быть у определенных полей и разное другое
helm install/upgrade/lint/template
- используют values.schema.json для валидации
Custom Resource Definitions (CRDs)
В кубере есть crd (custom resource definitions)
Они позволяют пользователя определять свои собственные kinds
Хелм тоже их поддерживает
crd yaml'ы должны лежать в папке crds/
Они не могут быть затемплейчены, это просто plain-text'овые yaml документы
Они складываются отдельно потому что helm при установке чарта сначала установит все crd, потом дождется когда они установятся и станут доступны, и только потом начнет устанавливать теплейты
Любой веб-сервер может выполнять функцию chart repository
No Comments