DEV Community

Cover image for Helmfile : Deploy multiple charts in your cluster k8S
Javid Mougamadou
Javid Mougamadou

Posted on

Helmfile : Deploy multiple charts in your cluster k8S

Prerequisites

  • Cluster K8S

  • Helmfile

  • Docker (helmfile image container, optional)

Concepts

Alt Text

Helmfile allows to declare specification for deploying multiple Helm charts. All information is saved in the helmfile.yaml file.

Here is the advantages of using Helmfile :

  • Keep a directory of chart value files and maintain changes in version control.

  • Apply CI/CD to configuration changes.

  • Environmental chart promotion.

  • Periodically sync to avoid skew in environments.

Installation

docker run --rm --net=host -v "${HOME}/.kube:/root/.kube" -v "${HOME}/.config/helm:/root/.config/helm" -v "${PWD}:/data" --workdir /data quay.io/roboll/helmfile:helm3-v0.135.0 helmfile 
Enter fullscreen mode Exit fullscreen mode
  • Use a docker container (cablespaghetti/helmfile-docker) :
docker run --rm --net=host -v "${HOME}/.kube:/root/.kube" -v "${HOME}/.config/helm:/root/.config/helm" -v "${PWD}:/data" --workdir /data cablespaghetti/helmfile-docker helmfile 
Enter fullscreen mode Exit fullscreen mode

Getting Started

Suppose the helmfile.yaml representing the desired state of your helm releases looks like:

releases:
- name: prom-norbac-ubuntu
  namespace: prometheus
  chart: stable/prometheus
  set:
  - name: rbac.create
    value: false
Enter fullscreen mode Exit fullscreen mode

Sync your Kubernetes cluster state to the desired one by running:

# Sync all your chart releases
helmfile sync

# OR
# Apply all your chart releases
helmfile apply

# OR
# Sync all your chart releases (offline)
helmfile charts
Enter fullscreen mode Exit fullscreen mode

Advanced Usage

Multiple values (for multiple environments)

Dev Environment

# helmfile-dev.yaml
repositories:
  - name: bitnami
    url: https://charts.bitnami.com/bitnami

releases:
  - name: my-postgres
    namespace: my-namespace-dev
    chart: bitnami/postgres
    values:
      - ./values/postgres-dev-1.yaml
      - ./values/postgres-dev-2.yaml
Enter fullscreen mode Exit fullscreen mode
# Sync all your chart releases
helmfile -f helmfile-dev.yaml sync
Enter fullscreen mode Exit fullscreen mode

Prod Environment

# helmfile-prod.yaml
repositories:
  - name: bitnami
    url: https://charts.bitnami.com/bitnami

releases:
  - name: my-postgres
    namespace: my-namespace-production
    chart: bitnami/postgres
    values:
      - ./values/postgres-prod-1.yaml
      - ./values/postgres-prod-2.yaml
Enter fullscreen mode Exit fullscreen mode
# Sync all your chart releases
helmfile -f helmfile-prod.yaml sync
Enter fullscreen mode Exit fullscreen mode

Environment Variables

# helmfile-prod.yaml
repositories:
  - name: bitnami
    url: https://charts.bitnami.com/bitnami

releases:
  - name: {{ requiredEnv "NAME" }}-postgres
    namespace: {{ requiredEnv "NAME" }}
    chart: bitnami/postgres
    set:
    - name: image
      value: {{ requiredEnv "DOCKER_IMAGE" }}
    - name: version
      value: {{ requiredEnv "VERSION" }}
    values:
      - ./values/postgres-prod.yaml
Enter fullscreen mode Exit fullscreen mode
# Sync all your chart releases
NAME=my-project VERSION=1 DOCKER_IMAGE=postgres:latest helmfile -f helmfile-prod.yaml sync
Enter fullscreen mode Exit fullscreen mode

Templates

# helmfile.yaml
releases:
  - name: {{ requiredEnv "NAME" }}-vault
    namespace: {{ requiredEnv "NAME" }}
    chart: roboll/vault-secret-manager
    values:
    - values.yaml.gotmpl
Enter fullscreen mode Exit fullscreen mode
# values.yaml.gotmpl
db:
  username: {{ requiredEnv "DB_USERNAME" }}
  password: {{ requiredEnv "DB_PASSWORD" }}
proxy:
  domain: {{ requiredEnv "PLATFORM_ID" }}.my-domain.com
  scheme: {{ env "SCHEME" | default "https" }}
Enter fullscreen mode Exit fullscreen mode

Environement Files

# helmfile.yaml
environments:
  production:
    values:
    - production.yaml

releases:
- name: myapp
  values:
  - values.yaml.gotmpl
Enter fullscreen mode Exit fullscreen mode
# production.yaml
domain: prod.example.com
releaseName: prod
Enter fullscreen mode Exit fullscreen mode
# values.yaml.gotmpl
domain: {{ .Values | get "domain" "dev.example.com" }}
Enter fullscreen mode Exit fullscreen mode

Secrets

# helmfile.yaml
environments:
  production:
    secrets:
    - environments/production/secrets.yaml

releases:
- name: myapp
  chart: mychart
  values:
  - values.yaml.gotmpl
Enter fullscreen mode Exit fullscreen mode
# environments/production/secrets.yaml
foo.bar: "mysupersecretstring"
Enter fullscreen mode Exit fullscreen mode

The value can be used in your values.yaml.gotmpl like :

{{ .Values.foo.bar }}
Enter fullscreen mode Exit fullscreen mode

Examples

repositories:
  - name: bitnami
    url: https://charts.bitnami.com/bitnami

releases:
  - name: my-nginx
    namespace: my-namespace-production
    chart: bitnami/nginx
    values:
      - ./values/nginx-production.yaml
  - name: my-postgres
    namespace: my-namespace-production
    chart: bitnami/postgres
    values:
      - ./values/postgres-production.yaml
Enter fullscreen mode Exit fullscreen mode

Links

https://github.com/roboll/helmfile

https://github.com/roboll/helmfile/tree/master/examples

https://lyz-code.github.io/blue-book/devops/helmfile/#:~:text=Helmfile%20is%20a%20declarative%20spec,Environmental%20chart%20promotion.

https://github.com/wkrzywiec/k8s-helm-helmfile

https://hub.docker.com/r/cablespaghetti/helmfile-docker

https://alexsimonjones.medium.com/helmfile-post-v3-helm-519c82a29c6a

Top comments (0)