Как вы можете вызвать шаблон helm 'helper' из поддиаграммы с правильным контекстом?

Диаграммы Helm определяют в _helpers.tpl вспомогательные шаблоны, которые используются для создания нормализованных имен для служб. Стандартная форма шаблона для имени службы (DNS):

{{- define "postgresql.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

Если вы используете postgresql в качестве поддиаграммы, как вы должны использовать обнаружение службы на основе DNS, чтобы ссылаться на нее? Похоже, что распространенным шаблоном является копирование помощников подграфика в родительскую диаграмму.

{{- define "keycloak.postgresql.fullname" -}}
{{- $name := default "postgresql" .Values.postgresql.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

Это полное безумие по понятным причинам !!!

Наверняка есть лучший способ использовать помощник по под диаграммам? Если бы вы могли создать объект контекста, его можно было бы вызвать, например:

value: {{ template "postgresql.fullname" ({Chart: {Name: 'not-used'}, Release: {Name: .Release.Name}, Values: { nameOverride: .Values.postgresql.nameOverride}}) }}

К сожалению, я понятия не имею, как на самом деле создать такой контекст динамически. Это все равно сломается, если вспомогательная функция изменится на ссылку на новые свойства, но очевидным образом.

Или другой способ сделать доступным имя службы из поддиаграммы?


person moreginger    schedule 13.12.2017    source источник
comment
Я считаю, что эта же проблема описана в helm # 4314. Никакого решения или обходного пути там еще не упоминается.   -  person akaihola    schedule 23.08.2018
comment
Кажется, каноническая проблема - github.com/helm/helm/issues/3920. Все еще открыт на момент написания.   -  person moreginger    schedule 26.02.2019


Ответы (3)


Я написал проблему helm/helm#4535, в которой резюмируется статус-кво и предлагается усовершенствование Helm, которое позволит решить этот случай.

Для тех, кто ищет временное решение, я написал (см. мой последующий комментарий для подробностей) мета-шаблон, который вызывает любой заданный шаблон в области "эрзац-диаграммы". Он работает путем синтеза точечного объекта. Это не идеально (синтезируются не все поля), но подойдет:

{{- define "call-nested" }}
{{- $dot := index . 0 }}
{{- $subchart := index . 1 }}
{{- $template := index . 2 }}
{{- include $template (dict "Chart" (dict "Name" $subchart) "Values" (index $dot.Values $subchart) "Release" $dot.Release "Capabilities" $dot.Capabilities) }}
{{- end }}

Использование (для вызова redis.fullname шаблона redis поддиаграммы):

{{ include "call-nested" (list . "redis" "redis.fullname") }}
person intelfx    schedule 26.08.2018

Ну, это что-то, что почему-то не очень прямолинейно.

Я думаю, что здесь происходит практика, которой следует штурвал, и то, что возможно с шаблонами.

Одна из практик - «диаграммы работают из коробки», поэтому независимо от того, является ли это дополнительной диаграммой или автономной, она должна просто работать. Это имеет некоторые последствия для того, что вам нужно настроить, чтобы правильно использовать пространство имен для ресурсов, которые вы развертываете и на которые есть ссылки.

У меня была очень похожая проблема, см. Как ссылаться на значение, определенное в шаблоне, в поддиаграмме в helm для kubernetes?

Мое «решение» - переопределить postgres.fullname в моем собственном _helpers.tpl:

{{- define "postgresql.fullname" -}}
{{- $name := printf "%s-%s" .Values.global.appId .Values.global.fkNameId -}}
{{- printf "%s-%s" $name "postgresql" | trunc 63 | trimSuffix "-" -}}
{{- end -}}

Поскольку имена выпусков должны быть уникальными для каждой установки румпеля - а у нас один румпель в кластере - я как бы отошел от использования имени выпуска как части ссылок и собственного соглашения об именах.

Определения в шаблонах являются глобальными. Так что вы можете просто использовать их, если вы хорошо разбираетесь в префиксе имени выпуска, который по умолчанию используется в диаграмме postgres:

{{- define "postgresql.fullname" -}}
{{- $name := printf "%s-%s" .Values.global.appId .Values.global.fkNameId -}}
{{- printf "%s-%s" $name "postgresql" | trunc 63 | trimSuffix "-" -}}
{{- end -}}

Я не смог придумать названия выпусков, которые не дублировали бы имена сервисов («webshop-service-webshop-service»), поэтому я стараюсь не использовать их, поскольку они мне нужны для каждого пространства имен, а не для каждого экземпляра tiller.

Как только я определяю имя из поддиаграммы, я ссылаюсь на него в своих услугах. Я согласен с этим, так как знаю, на какую диаграмму ссылаюсь и что она использует для именования. Но это правда: если мне обновить поддиаграмму, мне нужно проверить, остались ли имена прежними. Но поскольку это «полное имя» довольно распространено, я думаю, что у меня все в порядке. И некоторые тесты все равно не пройдут.

Но не красивое «решение».

Не ответ - для меня достаточно :)

person wemu    schedule 08.01.2018
comment
wemu, ваши два примера идентичны. Второй должен был указать альтернативный путь? - person akaihola; 24.08.2018
comment
@akaihola, спасибо, что заметили. К сожалению, я не совсем уверен, что собирался делать. Думаю, я хотел сослаться на значение по умолчанию postgres.fullname из github.com/helm/charts/blob/master/stable/postgresql/templates/, используя имя выпуска как часть его полного имени по умолчанию - опять же, не мое собственное соглашение. - person wemu; 24.08.2018

Я очень дружелюбен к Хелму, так что могу извергать плохую практику (хотя я так не думаю). Насколько я понимаю, именованный шаблон доступен глобально для всех родительских диаграмм и вложенных диаграмм. Однако это не относится к ценностям. Родительские значения недоступны для вложенной диаграммы, но к значениям вложенной диаграммы может получить доступ родительский элемент.

Цитируется из https://docs.helm.sh/chart_template_guide/#declaring-and-using-templates-with-define-and-template ...

"При именовании шаблонов следует учитывать одну очень важную деталь: имена шаблонов являются глобальными. Если вы объявляете два шаблона с одинаковым именем, будет использоваться тот, который загружен последним. Поскольку шаблоны в поддиаграммах компилируются вместе с верхним -уровневые шаблоны, вы должны быть осторожны, чтобы дать своим шаблонам имена, специфичные для диаграммы ».

Ссылка:
https://docs.helm.sh/chart_template_guide/#named-templates https://docs.helm.sh/chart_template_guide/#subcharts-and-global-values

person Henry Dobson    schedule 12.02.2018