Using Helm with Tilt
Tilt supports Helm out-of-the-box.
There are two ways you can use Helm charts with Tilt.
If you have a local Helm chart and want to deploy it as-is, add a
helm() call to your
helm function runs
helm template on a chart directory and returns the generated yaml.
When you make edits to the files in the chart directory, Tilt will automatically re-deploy the chart.
helm function has a few options for common arguments:
yaml = helm( 'path/to/chart/dir', # The release name, equivalent to helm --name name='release-name', # The namespace to install in, equivalent to helm --namespace namespace='my-namespace', # The values file to substitute into the chart. values=['./path/to/chart/dir/values-dev.yaml'], # Values to set from the command-line set=['service.port=1234', 'ingress.enabled=true'] ) k8s_yaml(yaml)
Sub-charts and requirements.txt
If you have chart dependencies, you need to run:
helm dep update
outside of Tilt to download the dependencies to your repo. Then create a
.tiltignore with the contents:
Or, if you want be more cautious:
When Helm runs, it touches these chart directories. Adding these lines ensures that Tilt doesn’t reload the Tiltfile every time Helm touches them.
Helm can also do more advanced templating – like downloading remote charts and injecting run-time variables.
Fortunately, Tilt has a plugin API. You can tell it how to shell out to other build and deploy tools.
The plugin API has two important functions:
local()for running local shell commands
watch_file()for telling Tilt to reload its configuration when a file changes
Let’s take a look at some common recipes for using the plugin API with Helm.
If you prefer to play with a code sample, see
To start, let’s try implementing the
helm() built-in ourselves.
k8s_yaml(local('helm template path/to/chart/dir')) watch_file('path/to/chart/dir')
helm() built-in handles some extra optimizations and edge cases, but that’s basically all it does!
Passing a single variable
Now that we know how to shell out to
helm, we can pass arbitrary flags. Let’s try using
--set to set a variable.
k8s_yaml(local('helm template --set key1=val1,key2=val2 path/to/chart/dir')) watch_file('path/to/chart/dir')
Passing a values file
If you’re passing a lot of variables, it’s usually better to put those in a values.yaml file.
k8s_yaml(local('helm template -f ./values.yaml path/to/chart/dir')) watch_file('path/to/chart/dir') watch_file('values.yaml')
Deploying a remote Helm chart
One of the advantages of Helm is that there’s a rich library of existing charts.
helm_remote extension can help you load remote charts.
load('ext://helm_remote', 'helm_remote') helm_remote('myChartName')
For more options, see the
Other Helm tools
There are other helm tools like helmfile for working with Helm charts.
We can use the same plugin commands to implement those as well. In this example, we factor out
helmfile into a helper function.
# Helper function to read K8s config YAML from helmfile. # # Currently `helmfile template` has a bug where it prints messages to stdout instead of stderr # https://github.com/roboll/helmfile/issues/551 # So we use the workaround suggested there. def helmfile(file): watch_file(file) return local("helmfile -f %s template | grep -v -e '^Decrypting .*' | grep -v -e '^Fetching .*' | grep -v 'as it is not a table.$'" % file) # Tell Tilt to apply to k8s config generated by helmfile. k8s_yaml(helmfile("k8s/staging/helmfile.yaml"))
You can try out this example yourself in this example repo.
If you have a Helm use-case that’s not covered here, we’d love to hear about it!
You can file an issue on GitHub.