【问题标题】:How to reference a value defined in a template in a sub-chart in helm for kubernetes?如何在 helm for kubernetes 的子图表中引用模板中定义的值?
【发布时间】:2018-05-25 06:34:05
【问题描述】:

我开始为我们的服务编写掌舵图。

有两件事我不确定它们应该如何工作或如何处理它们。

首先:发布名称。安装图表时,您指定 helm 用于创建发布的名称。此版本名称通常在图表中引用以正确隔离图表安装?例如 postgres 图表包含:

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

然后用于服务:

metadata:
  name: {{ template "postgresql.fullname" . }}

它在 kubernetes 中看起来确实像“myrelease-postgresql”。 我想知道一个好的发布名称是什么?通常用于此目的是什么?厌恶?或者像 ubuntu 版本这样的代号?

第二:引用值。

我的图表使用 postgresql 作为子图表。我不想重复创建 postgresql 服务名称的值的方式(参见上面的片段)。

有没有办法可以引用子图表的服务名称或模板定义 {{ template "postgresql.fullname" 。 }} 在父图表中?我需要它将它作为数据库主机传递到我的服务中(如果我对所有内容进行硬编码,它就可以工作,但这不是这个意思)。

我试过了:

      env:
        - name: DB_HOST
          value: {{ template "mychart.postgresql.fullname" . }}

但这会导致错误消息:

template "mychart.postgresql.fullname" not defined

我见过图表做类似事情的例子,比如odoo 图表。但是在这里复制了如何创建 postgresql 主机名的逻辑,并在模板中创建了自己的定义。

那么有没有办法访问子图表名称?还是值或模板定义?

谢谢!

挖掘后更新: 根据Subcharts and Globals,模板在图表之间共享。

所以我能做的是:

在我的 _helpers.tpl 图表中,我添加(覆盖)postgres 块:

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

所以在部署子图的时候会用到这个值。我无法在此处引用所有值或图表名称,因为它在子图表中会有所不同 - 所以我使用了全局值。

这样我就知道在子图中创建的服务的价值了。

不确定这是否是最好的方法:-/

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    您是否将postgresql 作为图表的子图表(通过图表的requirements.yaml)?如果是这样,postgresql(子)图表和您的图表都将具有 same .Release.Name - 因此,您可以将容器的环境指定为

      env:
        - name: DB_HOST
          value: {{ printf "%s-postgresql" .Release.Name }}
    

    如果您通过将以下内容添加到图表的values.yaml 来覆盖postgresql 的名称:

    postgresql:
      nameOverride: your-postgresql
    

    那么您容器的环境将是:

      env:
        - name: DB_HOST
          value: {{ printf "%s-%s" .Release.Name .Values.postgresql.nameOverride }}
    

    【讨论】:

    • 感谢您的回复!这也可行,但我对发布名称感到困惑,因为它在每个分蘖实例中都是唯一的,并且我们在同一个 kubernetes 集群中有开发、测试等,我不希望发布名称成为服务名称的一部分。因为这已经由命名空间(一个用于开发、测试等的命名空间)完成。我们的命名也很难为不复制服务本身的版本提供好的名称。对几乎所有内容使用 nameOverride 会使默认值有点可疑。我们的发布名称仅对 postgres 等常见图表有用。
    【解决方案2】:

    您可以使用父图表的值覆盖子图表的 ,如下所述: https://github.com/kubernetes/helm/blob/master/docs/chart_template_guide/subcharts_and_globals.md

    我认为覆盖子图表的模板名称是不可能的(而且也没有意义)。

    我要做的是在父图表和子图表的 .Values 文件中定义数据库服务名称,并让 helm 覆盖子图表中的那个 - 这样您将始终在父图表中拥有数据库名称。然而,这意味着数据库的服务名称不应该是{{ template "name" . }},而是类似{{ .Values.database.service.name }}

    mychart/.Values

    mysubchart:
       service:
          name: my-database
    

    mychart/templates/deployment.yaml

    env:
       - name: DB_HOST
         value: {{ .Values.mysubchart.service.name }}
    

    mychart/charts/mysubchart/.Values

    service:
       name: my-database
    

    mychart/charts/mysubchart/templates/service.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: {{ .Values.service.name }}
    

    另一种方法是使用全局图表值,在https://github.com/kubernetes/helm/blob/master/docs/chart_template_guide/subcharts_and_globals.md中也有描述

    【讨论】:

    • 感谢您的回复!但这不是正在发生的事情。子图表是来自 kubeapps 的 postgresql 图表。服务名称不是通过 values.yaml 配置的。它是基于图表名称和发布名称构建的。所以我希望由此产生的服务名称在我的图表中引用。将图表链接在一起,因为它们需要交流。我可以部分指定服务名称,但它的长度有限,因此我只想读出生成的服务名称。我认为 postgres 图表的完成方式有点像 - 这可能是错误的:/
    • 那些 github.com/kubernetes/helm/... 链接现在是 404 - 使用 helm.sh/docs/chart_template_guide/subcharts_and_globals
    【解决方案3】:

    您可以按照此处所述从子图表导入值:https://helm.sh/docs/topics/charts/#importing-child-values-via-dependencies

    但是有一个警告。这不适用于在 values.yaml 中根级别定义的值。

    有关更多信息,请参阅此问题:https://github.com/helm/helm/issues/9817

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-23
      • 2020-02-15
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2018-03-24
      相关资源
      最近更新 更多