使用模板通过 Helm 定义子图表值

Tho*_*aux 6 elasticsearch kubernetes kubernetes-helm

用例

“我想通过使用弹性官方掌舵图来部署 elasticsearch + kibana。我想创建一个名为 data-viz 的掌舵图表,并将这些图表作为依赖项。”

运行helm install data-viz --set cluster=toto必须创建一个elasticsearch集群“toto”,以及一个配置了elasticsearchHosts=toto的kibana 。

问题

我在这里看到https://github.com/helm/helm/blob/master/docs/chart_template_guide/subcharts_and_globals.md可以从 main-chart 配置子图表values.yml。但我想从主图表 values.yaml 模板化子图表 values.yml,这可能吗?

我在想一些简单的事情:

.
??? Chart.yaml
??? charts
?   ??? elasticsearch
?   ?   ??? Chart.yaml
?   ?   ??? templates
?   ?       ??? values.yaml
?   ??? elasticsearch-7.4.0.tgz
?   ??? kibana-7.4.0.tgz
??? requirements.lock
??? requirements.yaml
??? values.yaml
Run Code Online (Sandbox Code Playgroud)

黑客解决方案

values.yamlsub-chart/values-template.yaml+ 数据创建文件的小型 Python 脚本。

Von*_*onC 6

TLDR:目前还不可能,尽管曾多次尝试添加此类功能,但都失败了,该项目的所有提交者都不愿意经历 Helm 项目成员所需的额外官僚机构。

PR 6876 “feat(helm):添加值模板以便使用 go-template 为图表及其依赖项自定义值”可能会令人感兴趣:

对于使用图表 value.yaml 模板的方法有很多请求(#2492、#2133等)。
主要原因是目前无法从模板中获取子图的值。

然而,使用模板会使values.yaml它们无法解析,并在渲染它们时产生“先有鸡还是先有蛋”的问题。

此合并请求创建了一个直观的解决方案,没有这样的问题:values/使用 呈现模板的可选目录values.yaml,然后将它们与其合并。
这些values/模板仅在特定情况下才需要,其工作方式与模板相同templates/,并且values.yaml将仍然是主要的可解析价值来源。

渲染顺序也已更改,以允许这些新值启用或禁用依赖项,并避免渲染禁用依赖项的值模板。

新的可能性:

现在可以自定义依赖项值,这在以前是完全不可能的

值/subchart.yaml

subchart:
    fullnameOverride: subchart-{{ .Relese.Name }}
    debug: {{ default "false" .Values.debug }}
Run Code Online (Sandbox Code Playgroud)

可以从值导出依赖条件

Chart.yaml

subchart:
    fullnameOverride: subchart-{{ .Relese.Name }}
    debug: {{ default "false" .Values.debug }}
Run Code Online (Sandbox Code Playgroud)

值/subchart.yaml

dependencies:
- name: subchart
  condition: subchart.enabled
Run Code Online (Sandbox Code Playgroud)

同样,PR 8580 “添加了通过以下方式将值传递到子图表的支持map.yaml”也很有趣

此 PR 允许开发人员在其图表上声明一个map.yaml文件,该文件可用于将值映射到values.yaml模板中使用的派生值,包括子图表(有关详细说明,请参阅#8576 )。

这允许开发人员编写例如

subchart:
{{- if eq .Values.environment "production" -}}
  enabled: true
{{- else -}}
  enabled: false
{{- end -}}
Run Code Online (Sandbox Code Playgroud)

值.yaml

apiVersion: v1
description: Chart with map and subcharts
name: chart-with-map
version: 0.0.1
dependencies:
  - name: backend
    version: 0.0.1
  - name: frontend
    version: 0.0.1
Run Code Online (Sandbox Code Playgroud)

地图.yaml

domain: example.com
Run Code Online (Sandbox Code Playgroud)

因此不必在values.yaml(对于子图表)中公开 backend: uri、frontend: uri,也不必要求图表用户必须在多个键中传递相同的值以保持一致性(或使用导致命名冲突的全局名称)。

即,它允许使用派生(或映射)值填充子图表,而无需将这些值暴露给values.yaml(图表的公共接口)。


正在实施/评估:

  • PR 8677:“修复:限制 Chartutil.Values 的使用以避免转换错误”
  • PR 8679:“修复:不要合并和导入禁用依赖项中的值”
  • PR 8690:“壮举:添加值模板以使用 go-template 自定义值”

但这可能需要HIP (头盔改进提案)


2021 年 2 月更新:PR 6876在此评论中确认需要正式提案。