Files
container.training/slides/k8s/helmfile.md
Jérôme Petazzoni 0fd5499233 🏷️ Add descriptions for Helmfile
2025-06-30 19:34:10 +02:00

3.6 KiB

Managing our stack with helmfile

  • We've installed a few things with Helm

  • And others with raw YAML manifests

  • Perhaps you've used Kustomize sometimes

  • How can we automate all this? Make it reproducible?


Requirements

  • We want something that is idempotent

    = running it 1, 2, 3 times, should only install the stack once

  • We want something that handles udpates

    = modifying / reconfiguring without restarting from scratch

  • We want something that is configurable

    = with e.g. configuration files, environment variables...

  • We want something that can handle partial removals

    = ability to remove one element without affecting the rest

  • Inspiration: Terraform, Docker Compose...


Shell scripts?

Idempotent, thanks to kubectl apply -f, helm upgrade --install

Handles updates (edit script, re-run)

Configurable

Partial removals

If we remove an element from our script, it won't be uninstalled automatically.


Umbrella chart?

Helm chart with dependencies on other charts.

Idempotent

Handles updates

Configurable (with Helm values: YAML files and --set)

Partial removals

Complex (requires to learn advanced Helm features)

Requires everything to be a Helm chart (adds (lots of) boilerplate)


Helmfile

https://github.com/helmfile/helmfile

Idempotent

Handles updates

Configurable (with values files, environment variables, and more)

Partial removals

Fairly easy to get started

🐙 Sometimes feels like summoning unspeakable powers / staring down the abyss


What helmfile can install

  • Helm charts from remote Helm repositories

  • Helm charts from remote git repositories

  • Helm charts from local directories

  • Kustomizations

  • Directories with raw YAML manifests


How helmfile works

  • Everything is defined in a main helmfile.yaml

  • That file defines:

    • repositories (remote Helm repositories)

    • releases (things to install: Charts, YAML...)

    • environments (optional: to specialize prod vs staging vs ...)

  • Helm-style values file can be loaded in enviroments

  • These values can then be used in the rest of the Helmfile

  • Examples: install essentials on a cluster, run a Bento stack


helmfile commands

  • helmfile init (optional; downloads plugins if needed)

  • helmfile apply (updates all releases that have changed)

  • helmfile sync (updates all releases even if they haven't changed)

  • helmfile destroy (guess!)


Helmfile tips

As seen in this example:

  • variables can be used to simplify the file

  • configuration values and secrets can be loaded from external sources

    (Kubernetes Secrets, Vault... See vals for details)

  • current namespace isn't exposed by default

  • there's often more than one way to do it!

    (this particular section could be improved by using Bento ${...})


🏗️ Let's build something!

  • Write a helmfile (or two) to set up today's entire stack on a brand new cluster!

  • Suggestion:

    • one helmfile for singleton, cluster components
      (All our operators: Prometheus, Grafana, KEDA, CNPG, RabbitMQ Operator)

    • one helmfile for the application stack
      (Bento, PostgreSQL cluster, RabbitMQ)

???

:EN:- Deploying with Helmfile :FR:- Déployer avec Helmfile