ADG Оставить заявку
Блог DevOps 4 мин чтения

Flux v1 (Weaveworks): автосинхронизация Kubernetes с git за 30 секунд

Настроили Flux для двух dev-кластеров: мерж в ветку автоматически обновляет деплойменты. Разработчики перестали просить инженеров 'накатить обновление'.

Контекст момента

Flux v1 от Weaveworks - GitOps-оператор для автоматической синхронизации Kubernetes-кластера с git-репозиторием

В феврале мы писали про ArgoCD - GitOps-контроллер с UI, ролями, проектами и прочей инфраструктурой для команды. Flux от Weaveworks - другой зверь. Никакого UI, никаких абстракций поверх Kubernetes. Просто оператор, который раз в 30 секунд смотрит в git и говорит кластеру «стань таким».

Мы поставили его на два dev-кластера в managed-проектах и выяснили, что это именно то, чего нам не хватало для разработчиков.

Проблема, которую мы решали

Схема до Flux была простая и утомительная. Разработчик собирал образ в CI, пушил в registry, потом писал в чат: «можете накатить обновление в dev?». Инженер в свободный момент бежал на машину, делал kubectl set image или helm upgrade, отвечал «готово». Разработчик проверял. Иногда образ был не тот - ошибся тегом. Иногда инженер был занят и цикл растягивался на час.

Это не трагедия, но это лишние переключения контекста с обеих сторон. В managed-среде у нас несколько проектов параллельно, и таких «накати обновление» накапливается достаточно, чтобы раздражать.

Как работает Flux

Flux - это Kubernetes-оператор. Он живёт в кластере как Deployment, читает из git-репозитория манифесты (или Helm-чарты через Helm Operator), и применяет их через стандартный Kubernetes API. Интервал опроса настраивается, мы выставили 30 секунд - это оптимум для dev.

Отдельная фича - автообновление по образу. Flux умеет следить за container registry и сам обновлять тег образа в манифесте, когда появляется новый. При этом он делает коммит обратно в git - то есть registry-тег и git остаются синхронизированы. Это немного голова кругом, когда понимаешь что оператор сам пишет в репозиторий, но логика правильная: git остаётся source of truth, а не разъезжается с фактическим состоянием кластера.

Схема для нашего случая:

CI собирает образ -> пушит в registry -> Flux видит новый тег -> обновляет манифест в git -> применяет в кластер

Разработчик смерджил PR - через 30-60 секунд новая версия в dev. Без чатиков.

Как настраивали

Установка через официальные манифесты из репозитория Weaveworks. Flux нужен доступ к git: мы добавили deploy key (публичный) в репозиторий с правами на запись - для автообновления тегов. Это слегка неудобно если репозитории разные у каждого проекта, но для dev это разовая настройка.

Конфигурация минимальная. Основное что нужно указать:

  • --git-url - адрес репозитория.
  • --git-branch - ветка которую смотреть. Мы используем dev для dev-кластеров.
  • --git-path - директория с манифестами, если они не в корне.
  • --registry-exclude-image - паттерны образов которые не надо трогать (базовые образы, sidecar-ы без версионирования).

Важный момент с автообновлением образов: по умолчанию Flux смотрит все образы во всех Deployment-ах кластера. Это может быть сюрпризом - он начнёт обновлять что угодно с новым тегом в registry. Мы явно аннотировали Deployment-ы:

annotations:
  flux.weave.works/automated: "true"
  flux.weave.works/tag.container-name: semver:~1.2

Аннотация flux.weave.works/tag позволяет задать политику - semver, glob, или regexp. Для dev мы используем glob:dev-* чтобы Flux подхватывал только образы с тегами вида dev-<короткий sha>.

Что получилось

Первые несколько дней разработчики немного нервничали - привычка писать в чат никуда не делась. Потом поняли что можно просто проверить самостоятельно: открыл сервис в браузере, увидел что версия обновилась, двинулся дальше. Несколько человек сказали что это «как деплой на Heroku, только в Kubernetes». Мы не обиделись.

На инженерной стороне: стало меньше мелких переключений. Настоящие проблемы - когда образ не собрался, или манифест невалидный - всё равно требуют вмешательства, но это редкость. Рутинные «накати dev» ушли.

Одна тонкость с которой столкнулись: если кто-то делает kubectl apply или kubectl edit руками в dev-кластере - Flux через 30 секунд это перезапишет. Для dev это нормально и даже правильно: хочешь что-то поправить - правь в git. Для staging мы автосинхронизацию не включали - там деплой только через явное одобрение.

Чем отличается от ArgoCD

Оба инструмента про GitOps, но по-разному. ArgoCD - это система с UI, состоянием приложений, ролями, проектами, ручным approve перед синхронизацией. Flux - минималистичный оператор без интерфейса, «поставил и забыл». ArgoCD лучше подходит для staging/production где нужна видимость и контроль. Flux - для dev-петли где скорость обратной связи важнее церемоний.

Мы сейчас используем оба: Flux на dev, ArgoCD смотрим для staging. Может разойдёмся по назначению, а может один победит другой - посмотрим.

Главное что поменялось: инженеры перестали быть ботами для kubectl set image. Это было несложно, но занимало больше места в голове, чем казалось.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.