有没有办法使用 helm 来模板化另一个 helm 图表的值?

Is there a way to use helm to template the values of another helm chart?

假设您需要部署一个包含很多值的 public helm chart(如 jenkins/jenkins)。我想将这些值写入多个文件,并在这些值文件中使用 go 模板。然后我想将它们组合在一起并部署它们。有没有一种方法可以编写元级 helm chart,将值创建为清单,然后根据这些值安装子 chart?

我知道 kustomize、helmfile 和子图表。我猜 none 他们只是感觉就像我想要的东西(或者我没有正确使用它们)。 Kustomize 不支持 go 模板。 Helmfile 适用于组合和选择值,但不一定对这些值文件进行模板化(或者可能是)。如果我要重复,请告诉我。

看来 helm 已经使用 values/ 子目录开发了此功能 http://www.github.com/helm/helm/pull/6876

Helmfile 至少在其 Helmfile 和单个值文件中允许 Helm 样式模板。

假设您有一些图表,它需要知道它安装在哪个集群中以用于监控目的。通常你会把它作为一个 Helm 值传递,但你希望把它写下来(并且可以编写脚本,并且能够同时将相同的配置传递到多个图表中)。在 Helmfile 中你可以这样写:

environments:
  production:
    values:
      - cluster: production.example.com
  testing:
    values:
      - cluster: testing.example.com

releases:
  - name: some-chart
    namespace: some-chart
    chart: ./charts/some-chart
    values:
      - ./charts/some-chart/values.yaml.gotmpl
      - cluster: {{ .Values.cluster }}

最后一个块应该类似于 helm install 参数,但那里有两个神奇之处。 {{ .Values.cluster }} 是一个 Go text/template 块,几乎就像您在 Helm 图表中所做的一样(确切的模板函数略有不同)。或者,如果您引用 *.gotmpl 文件,Helmfile 会在该文件上运行模板引擎,然后再将其作为输入提供给 helm。

# values.yaml.gotmpl
{{-/* enable profiling but only in testing */}}
profiling: {{ eq .Environment.Name "testing" }}

与普通的 Helm 一样,模板可能会过火。它也可能有点令人困惑,因为访问未定义的属性通常是错误而不是 nil,并且 helmfile.yaml 被渲染多次(在大多数情况下,如果您定义了每个环境的值它 必须 在每个环境中定义)。但是,这确实为您提供了一种非常通用的方法来提供每个图表设置,或者定义在不同环境中几乎但不完全相同的图表设置。