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

时间:2019-10-10 09:48:01

标签: 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可以从主图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

完美解决方案

一个小的Python脚本,可以根据values.yaml和数据创建sub-chart/values-template.yaml文件。

2 个答案:

答案 0 :(得分:3)

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

对于使用图表值模板的方法有很多要求。yaml(#2492,#2133,...)。
主要原因是目前无法从模板导出子图的值。

但是,values.yaml中的模板使它们变得不可解析,并在渲染它们时产生了“鸡还是蛋”的问题。

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

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

新的可能性:

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

values / subchart.yaml

subchart:
    fullnameOverride: subchart-{{ .Relese.Name }}
    debug: {{ default "false" .Values.debug }}

可以从值导出依赖条件

Chart.yaml

dependencies:
- name: subchart
  condition: subchart.enabled

values / subchart.yaml

subchart:
{{- if eq .Values.environment "production" -}}
  enabled: true
{{- else -}}
  enabled: false
{{- end -}}

同样,PR 8580“增加了对通过map.yaml将值传递到子图表的支持”

此PR允许开发人员在其图表上声明map.yaml文件,该文件可用于将values.yaml中的值映射到用于模板的派生值,包括子图(请参阅{{ 3}}进行详细说明。

这使开发人员可以编写例如

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

values.yaml

domain: example.com

map.yaml

backend:
  uri: {{ printf "https://api.%s" .Values.domain }}

frontend:
  uri: {{ printf "https://app.%s" .Values.domain }}

other_uri: {{ printf "https://blabla.%s" .Values.domain }}

从而不必在values.yaml中(对于子图表)公开后端:uri,前端:uri,也无需要求图表用户必须在多个键中传递相同的值以保持一致性(或使用导致命名的全局名称)碰撞)。

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


正在以下位置实施/评估:

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

但是PR 8690will likely require

答案 1 :(得分:1)

我遇到了几乎相同的问题,没有找到合适的解决方案。我只找到this issue。他们建议在即将发布的头盔版本中使用Lua。但是Lua在头盔3.0中仍然不可用。

因此,我决定实现一个tool,它主要与头盔兼容,并且能够通过沙盒Python语言来配置子图表。

对于您的问题,将具有以下内容的Chart.star文件放在根文件夹(与Chart.yaml平行)中就足够了

def init(self, cluster="clustername"):
  self.elastic = chart("charts/elasticsearch-7.4.0.tgz")
  self.kibana = chart("charts/kibana-7.4.0.tgz")
  self.elastic.cluster  = cluster  # Please use the right name here (from elastic../values.yaml
  self.kibana.elasticsearchHosts = cluster

然后运行

shalm apply data-viz --set cluster=toto