Reputation: 22691
Use case
"I want to deploy elasticsearch + kibana, by using elastic official helm charts. I want to create a helm chart called data-viz with these charts as dependency."
Running helm install data-viz --set cluster=toto
must create an elasticsearch cluster "toto", and a kibana configured with elasticsearchHosts
= toto.
Problem
I see here https://github.com/helm/helm/blob/master/docs/chart_template_guide/subcharts_and_globals.md it's possible to configure sub-chart from main-chart values.yml
. But I would like templatize sub-chart values.yml from main-chart values.yaml, is it possible?
I was thinking to something simple as:
.
├── 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
Hack solution
A small Python script that creates the values.yaml
file from sub-chart/values-template.yaml
+ data.
Upvotes: 10
Views: 6787
Reputation: 1328712
TLDR: Not possible as of now, although there were several attempts to add such functionality that failed all of the committers to the project were unwilling to go through the additional bureaucracy required by the Helm project members.
The PR 6876 "feat(helm): Adding values templates in order to customize values with go-template, for the chart and its dependencies" could be of interest:
There have been many requests for a way to use templates for chart values.yaml (#2492, #2133, ...).
The main reason being that it's currently impossible to derive the values of the subcharts from templates.However, having templates in
values.yaml
make them unparsable and create a "chicken or the egg" problem when rendering them.This merge request creates an intuitive solution without such a problem: an optional
values/
directory which templates are rendered usingvalues.yaml
, and then merge them with it.
Thosevalues/
templates are only required for specific cases, work the same way astemplates/
templates, andvalues.yaml
will remain the main parsable source of value.The rendering order has also been changed to allow those new values to enable or disable dependencies, and to avoid rendering values templates of disabled dependencies.
New possibilities:
Can now customize dependencies values, which was previously totally impossible
subchart:
fullnameOverride: subchart-{{ .Relese.Name }}
debug: {{ default "false" .Values.debug }}
Can derive dependencies conditions from values
dependencies:
- name: subchart
condition: subchart.enabled
subchart:
{{- if eq .Values.environment "production" -}}
enabled: true
{{- else -}}
enabled: false
{{- end -}}
Similarly, PR 8580 "Added support to pass values to sub-charts via map.yaml
" is of interest
This PR allows developers to declare a
map.yaml
file on their chart, which can be used to map values invalues.yaml
to derived values that are used in templating, including sub-charts (see #8576 for the long explanation).This allows developers to write e.g.
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
domain: example.com
backend:
uri: {{ printf "https://api.%s" .Values.domain }}
frontend:
uri: {{ printf "https://app.%s" .Values.domain }}
other_uri: {{ printf "https://blabla.%s" .Values.domain }}
thereby not having to expose backend: uri, frontend: uri in values.yaml (for the subchart), nor ask chart users to have to pass the same value in multiple keys for consistency (or use global names that lead to naming collisions).
I.e. it allows subcharts to be populated with derived (or maped) values without exposing these values to values.yaml (the public interface of the chart).
This is being implemented/evaluated in:
But that will likely require an HIP (Helm Improvement Proposal).
Update Feb. 2021: PR 6876 confirms in this comment a formal proposal is needed.
Upvotes: 6
Reputation: 21
I had almost the same problem and found no appropriate solution. I only found this issue. They suggested using Lua in an upcoming helm release. But Lua is still not available with helm 3.0.
Therefore, I decided to implement a tool which is mostly helm compatible and is able to configure sub charts by a sandboxed Pythonic language.
For your problem it should be sufficient to put a Chart.star
file in the root folder (parallel to Chart.yaml
) with the following content
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
and run
shalm apply data-viz --set cluster=toto
Upvotes: 2