代码之家  ›  专栏  ›  技术社区  ›  moreginger

如何从具有正确上下文的子图表中调用舵手“助手”模板?

  •  25
  • moreginger  · 技术社区  · 7 年前

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

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

    当然有更好的方法使用subchart助手吗?如果可以创建上下文对象,则可以调用它,例如:

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

    遗憾的是,我不知道如何真正动态地创建这样一个上下文。如果helper函数更改为引用新属性,这仍然会中断,但方式很明显。

    或者,使用不同的方式从子图表中获取服务名称?

    5 回复  |  直到 3 年前
        1
  •  19
  •   intelfx    6 年前

    我写了一期 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 a的模板 redis 分图表):

    {{ include "call-nested" (list . "redis" "redis.fullname") }}
    
        2
  •  15
  •   Peter Mortensen Pieter Jan Bonestroo    3 年前

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

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

    {{ template "keycloak.fullname" .Subcharts.keycloak }}-http
    
        3
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    3 年前

    嗯,这不是很简单。

    我认为这里正在发生的是Helm遵循的实践,以及模板的可能性。

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

    我有一个非常相似的问题。看见 How to reference a value defined in a template in a sub-chart in helm for kubernetes? .

    我的“解决方案”是重新定义 博士后。全名 在我自己的助手中。第三方物流:

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

    由于每个tiller安装的版本名称必须是唯一的,而且我们在集群中有一个tiller,所以我在使用版本名称作为引用和自己的命名约定的一部分方面有点犹豫。

    模板中的定义是全局的。因此,如果您擅长使用默认PostgreSQL图表的发布名称前缀,您可以使用这些前缀:

    {{-定义“postgresql.fullname”-}}
    {{-$名称:=printf“%s-%s”。Values.global.appId.Values.global.fkNameId-}}
    {{-printf”%s-%s“$name”postgresql“| trunc 63 | trimSuffix”-“-}}}
    {{-结束-}}
    

    我无法想出不会重复服务名称的发布名称(“webshop服务webshop服务”),所以我倾向于不使用它们,因为我需要每个名称空间,而不是每个tiller实例。

    一旦我从子图表中定义了名称,我就会在我的服务中引用它。我对它很满意,因为我知道我引用的是什么图表,它用于命名的是什么。但事实是:如果我要升级子图表,我需要检查名称是否仍然相同。但既然“全名”很常见,我觉得我很好。有些测试无论如何都会失败。

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

    没有答案-对我来说已经足够好了:)

        4
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    3 年前

    据我所知,命名模板在全球范围内可用于所有父级和子级。然而,对于值而言,情况并非如此。子图表无法访问父值,但父图表可以访问子图表值。

    引用自 The Chart Template Developer's Guide, Declaring and using templates with define and template ...

    “在命名模板时,有一个非常重要的细节需要牢记:模板名称是全局的。如果您声明两个具有相同名称的模板,则最后加载的模板将被使用。由于子图表中的模板是与顶级模板一起编译的,所以您应该小心使用特定于图表的名称命名模板。”

    工具书类

        5
  •  0
  •   Mostafa Wael    2 年前

    要访问图表中的值,请执行以下操作:

    {{ template "keycloak.fullname" . }}
    

    从子图表访问值的步骤

    {{ template "keycloak.fullname" .Subcharts.keycloak }}
    

    请注意,这些值可以在 helper.tpl