#helm #devops
Валидации, проверки, линтеры.
Как много мы о них говорим, но и как это иногда важно.
У меня есть helm chart.
После изменения любых параметров или темплейтов я его проверяю.
- unit tests (ооооооочень редко и не всем нужно)
- linter
Дальше публикация и куда-то релиз.
Чарт готов, чарт проверен в пайплайне и пре-коммит хуками.
А что с values файлами на стороне приложений?
У меня же есть прекрасные коллеги с ровными руками.
Они могут в values файлах своих репозиториев при использовании нашего общего чарта допустить ошибку.
Ну так бывает, все ошибаются.
Могут написать "true" вместо true, могут не там сделать indent или вообще половину indent(1/3).
Которые при любых проблемах обвиняют девопсов😮 🫵 😮 .
Как быть тут?
На помощь мне приходит
То есть на базе template мы генерируем schema.yaml файл, по которому будет идти сравнение values.yaml файлов у коллег.
Для начала я потренируюсь на кошках и возьму классный чарт отличного продукта
https://github.com/cloudnative-pg/charts
Клонирую его себе
Затем мне надо написать схему.
Буду ли я просить нейронки?
👎 Да пошли они в хер, с ними голова вообще перестала работать.🐒
Буду ли я сам писать схему?
Да щас🤣 .
Иду в awesome helm репу, ищу есть ли чего у нас там для скима валидейшн.
https://github.com/cdwv/awesome-helm
Нахожу поиском там генератор (второй депрекейтед)
https://github.com/dadav/helm-schema
Читаю - всё ок, отлично подходит под мою задачу.
Качаю, распаковываю и так далее
Теперь иду в свой склонированный cnpg репозиторий
и просто запускаю бинарь
Результатом будет json файл(ы) в каждом чарте.
Один из файлов выглядит так
https://gist.github.com/kruchkov-alexandr/dc4cf3e4ac9af5719fb435d42e1873e6
Чарт есть, генератор схема валидейшн есть, схема есть.
Осталось научиться проверять.
У меня есть три основных варианта использования схемы:
- подсунуть комментарии-аннотации в values.yaml
- в VSCode мышкой клацнуть на схему и сам vscode будет подсвечивать ошибки
- команда в терминале в CICD
Мне больше нравится последний вариант автоматизации.
Немного душноты:
- команда
- если есть файл
Валидации, проверки, линтеры.
Как много мы о них говорим, но и как это иногда важно.
У меня есть helm chart.
После изменения любых параметров или темплейтов я его проверяю.
- unit tests (ооооооочень редко и не всем нужно)
helm unittest ./helm-chart
- linter
helm lint helm-chart
Дальше публикация и куда-то релиз.
helm package helm-chart
Чарт готов, чарт проверен в пайплайне и пре-коммит хуками.
А что с values файлами на стороне приложений?
У меня же есть прекрасные коллеги с ровными руками.
Они могут в values файлах своих репозиториев при использовании нашего общего чарта допустить ошибку.
Ну так бывает, все ошибаются.
Могут написать "true" вместо true, могут не там сделать indent или вообще половину indent(1/3).
Которые при любых проблемах обвиняют девопсов
Как быть тут?
На помощь мне приходит
schema validation.То есть на базе template мы генерируем schema.yaml файл, по которому будет идти сравнение values.yaml файлов у коллег.
Для начала я потренируюсь на кошках и возьму классный чарт отличного продукта
https://github.com/cloudnative-pg/charts
Клонирую его себе
git clone git@github.com:cloudnative-pg/charts.git
Затем мне надо написать схему.
Буду ли я просить нейронки?
Буду ли я сам писать схему?
Да щас
Иду в awesome helm репу, ищу есть ли чего у нас там для скима валидейшн.
https://github.com/cdwv/awesome-helm
Нахожу поиском там генератор (второй депрекейтед)
https://github.com/dadav/helm-schema
Читаю - всё ок, отлично подходит под мою задачу.
Качаю, распаковываю и так далее
wget https://github.com/dadav/helm-schema/releases/download/0.18.1/helm-schema_0.18.1_Linux_x86_64.tar.gz
tar -xvf helm-schema_0.18.1_Linux_x86_64.tar.gz
chmod +x helm-schema
sudo cp helm-schema /usr/local/bin/
Теперь иду в свой склонированный cnpg репозиторий
cd ~/GIT/INTERNET/cnpg/ #(у вас путь другой будет само собой)
и просто запускаю бинарь
helm-schema
Результатом будет json файл(ы) в каждом чарте.
Один из файлов выглядит так
https://gist.github.com/kruchkov-alexandr/dc4cf3e4ac9af5719fb435d42e1873e6
Чарт есть, генератор схема валидейшн есть, схема есть.
Осталось научиться проверять.
У меня есть три основных варианта использования схемы:
- подсунуть комментарии-аннотации в values.yaml
- в VSCode мышкой клацнуть на схему и сам vscode будет подсвечивать ошибки
- команда в терминале в CICD
Мне больше нравится последний вариант автоматизации.
Немного душноты:
- команда
helm template генерирует(рендерит) YAML манифесты.- если есть файл
JSON со схемой, то helm template проверяет ещё и схему!Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
#helm #devops
Поехали проверять.
Всё ок, нет проблем, куча манифестов срендерилось.
Теперь иду в файл
и меняю
на
Снова запускаю и получаю ошибку
Отлично, у меня есть
- мой чарт/чарты
- автоматическая генерация схемы путем
То есть когда мы что-либо меняем в своём чарте, то у нас и автоматическая проверка идёт и автоматически генерируется и в гите обновляется схема.
Дальше я свой общий
Так, а что у нас с GitOps ArgoCD подходом?
Ведь мы там не используем helm в чистом виде и нет понятия релиза.
Читаю документацию
https://argo-cd.readthedocs.io/en/stable/user-guide/helm/
Ура, под капотом ArgoCD использует как раз helm template, а значит мы при syncing увидим не просто ошибку, а ошибку в каком конкретно месте у нас ошибка.
Итог:
- в самом чарте появилась схема, к тому же она автоматически обновляется при каждом изменении чарта
- при использовании helm для релизов в моём pipeline я добавляю
- в случае работы с ArgoCD у меня так же проверяется схема, снижая количество человеческих ошибок
- и со стороны чарта и со стороны репозиториев разработчиков есть🐒 )
Поздравляю - мы снова добавили какую-то очереднуюхероту автоматизацию и валидацию 🤣
Поехали проверять.
helm template alexk-test charts/cluster/
Всё ок, нет проблем, куча манифестов срендерилось.
Теперь иду в файл
charts/cluster/values.yamlи меняю
endpointCA:
create: false
на
endpointCA:
create: "false"
Снова запускаю и получаю ошибку
helm template alexk-test charts/cluster/
Error: values don't meet the specifications of the schema(s) in the following chart(s):
cluster:
- recovery.endpointCA.create: Invalid type. Expected: boolean, given: string
Отлично, у меня есть
- мой чарт/чарты
- автоматическая генерация схемы путем
pre-commit и/или CICD команды схемы для чарта до релиза чартаТо есть когда мы что-либо меняем в своём чарте, то у нас и автоматическая проверка идёт и автоматически генерируется и в гите обновляется схема.
Дальше я свой общий
pipeline для приложений коллег добавляю шаг helm template и он до релиза проверяет values.yaml файлы пользователей и коллег.Так, а что у нас с GitOps ArgoCD подходом?
Ведь мы там не используем helm в чистом виде и нет понятия релиза.
Читаю документацию
https://argo-cd.readthedocs.io/en/stable/user-guide/helm/
Ура, под капотом ArgoCD использует как раз helm template, а значит мы при syncing увидим не просто ошибку, а ошибку в каком конкретно месте у нас ошибка.
Итог:
- в самом чарте появилась схема, к тому же она автоматически обновляется при каждом изменении чарта
- при использовании helm для релизов в моём pipeline я добавляю
helm template для проверки корректности values.yaml файлов разработчиков- в случае работы с ArgoCD у меня так же проверяется схема, снижая количество человеческих ошибок
- и со стороны чарта и со стороны репозиториев разработчиков есть
pre-commit hooks (если на них забиваютПоздравляю - мы снова добавили какую-то очередную
Please open Telegram to view this post
VIEW IN TELEGRAM
✍9🔥6❤1
#helm #kubernetes
Три прыжка.
Прыжок в воду 1.
Можно просто почитать официальную документацию на версию 3.19
Немного лукавит из-за нерегулярного обновления, но в целом 90% инженерам этого достаточно.
Мы теперь знаем, что перед деплойментом у нас есть секрет, перед ним PVC, а ещё раньше их неймспейс.
Это логично и не рождает проблем в стандартных чартах.
Прыжок в воду 2.
Так же можно посмотреть в исходном коде на версию 3.19
Там видно настоящий список, а так же указаны логические операторы про анноун ресурсам и сортировке.
Всякие CRD, хуки и весы.
Чуть точнее и глубже, этого достаточно ещё 5% людей.
Прыжок в воду 3.
Побудем сегодня любопытными инженерами и узнаем всё до конца, нырнув глубже.
В общем и целом есть несколько основных категорий:
-
-
-
-
-
При запуске
1)
Они не шаблонизируются, а применяются как есть.
https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/
2)
Если есть. (
Внутри группы хуков сначала сортируются по весу(
-
-
Внутри одного веса сортировка идёт по имени ресурса (алфавитно).
https://helm.sh/docs/topics/charts_hooks/
3)
Сортировка происходит после рендеринга шаблонов, но до их применения к кластеру.
Рендеринг -> сортировка -> применение.
-
-
..
-
..
-
..
4)
Так сказать всё остальное бесчисленное множество.
Важно понимать, что внутри группы
-
-
..
-
Этот алфавитный порядок зачастую не совпадает с требуемым логическим порядком зависимостей.
5)
Если есть. (
Внутри группы хуков сначала сортируются по весу(
-
-
Внутри одного веса сортировка идёт по имени ресурса (алфавитно).
https://helm.sh/docs/topics/charts_hooks/
Вот теперь картина полная и мы славные инженеры.
- - -
Для чего же мы ныряем так глубоко? Зачем нам это?
Иногда прилетают задачи о оптимизации имеющегося чарта.
Например (это. лишь. пример), у нас сложная технологическая платформа, а в чарте есть и
Все ресурсы категории
Нет ишшуера/не будет выпущен серт - не будет его куда запушить/примонтировать - не будет секрета/пушсикрета - проблема платформы. Да и серт не мгновенно выпускается. Нужно время. Как быть?
Тот же
Как раз тут и пригодятся нам эти глубокие знания.
Зная правила мы спокойно решаем задачу.
- Алекс, а что там с Арго?
Под капотом ArgoCD использует как раз
https://argo-cd.readthedocs.io/en/stable/user-guide/helm/
- А что там с хуками?
Argo CD автоматически конвертирует эту логику в свои Hooks и Waves, сохраняя ваш строгий контроль над порядком.
-
-
https://argo-cd.readthedocs.io/en/release-2.14/user-guide/resource_hooks/
https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/
Занимательное:
- при
Три прыжка.
Как же идёт порядок генерации манифестов по шаблону, сортировка и применение в кластере при использовании Helm v3?
Прыжок в воду 1.
Можно просто почитать официальную документацию на версию 3.19
Немного лукавит из-за нерегулярного обновления, но в целом 90% инженерам этого достаточно.
Мы теперь знаем, что перед деплойментом у нас есть секрет, перед ним PVC, а ещё раньше их неймспейс.
Это логично и не рождает проблем в стандартных чартах.
Прыжок в воду 2.
Так же можно посмотреть в исходном коде на версию 3.19
Там видно настоящий список, а так же указаны логические операторы про анноун ресурсам и сортировке.
Всякие CRD, хуки и весы.
Чуть точнее и глубже, этого достаточно ещё 5% людей.
Прыжок в воду 3.
Побудем сегодня любопытными инженерами и узнаем всё до конца, нырнув глубже.
В общем и целом есть несколько основных категорий:
-
pre-* хуки-
post-* хуки-
Standard ресурсы-
CRD-
Unknown ресурсыПри запуске
helm install/helm upgrade --install у нас идёт такой порядок:1)
CRD. Всегда первым. Из директории <чарт>/crds/.Они не шаблонизируются, а применяются как есть.
https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/
2)
pre-install hooks. Если есть. (
"helm.sh/hook": *)Внутри группы хуков сначала сортируются по весу(
"helm.sh/hook-weight"):-
отрицательный -
ноль (по умолчанию)
- положительный
- по имениВнутри одного веса сортировка идёт по имени ресурса (алфавитно).
https://helm.sh/docs/topics/charts_hooks/
3)
standard ресурсы, по порядку в исходном коде в kind_sorter.goСортировка происходит после рендеринга шаблонов, но до их применения к кластеру.
Рендеринг -> сортировка -> применение.
-
PriorityClass-
Namespace..
-
ClusterRoleBinding..
-
Deployment..
4)
Unknown ресурсыТак сказать всё остальное бесчисленное множество.
Важно понимать, что внутри группы
Unknown ресурсов порядок детерминирован и следует правилу: сначала сортировка по Kind (алфавитно) (например, ApplicationSet перед PostgreSQL), а затем по имени ресурса (алфавитно).-
ApplicationsSet (ArgoCD)-
PostgreSQL (Zalando)..
-
ScaledObject (KEDA)Этот алфавитный порядок зачастую не совпадает с требуемым логическим порядком зависимостей.
5)
post-install хуки. Если есть. (
"helm.sh/hook": *)Внутри группы хуков сначала сортируются по весу(
"helm.sh/hook-weight"):-
отрицательный -
ноль (по умолчанию)
- положительный
- по имениВнутри одного веса сортировка идёт по имени ресурса (алфавитно).
https://helm.sh/docs/topics/charts_hooks/
Вот теперь картина полная и мы славные инженеры.
- - -
Для чего же мы ныряем так глубоко? Зачем нам это?
Иногда прилетают задачи о оптимизации имеющегося чарта.
Например (это. лишь. пример), у нас сложная технологическая платформа, а в чарте есть и
cert-manager с выпуском сертификатов, и externalsecrets и issuer, и многое другое.Все ресурсы категории
Unknown и нам нужен строгий порядок или, что хуже, тайминг(чтобы успело создаться что-то до следующего ресурса).Нет ишшуера/не будет выпущен серт - не будет его куда запушить/примонтировать - не будет секрета/пушсикрета - проблема платформы. Да и серт не мгновенно выпускается. Нужно время. Как быть?
Тот же
issuer по алфавиту идёт после certificate, хотя должно быть и иначе, а pushsecret ничего не сможет прокинуть, потому что серт ещё не выпущен. И всё обёрнуто через ArgoCD.Как раз тут и пригодятся нам эти глубокие знания.
Зная правила мы спокойно решаем задачу.
- Алекс, а что там с Арго?
Под капотом ArgoCD использует как раз
helm template.https://argo-cd.readthedocs.io/en/stable/user-guide/helm/
- А что там с хуками?
Argo CD автоматически конвертирует эту логику в свои Hooks и Waves, сохраняя ваш строгий контроль над порядком.
-
helm.sh/hook -> Resource Hooks-
helm.sh/hook-weight -> Sync Waveshttps://argo-cd.readthedocs.io/en/release-2.14/user-guide/resource_hooks/
https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/
Занимательное:
- при
helm upgrade CRD из crds/ не обновляются (Helm не изменяет их содержимое, нужно делать вручную), только при helm install1👍19❤5🔥1👨💻1🆒1
Приветствую всех.
Поскольку все читатели здесь ради контента, а не моей биографии, сразу перейду к сути.
Этот блог - мои заметки на полях.
Почти не делаю репосты, пишу для души и лишь когда на это есть время/желание.
Обычно это 2-4 поста в неделю.
В основном делюсь:
- информацией, которую узнал только что (даже если она пятилетней давности, но я узнал её сейчас)
- лонгридами, байками или всратыми историями, без указания срока давности
- последовательным описанием моего процесса мышления на работе при решении задач
Интересные, на мой взгляд, сообщения я публикую с тегами:
- пример основных тем канала:
#aws #azure #kubernetes #troubleshooting #costoptimization #longread #devops
- пример второстепенных категорий:
#terragrunt #victoriametrics #git #docker #одинденьизжизни #helm
- для того, чтобы на работе не поехать кукухой, у меня есть:
#пятница #всратость #байки
Сообщения без тегов это просто шутка-минутка или мысль, которая была актуальна лишь на момент написания.
Все заметки не имеют строгой последовательности, читать их можно как угодно:
- начать с самого основания канала (за год постов около 230)
- использовать интересующие теги/поиск
- ну или просто начать с новых постов, пропустив всё ранее написанное😭
Каждый решает, как ему удобно.
Буду рад, если мои заметки помогут кому-то узнать что-то новое, избежать повтора чужих ошибок или просто улыбнуться.
На крайний случай, самоутвердиться за счёт моих факапов или незнания🐒
Всем привет и желаю приятного чтения.
Поскольку все читатели здесь ради контента, а не моей биографии, сразу перейду к сути.
Этот блог - мои заметки на полях.
Почти не делаю репосты, пишу для души и лишь когда на это есть время/желание.
Обычно это 2-4 поста в неделю.
В основном делюсь:
- информацией, которую узнал только что (даже если она пятилетней давности, но я узнал её сейчас)
- лонгридами, байками или всратыми историями, без указания срока давности
- последовательным описанием моего процесса мышления на работе при решении задач
Интересные, на мой взгляд, сообщения я публикую с тегами:
- пример основных тем канала:
#aws #azure #kubernetes #troubleshooting #costoptimization #longread #devops
- пример второстепенных категорий:
#terragrunt #victoriametrics #git #docker #одинденьизжизни #helm
- для того, чтобы на работе не поехать кукухой, у меня есть:
#пятница #всратость #байки
Сообщения без тегов это просто шутка-минутка или мысль, которая была актуальна лишь на момент написания.
Все заметки не имеют строгой последовательности, читать их можно как угодно:
- начать с самого основания канала (за год постов около 230)
- использовать интересующие теги/поиск
- ну или просто начать с новых постов, пропустив всё ранее написанное
Каждый решает, как ему удобно.
Буду рад, если мои заметки помогут кому-то узнать что-то новое, избежать повтора чужих ошибок или просто улыбнуться.
На крайний случай, самоутвердиться за счёт моих факапов или незнания
Всем привет и желаю приятного чтения.
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍31👨💻1