Привет, Хабр!

Довольно долгое время мы использовали в своём окружении Spinnaker. Очень удобный, правда старомодный,  инструмент, который справлялся со своими задачами. Однако чем дольше пользовались, тем больше становилось очевидно что Спиннакер малость избыточен, при этом очень прожорливый в плане потребления ресурсов, и тяжёлый в плане обслуживания и поддержки. Особенно когда перестали выходить новые версии CLI под Mac OS, и управление перешло в Докер контейнер. А уж когда после очередного обновления снова стали падать компоненты из-за нехватки памяти и отвалился SSO, пришло озарение...

Примерно такая картинка была в голове
Примерно такая картинка была в голове

Мы сели, подумали и решили: пора что-то менять. Посмотрели по сторонам в поисках альтернативы. Нам нужно было не так уж и много:

  1. Следить за ECR репозиторием.

  2. Видеть появление нового образа.

  3. Присылать сообщение в Slack с двумя кнопками - деплоить или пропустить.

  4. По нажатию кнопки деплоить новый образ в EKS.

Казалось бы, задача тривиальная. Но перебирая существующие решения, ничего простого и легковесного мы не нашли.

И тут  прозвучала та самая фраза: «А что если написать свой велосипед?».

Так родился KED — Kubernetes ECR Deployer.

Что это и зачем оно вам?

Изначально мы делали КЕДа сугубо под себя (AWS ECR + Slack). Но аппетит приходит во время еды: мы поняли, что мир не замыкается на AWS, а Slack есть не у всех(да, мы подумали и о других). Поэтому мы немного “расширили” сознание код, сделали архитектуру модульной и выложили проект в Open Source.

Теперь KED поддерживает:

  • Репозитории: ECR, DockerHub (и можно дописать свои).

  • Мессенджеры: Slack, Telegram (и можно дописать свои).

  • Деплой: через Helm.

Как это работает под капотом

Логика работы проста и прозрачна, как мы изначально и планировали:

  1. Polling: С заданной в конфиге периодичностью KED опрашивает репозиторий на наличие новых тегов.

  2. Notification: Если находится новый образ, соответствующий маске, в чат (Slack/Telegram) прилетает уведомление.

  3. Action: Сообщение интерактивное. В нем есть кнопки: «Развернуть» (Deploy) или «Пропустить» (Skip). Никакой магии консоли, просто ChatOps.

    Прилетел новый образ
    Прилетел новый образ
  4. Deployment: Если нажали «Развернуть», KED накатывает новую версию через Helm.

Начали установку в Слаке
Начали установку в Слаке
Установка завершена
Установка завершена
Решили скипнуть
Решили скипнуть
Запустили деплой в Телеге
Запустили деплой в Телеге

Фичи, за которые нам не стыдно

Мы постарались перенести лучшие практики из Spinnaker, но без его тяжеловесности:

  • Pre/Post Deploy Hooks: Как и во многих других системах, у нас можно запустить скрипты до и после установки. Нужно прогнать миграции или отправить метрику? Пожалуйста.

  • Модульность: Всё написано на Python. Если вам нужно добавить уведомления в Discord или поддержку Google Container Registry — это делается написанием одного модуля.

  • Rollbacks: Если что-то пошло не так с деплоем, или просто нужно вдруг накатить старую версию, можно вызвать бота и одной кнопкой откатиться на любую из предыдущих версий.

Где взять?

Мы выложили исходный код и инструкцию по установке на GitHub. Приглашаем потестить, потыкать палочкой и, конечно же, поругать (или похвалить) в issues.

👉 Ссылка на репозиторий

Будем рады любым замечаниям, пулл-реквестам и комментариям. Надеемся, наш «велосипед» поможет кому-то сэкономить ресурсы кластера и нервы девопсов!

И да, у КЕДа нет своей иконки. Мы генерим каждый раз новую используя следующий промт:

Create an icon for the application that deployed images from ECR to Kubernetes. The icon should depict a sneaker, the Kubernetes icon, a gear, and the word KED.