如何从具有正确上下文的子图中调用helm'helper'模板?

mor*_*ger 10 go-templates kubernetes-helm

Helm图表定义了帮助程序模板,_helpers.tpl其中用于为服务创建规范化名称.服务(DNS)名称模板的标准格式为:

{{- define "postgresql.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

如果使用postgresql作为子图,您应该如何使用基于DNS的服务发现来引用它?一种常见的模式似乎是将子图助手复制到父图表中.

{{- define "keycloak.postgresql.fullname" -}}
{{- $name := default "postgresql" .Values.postgresql.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

这是完全疯狂的原因显而易见!!!

当然有更好的方法来使用子图助手?如果你可以创建一个上下文对象,那么就可以调用它,例如:

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

可悲的是,我不知道如何动态地创建这样的上下文.如果辅助函数更改为引用新属性,这仍然会中断,但显而易见.

或者,从子图中提供服务名称的另一种方法是什么?

lms*_*ant 31

https://github.com/helm/helm/pull/9957.Subcharts.[chartName] (于 2021 年 8 月 31 日合并并在 Helm 3.7 中发布)开始,您可以通过使用第二个参数来在该子图的上下文中调用子图的命名模板。

例如,假设您的 keycloak 子图表将其命名为服务,{{ template "keycloak.fullname" . }}-http 您可以从父图表中引用该服务的名称,如下所示:

{{ template "keycloak.fullname" .Subcharts.keycloak }}-http
Run Code Online (Sandbox Code Playgroud)


int*_*lfx 5

我写了一个问题helm/helm#4535,概述了现状,并提出了对Helm的改进,可以解决这种情况。

对于寻求临时解决方案的任何人,我都编写一个元模板(请参见我的后续评论以了解详细信息),该元模板调用“ ersatz”子图范围内的任何给定模板。它通过合成点对象来工作。它不是完美的(并非所有字段都是综合的),但它可以做到:

{{- 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 }}
Run Code Online (Sandbox Code Playgroud)

用法(调用子图的redis.fullname模板redis):

{{ include "call-nested" (list . "redis" "redis.fullname") }}
Run Code Online (Sandbox Code Playgroud)