Проблема большинства helm чартов в том, что они совершенно нечитаемы. Авторы все делают правильно, ведь для клиента чаще всего важен только файл values.yaml. Но весь вот этот обвяз из include, define и остальной кучи шаблонизации создает мультизлаковую кашу, которую дебажить — одно "удовольствие". Я могу ошибаться, но мне кажется, что такая гибкость в большинстве случаев не нужна, если чарт приватный внутренний. Как по мне, лучше пусть будет один простой и очевидный if else для, допустим, прода и прочих окружений, чем эта вся эта мишура.
Реализация некоторой логики в шаблонах вообще получается слишком сложной, чтобы каждый раз её повторять, поэтому либо выносишь её в «функцию», либо не пишешь вообще и миришься с ограничениями.
В остальном у меня не меньше горит с helm-шаблонов, особенно сложных. Собственно всё это на самом деле для того чтобы упростить работу с ними, а не усложнить.
и без возможности всё это централизованно править.
ну, это не совсем так. sed по пачке репозиториев или search&replace в современных редакторов очень мощны. Настолько, что даже Сысоев рекомендовал в конфигурации nginx писать максимально ясно и развернуто, а не пытаться сворачивать блоки и увеличивать сложность конфета для понимания...
Конечно, если логики не много, и пишется она небольшим кол-вом людей, то часто проще дублировать и не париться.
Что хуже — нет каких-то стандартов. Где-то имена образов подставляются как единый параметр, в других же чартах — отдельно репо, отдельно имиджнейм, отдельно тег (и это правильно). Последним подходом, например, пользуется битнами, за что им респект.
Думал может в отдельной статье поделиться практиками по структуре чартов/values, которые показали себя рабочими по крайней мере у нас, может кому полезно будет.
хотя и у них есть спорные моменты, в основном в образах.
Это больше вкусовщина.
Мне вот не хватает рекурсивной проверки по ключу. Приходится лопатить нечто подобное:
{{ if .Values.key1 }}
{{ if .Values.key1.key2 }}
{{ if .Values.key1.key2.key3 }}
- bla.bla-{{ .Values.key1.key2.key3 }}
{{ end }}
{{ end }}
{{ end }}
Хотелось бы сразу:
{{ if .Values.key1.key2.key3 }}
- bla.bla-{{ .Values.key1.key2.key3 }}
{{ end }}
{{ if .Values.key1.key2.key3 }}
особо то никак и не обернешь в include. Единственный вариант который в голову приходил — это сделать define, в который аргументом пробрасывается строка типа ".Values.key1.key2.key3", а внутри это как-то разбивать (по точкам?) на массив и по очереди проверять каждый ключ на существование.Но всё это довольно чудно и, вероятно, требует прилично логики чтобы все исключения обработать, так что реализовывать не стал.
Функция dig в sprig есть для этого. Если в качестве дефолта поставить пустое значение, то можно в if использовать.
Продвинутая Helm-шаблонизация: выжимаем максимум