如何在helm的子图表中为kubernetes引用模板中定义的值?

时间:2017-12-11 17:13:31

标签: kubernetes kubernetes-helm

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

有两件事我不确定它们应该如何工作或者如何使用它们。

第一:发布名称。安装图表时,指定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主机名,并创建模板中的自定义。

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

谢谢!

经过一番挖掘后更新: 根据{{​​3}},模板在图表之间共享。

所以我能做的就是:

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

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

因此在部署子图表时使用此值。我不能在这里引用所有值或图表名称,因为它在子图表中会有所不同 - 所以我使用了全局值。

像这样,我知道在子图表中创建的服务的价值。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

postgresql:
  nameOverride: your-postgresql

然后你的容器的env将是:

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

有效吗?

答案 1 :(得分:1)

您可以使用父图表的值覆盖子图的,如下所述: 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 /模板/ deployment.yaml

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

mychart /图表/ mysubchart / .Values

service:
   name: my-database

mychart /图表/ mysubchart /模板/ 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

中描述

答案 2 :(得分:0)

您可以从子图中导入值,如下所述:https://helm.sh/docs/topics/charts/#importing-child-values-via-dependencies

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

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