Info
Content

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

tags содержит лейблы, через values можно управлять включенностью зависимости

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
Back to top