Docker Compose вместо Kubernetes: когда простота выигрывает

22.04.2025 · 5 мин

Контейнеры в порту

Когда я рассказываю коллегам, что в одном из рабочих проектов мы сознательно не стали переезжать на Kubernetes и остались на Docker Compose, реакция обычно одна и та же: удивлённо поднятые брови. Постараюсь объяснить логику этого решения.

Контейнерный порт с высоты птичьего полёта

Контекст проекта

Речь о внутреннем сервисе для одной команды из шести человек: один API, одна база данных, один воркер для фоновых задач и nginx перед всем этим. Нагрузка предсказуемая, пиков нет, серьёзного масштабирования не требуется — сервис используют около двухсот сотрудников компании в рабочее время.

Что предлагал Kubernetes

На бумаге всё звучало правильно: автоматическое восстановление после падения, встроенный service discovery, декларативные манифесты, единая экосистема для будущего роста. Но каждый из этих плюсов идёт в комплекте со стоимостью — и не только денежной.

Kubernetes требует отдельной экспертизы для эксплуатации: обновления кластера, настройка RBAC, управление сетевыми политиками, мониторинг самого кластера как отдельной системы. Для команды, где нет выделенного DevOps-инженера, это означает, что кто-то из разработчиков должен взять на себя эту роль — а это время, отнятое от продуктовой разработки.

Что мы выбрали вместо этого

Один сервер, Docker Compose, systemd-юнит, который следит, чтобы docker compose up запускался при перезагрузке хоста. Обновление — через CI, который собирает образ и перезапускает контейнеры по SSH. Бэкапы базы — по расписанию в S3-совместимое хранилище. Мониторинг — Prometheus с несколькими алертами в Telegram.

Вся эта конфигурация умещается в один docker-compose.yml на полторы сотни строк, который понятен любому новому разработчику в команде за десять минут чтения.

Когда это решение перестанет работать

Я честно держу в голове границы этого подхода. Если понадобится масштабировать конкретный компонент независимо от остальных, если появится необходимость в zero-downtime деплое с несколькими репликами, или если команда вырастет настолько, что понадобится самообслуживание инфраструктуры для нескольких проектов сразу — это будет сигналом пересмотреть решение.

Но пока ни одно из этих условий не выполнено, а разница в операционной сложности между Compose и Kubernetes огромна. Выбирать инструмент нужно под задачу, которая есть сейчас, а не под задачу, которая теоретически может появиться через два года. Если появится — мигрировать с Compose на что-то более сложное всегда можно, и это не так больно, как кажется на старте.