В этом руководстве мы кратко обсудим, как Helm может помочь упростить управление приложениями Kubernetes, и узнаем, как использовать Helm для создания базового чарта. В этом руководстве объясняется, как шаблон Helm deployment.yaml преобразуется из шаблона в манифест YAML. Статья не соответствует традиционному справочному руководству по программированию: операторы и функции перечислены в алфавитном порядке. Статья объясняет синтаксис шаблона по мере необходимости, чтобы объяснить deployment.yaml от начала до конца. Вот полный файл deployment.yaml для справки: Выдержка из этого deployment.yaml: .Release.Name и .Release.Service встроены в объекты — полный список на https://docs.helm.sh/chart_template_guide/ Встроенные объекты. К сожалению, нет ссылок на определенные части их ОЧЕНЬ длинных веб-страниц — вам нужно прокрутить вниз и найти. Ниже показано, как отображается финальный файл deployment.yaml, если вы используете: В первой половине руководства вам не надо выполнять никаких команд, просто прочтите. (Даже при отладке выводится слишком много, если все, что нам нужно, — это исследовать синтаксис трехстрочного шаблона.) (После того, как вы прочитали полный учебник, вы можете захотеть прочитать его еще раз, но на этот раз отредактировав файлы шаблонов и значений и запустив helm install с отладкой для воспроизведения / обучения) Эти 3 значения ниже взяты из файла values.yaml: Извлекаем values.yaml  — name: {{ .Chart.Name }} из файла Chart.yaml. Его содержимое показано ниже. Вероятно, половина всех шаблонов — это как раз такие простые замены значений. Вы видели, что в файлах YAML есть директивы шаблонов, встроенные в {{ and }}. У вас должно быть пустое пространство после открытия {{ и пустое пространство перед закрытием }}. Значения, которые передаются в шаблон, можно рассматривать как объекты с пространством имен, где точка (.) разделяет каждый элемент с пространством имен. Первая точка перед чартом указывает на то, что мы начинаем с самого верхнего пространства имен. Прочтите .Chart.name как «начните с верхнего пространства имен, найдите объект Chart, затем посмотрите внутри него на предмет с именем name». Отображается как: ОЧЕНЬ важно: пробелы имеют синтаксическое значение в YAML. Перед визуализированными двумя селекторами стоит 8 пробелов, поскольку в deployment.yaml есть {{- toYaml. | nindent 8}} nindent 8 делает отступ на 8 пробелов. with — конструкция цикла. Со значениями в .Values.nodeSelector: преобразуйте его в Yaml (toYaml).
Точка после toYaml — это текущее значение .Values.nodeSelector в цикле. Это должно быть там.
Считайте его похожим на sum(1,34,454)… как toYaml(.)… это значение переданного параметра. Символ | работает так же, если вы знакомы с оболочкой Linux. affinity: и tolerations: with работают точно так же. К сожалению, эти примеры не показывают, как with также является текущим модификатором области видимости. Это хорошо объясняется в разделе MODIFYING SCOPE USING WITH За исключением include, вы теперь полностью понимаете, как выполняется рендеринг всего deployment.yaml с использованием значений из values.yaml, Chart.yaml и встроенных объектов. Полный service.yaml ниже: Теперь вы тоже это полностью понимаете. Извлечение первых и последних 3 строк из ingress.yaml Все содержимое ingress.yaml заключено в большой if ..., начиная со строки 1 и заканчивая самой последней строкой. Если вход включен — false, содержимое yaml не создается — как мы этого хотим. Строки 2 и 3 демонстрируют, как объявлять переменные шаблона Helm. Обратите внимание на дефис в {{ и }} Эти дефисы / тире съедают символы пробела. {{- съедает все пробелы слева -}} означает, что пробелы справа должны быть удалены — включая новую строку — строка полностью удаляется. Извлечение values.yaml Извлечение deployment.yaml : Отображается как: Обратите внимание, как цикл диапазона (range) генерирует список хостов. quote окружает каждого хоста кавычками. Также существует цикл range .Values.ingress.tls, который выполняется только один раз. Присвоение этому циклу 3 значений продемонстрирует, как он будет колебаться в пределах значений. Отображается как: Оригинальный шаблон с дефисами. шаблон с удаленными дефисами: Отображается как: У вас должны быть дефисы на конце строки и пробела. Теперь мы понимаем, как значения используются для создания всех наших шаблонов. Одно исключение: name: {{include "myhelm1.fullname". }} — включение. Теперь мы исследуем include Мы используем include для включения других шаблонов в наши YAML-шаблоны. Файл _helpers.tpl — это стандартный способ определения нескольких коротких фрагментов шаблона, которые мы хотим включить в другие шаблоны. Вот первый именованный шаблон в _helpers.tpl: В первой строке мы даем имя фрагменту шаблона. Затем мы ссылаемся на это имя, чтобы включить его. Вторая строка дает myhelm1.name значение по умолчанию: .Chart.Name. Если значение по умолчанию не существует, myhelm1.name получает значение .Values.nameOverride. trunc 63 обрезает его до 63 символов. trimSuffix "-" удаляет ОДИН завершающий - если он существует.
но trimSuffix "-" удаляет только два завершающих - если они есть. (Это не работает, как в некоторых языках программирования, где обрезка удаляет все завершающие символы) app.kubernetes.io/name: {{ include "myhelm1.name" . }} рендерится как app.kubernetes.io/name: myhelm1 Далее: код шаблона helm.sh/chart: {{ include "myhelm1.chart" . }} рендерится как helm.sh/chart: myhelm1-0.1.0 Это функция шаблона: printf "%s-%s" .Chart.Name .Chart.Version объединяет .Chart.Name и .Chart.Version — плюс ставит дефис между ними. replace "+" "_" заменяет символы плюса на символы подчеркивания. Теперь, когда вы понимаете эти две однострочные функции, вы должны легко понять 10-строчное определение myhelm1.fullname. Если у вас есть опыт программирования, вы увидите, что if / else работает должным образом: Единственное отличие — это синтаксис шаблона {{ и }}. Официальная документация Helm содержит подробную справочную информацию о чартах и шаблонах. The Chart Developer's Guide: https://helm.sh/docs/topics/charts/ The Chart Template Developer's Guide: https://docs.helm.sh/chart_template_guide/ Чтобы полностью изучить всю информацию – понадобится не меньше дня. Лучший способ изучить всю информацию — интерактивное использование. В этой части руководства объясняется, как изучить Helm в интерактивном режиме. Изучение включает: • редактировать как можно меньше файлов
• показывать только как можно меньше визуализированных строк шаблона
• не делайте живых установок. Отлаживайте пробные запуски Давайте как можно быстрее сконвертируем наши текущие файлы диаграмм в это — помните, что это некрасиво, а взлом — БЫСТРЫЙ. Отредактируйте файл values.yaml, чтобы он выглядел так, как показано ниже: Убедитесь, что ./myhelm1/.helmignore содержит эти строки, показанные ниже: Сделайте содержимое deployment.yaml, как показано ниже: ВСЕ, что нам нужно, это yaml (даже НЕПРАВИЛЬНЫЙ), чтобы его запустить. Сделайте пробный запуск: Получается слишком длинный вывод, как показано ниже: Избавьтесь от первых нескольких «бесполезных» строк с помощью grep. Смотрите что ниже. Это все, что нам нужно: некоторые значения для игры и некоторый контент шаблона yaml для игры с синтаксисом шаблона. А теперь займитесь изучением синтаксиса:
Смотрите ниже deployment.yaml На выходе: Посмотрите, сколько синтаксиса вы выучили за секунды. Делайте ошибки, чтобы понять, что на самом деле означают ошибки. Вы также узнаете, когда сообщение об ошибке помогает, а когда вводит в заблуждение. Отредактируйте deployment.yaml Сделайте пробный запуск: ПРОЧИТАЙТЕ, поймите и исправьте ошибку, отправьте повторно. ПРОЧИТАЙТЕ, поймите и исправьте ошибку, отправьте повторно. Ниже приведены несколько различных синтаксических экспериментов: См. Дополнительные 3 строки внизу — use those -символы, чтобы удалить их. Удалите все 3 строки. Helm не такой интерактивный, как Python, но таким образом вы почти можете это сделать. Отображается как: Еще одна уловка. Смотрите, imagePullPolicy с 1 по 3 выглядит одинаково. Что мы сделали? Вы можете заменить уродливые названия вот так: deployment.yaml На выходе получается: Комментарии к заметкам не помогают. Интерпретируется синтаксис шаблона внутри комментариев. Удаление {{ and }} всегда работает. Затем вы можете просмотреть исходный код шаблона и результат в следующей строке выходных данных. Лучший способ показать заголовки того, что было протестировано, — это использовать { { and { } вместо {{ and }}… политики 1 ниже. { and } также работает в заголовках и очень похож на синтаксис чтения {{ and }} Отобразится как: В официальном репозитории Helm по адресу https://github.com/helm/charts есть почти 300 превосходных примеров диаграмм и шаблонов Helm. Вы хотите учиться у лучших: у этих людей. Вы увидите, что всего после этих двух руководств вы уже сможете понять более 80% всего кодирования шаблонов. (Но эти 2 руководства охватывают примерно 10 процентов синтаксиса). Теперь у вас есть 4 независимых разных способа изучения чартов и шаблонов: • официальные справочные документы Helm
• эти 2 практических урока
• 300 превосходных примеров диаграмм Helm
• метод быстрого взлома, который вы можете использовать для вырезания и быстрого изучения этих 3 источников с помощью быстрых интерактивных упражнений Справочная документация Helm сосредоточена на деталях на низком уровне. Ищите идеи для проектирования структурных диаграмм, просматривая репозиторий диаграмм Helm. Из https://github.com/helm/charts/blob/master/stable/lamp/templates/NOTES.txt Посмотрите, как на чарте LAMP отображается справочный текст только для определенных примечаний .Values.ingress.enabled Большинство других чартов используют эту идею, поскольку чарты бесконечно гибки: многие функции можно включить или отключить. Другой пример использования отображения NOTES.txt в зависимости от того, что активировал пользователь: https://github.com/helm/charts/blob/master/stable/lamp/templates/NOTES.txt Другой часто используемый метод — предупредить пользователей, если чарт настроен неправильно или небезопасно: https://github.com/helm/charts/blob/master/stable/mongodb/templates/NOTES.txt Прекрасный пример того, как обращаться с .Values.service.type "NodePort", "LoadBalancer" или "ClusterIP": https://github.com/helm/charts/blob/master/stable/mongodb/templates/NOTES.txt Благодаря этим примерам вы потратили менее 3 минут на изучение некоторых примеров чартов. Вы можете спокойно провести там день (и оно того стоит… если вы будете делать заметки). На https://docs.helm.sh/chart_template_guide/… Доступ к файлам внутри шаблонов… (нельзя напрямую ссылаться на этот абзац) есть несколько примеров того, как включать файлы в шаблоны. В репозитории Helm есть 80 примеров использования .Files.Get.
https://github.com/helm/charts/search?utf8=%E2%9C%93&q=.Files.Get&type=
В первых 10 результатах я обнаружил 5 различных вариантов использования .Files.Get.
Чтобы узнать больше о Helm, посетите https://github.com/helm/charts/tree/master/stable. DevOps-инженер