Кратко о Helmfile
Helmfile — инструмент для централизованного менеджмента множества Helm-чартов/приложений с автоматизацией деплоя, параметризации окружений и безопасного хранения секретов.
Helmfile-инфраструктура может описываться одним конфигом и быть гибко расширяемой — любые приложения, чарты и их значения можно “подключить” декларативно, single-source-of-truth.
Ключевые возможности Helmfile, используемые в проекте
- Один центральный
helmfile.yaml— точка входа во все чарты, окружения, values, secrets, шаблоны. - IaC: структура проекта полностью декларативна, расширяется автоматически при добавлении новых релизов, окружений или параметров.
- Поддержка сторонних Helm-репозиториев: достаточно прописать репозиторий, например, bitnami, nginx или любой свой.
- Гибкая работа с values и secrets: переменные/секреты наследуются, могут переопределяться для разных слоев конфигурации (глобально, для окружения, приложения, секрета).
- Обработка множественных окружений через environments.
- Интеграция собственных чартов прямо в конфиг.
Установка
helm init --client-only || echo "probably helm3" helm plugin install https://github.com/databus23/helm-diff
helm plugin install https://github.com/rimusz/helm-tiller # default
wget -O ~/bin/helmfile https://github.com/roboll/helmfile/releases/download/v0.102.0/helmfile_linux_amd64
chmod +x ~/bin/helmfile
# brew
brew install helmfilehelmfile init --forceПример простой конфигурации
Представим, что у нас в проекте несколько чартов разных приложений
chartsbackenddatabasewebapp
helmfile.yaml
# список релизов, которые нужно будет менеджментить
releases:
- name: webapp # имя окружения
namespace: default # пространство имён
chart: ./charts/webapp # месторасположение чарта
version: "0.1.0" # версия релиза
wait: true # ожидаем установку
installed: true # требуется ли установка конкретного чарта
- name: backend
namespace: default
chart: ./charts/backend
wait: true
- name: database
namespace: default
chart: ./charts/database
wait: trueЭта команда выведет список всех чартов, которые менеджментит helmfile
helmfile listhelmfile applyhelmfile synchelmfile destroyЧерез set можно установить свои значения values
helmfile.yaml
- name: backend
namespace: default
chart: ./backend
wait: true
set:
- name: replicaCount
value: 2Чтобы посмотреть различия в чартах, которые будут сделаны из-за изменений, нужно прогнать
helmfile diffРепозитории
Мы можем подключать чарты из внешних репозиториев и сразу их применять
releases:
- name: nginx
namespace: default
chart: oci://registry-1.docker.io/bitnamicharts/nginx # link
version: "15.4.4"
wait: true
set:
- name: service.type
value: ClusterIPhelmfile.yaml
# отдельное поле со списком
repositories:
- name: prometheus-community
url: https://prometheus-community.github.io/helm-charts
releases:
- name: prom-norbac-ubuntu
namespace: prometheus
chart: prometheus-community/prometheus # name и имя чарта из репозитория
set:
- name: rbac.create
value: falseОпределение oci репозитория
repositories:
- name: ocirepo
url: registry-1.docker.io/bitnamicharts
oci: true
releases:
- name: nginx
namespace: default
chart: ocirepo/nginx
version: 15.4.4
wait: true
set:
- name: service.type
value: ClusterIPПример расширяемого конфигурирования
Импорт стороннего репозитория
Подключение внешнего каталога helm-чартов:
.helmfile / repositories.yaml
repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
Добавление релиза/чарта через external repo
Здесь chart из стороннего репозитория, а values — переопределяются для каждого окружения.
.helmfile/releases.yaml.gotmpl
releases:
- name: redis
namespace: common
chart: bitnami/redis
version: 17.4.0
installed: true
values:
- password: secretpassword
- values/redis/{{ .Environment.Name }}.yaml
Интеграция собственного Helm-чарта
Если нужно подключить свой чарт (например, charts/custom-app/):
releases:
- name: custom-app
namespace: apps
chart: ./charts/custom-app
version: 1.0.0
installed: true
values:
- values/custom-app/{{ .Environment.Name }}.yaml
Helmfile автоматически учтет любые values-файлы и secrets для этого приложения.
Организация окружений
-
Окружения описываются в
.helmfile/environments.yaml. -
Для каждого окружения заводится своя папка в
envs/:envs/ staging/ env.yaml values/ secrets/ prod/ env.yaml values/ secrets/
В env.yaml прописываются параметры окружения, в values/ — параметры для конкретного приложения, в secrets/ — зашифрованные sensitive-переменные (через SOPS).
Основные команды для управления стэком
Деплой окружения полностью
helmfile -e prod applyОбновить только конкретный релиз
helmfile -l name=redis syncРендер манифестов без деплоя
helmfile templateРабота с секретами через SOPS
helm secrets edit envs/prod/secrets/_all.yamlНовая парадигма — как Helmfile меняет подход
- Декларативность и контроль — весь стек описан в git, все изменения отслеживаются, canary/rollback интуитивен.
- Масштабируемость и расширяемость — новый чарт или окружение добавляются за минуты через файлы и шаблоны.
- Безопасность — секреты хранятся безопасно, не попадают в открытый git.
- Управление мультиокружениями — быстрое переключение между dev/staging/prod.
- Гибкость для DevOps — чарты внутри, чарты снаружи, любые конфигурации — всё по единому workflow.
TL;DR
Helmfile описывает всю инфраструктуру как код — ваши Kubernetes-приложения, параметры, secrets, зависимости, окружения, их связи и логику выкатки, всё управляется одной командой.