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

问题描述 投票:9回答:3

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}}) }}

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

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

go-templates kubernetes-helm
3个回答
5
投票

我写了一个问题helm/helm#4535,总结了现状,并提出了一个增强Helm,将解决这个案例。

对于任何寻找临时解决方案的人,我写了一个元模板(参见my follow-up comment的详细信息),该模板在“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 }}

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

{{ include "call-nested" (list . "redis" "redis.fullname") }}

1
投票

嗯,这是某种方式不是很直接。

我认为这里发生的是helm遵循的做法以及模板的可能性。

一种做法是“图表开箱即用” - 所以无论是子图还是独立图,它都应该起作用。这会对您需要配置以正确命名您部署的资源和引用的资源产生一些影响。

我有一个非常相似的问题,请参阅How to reference a value defined in a template in a sub-chart in helm for kubernetes?

我的“解决方案”是在我自己的_helpers.tpl中重新定义postgres.fullname:

{{- 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实例。

一旦我从子图表中定义名称,我就在我的服务中引用它。我很好,因为我知道我引用了什么图表以及它用于命名的内容。但它是真的:我应该升级子图表,我需要检查名称是否仍然相同。但由于这个“全名”很常见,我觉得我很好。而且一些测试无论如何都会失败。

但不是一个美丽的“解决方案”。

不是答案 - 对我来说足够好:)


0
投票

我对Helm非常环保,所以我可以喷出不好的做法(虽然我不这么认为)。据我所知,命名模板可全局提供给所有父级和子级。然而,对于价值观而言,情况并非如此。子图不能访问父值,但父级可以访问子图值。

来自qazxsw poi的行情......

“在命名模板时要记住一个非常重要的细节:模板名称是全局的。如果你声明两个具有相同名称的模板,那么最后加载的那个将是使用的模板。因为子图中的模板是与顶部一起编译的在级别模板中,您应该注意使用特定于图表的名称命名模板。“

参考: https://docs.helm.sh/chart_template_guide/#declaring-and-using-templates-with-define-and-template https://docs.helm.sh/chart_template_guide/#named-templates

© www.soinside.com 2019 - 2024. All rights reserved.