Как управлять обновлениями программного обеспечения в docker-compose с одной машиной для каждой пользовательской архитектуры?
Мы развертываем серверную часть Java и приложение React UI с помощью docker-compose. В наших контейнерах Docker работают Java, Caddy и Postgres.
Что необычно в этой архитектуре, так это то, что мы не запускаем приложение как кластер. Каждый пользователь получает свой сервер со своим субдоменом. Все работает нормально, но нам нужна стратегия управления / обновления машин по мере роста числа пользователей.
Мы можем мириться с простоями посреди ночи, поэтому нам не нужна высокая доступность.
Мы просто не уверены, как лучше всего обновить программное обеспечение на всех машинах. И мы новички в Docker и не имеем опыта работы с Kubernetes или Ansible, Chef, Puppet и т. Д. Но мы быстро начинаем понимать.
Мы ожидаем от сотен до тысяч пользователей. На каждой машине выполняется один и тот же код, но переменные среды уникальны для пользователя. Об этом позаботится наша исходная подготовка, поэтому мы не ожидаем, что придется менять ее с помощью обновлений программного обеспечения. Но решение, которое также может предоставить такую возможность, было бы неплохим.
Итак, вопрос в том, что, когда мы вносим изменения в код и хотим развернуть обновленную Java jar или приложение React, как лучше всего получить их в автоматическом режиме?
Некоторые вещи мы учли:
- Docker Hub (опасения по поводу ограничения скорости)
- Развертывание собственного репозитория Docker
- Kubernetes
- Ansible
- https://containrrr.dev/watchtower/
Другие вещи, которые нам, вероятно, могут понадобиться, включают действия GitHub для создания и обновления образов Docker.
Мы открыты для идей, которые здесь не перечислены, потому что мы многого не знаем об управлении множеством машин, на которых выполняется docker-compose. Пожалуйста, не стесняйтесь предлагать свои предложения. Большое спасибо!
2 ответа
В вашем случае я советую вам использовать комбинацию Kubernetes с инструментами CD. Один из них - Бадди. Я считаю, что это лучший способ делать такие обновления в автоматическом режиме. Конечно, вы можете использовать только Kubernetes, но с помощью Buddy или других инструментов для компакт-дисков вы сделаете это быстрее и проще. В своем ответе я описываю Buddy, но есть много популярных CD-инструментов для автоматизации рабочих процессов в Kubernetes, например, GitLab или CodeFresh.io - вы должны выбрать, какой из них вам больше всего подходит. Взгляните: CD-автоматизация-инструменты-Kubernetes.
С помощью Buddy вы можете избежать большинства этих шагов при автоматизации обновлений - (выполнение
kubectl apply,
kubectl set image
commands), просто отправив Git.
Каждый раз, когда вы обновляете код приложения или конфигурацию Kubernetes, у вас есть две возможности обновить кластер:
kubectl apply
или же
kubectl set image
.
Чаще всего такой рабочий процесс выглядит так:
1. Отредактируйте код приложения или файл конфигурации.YML.
2. Отправьте изменения в репозиторий Git.
3. Создайте новый образ Docker.
4. Вставьте образ Docker.
5. Войдите в свой кластер K8s.
6. Беги
kubectl apply
или же
kubectl set image
команды для применения изменений в кластере K8s
Buddy - это инструмент для компакт-дисков, который вы можете использовать для автоматизации всех рабочих процессов выпуска K8s, например:
- управление обновлениями Dockerfile
- создание образов Docker и отправка их в реестр Docker
- применение новых изображений в кластере K8s
- управление изменениями конфигурации развертывания K8s и т. д.
С Buddy вам нужно будет настроить только один конвейер.
При каждом изменении кода приложения или файла конфигурации YAML этот инструмент будет применять развертывание, и Kubernetes начнет преобразовывать контейнеры в желаемое состояние.
Конфигурация конвейера для запуска подов или заданий KubernetesПредположим, что у нас есть приложение в кластере K8s, и его репозиторий содержит:
- исходный код нашего приложения
- Dockerfile с инструкциями по созданию образа вашего приложения
- Скрипты миграции БД
- файл Docker с инструкциями по созданию образа, который будет запускать миграцию во время развертывания (средство запуска миграции db)
В этом случае мы можем настроить конвейер, который будет:
1. Создайте приложение и перенесите изображения.
2. Отправьте их в Docker Hub.
3. Запустите миграцию БД, используя ранее созданный образ. Мы можем определить изображение, команды и развертывание и использовать файл YAML.
4. Используйте либо "Применить развертывание K8s", либо "Установить образ K8s", чтобы обновить образ в приложении K8s.
Вы можете правильно настроить описанный выше рабочий процесс в соответствии со свойствами вашей среды / приложений.
Buddy поддерживает GitLab в качестве поставщика Git. Интеграция этих двух инструментов проста и требует только авторизации GitLab в вашем профиле. Благодаря этой интеграции вы можете создавать конвейеры, которые будут создавать, тестировать и развертывать код вашего приложения на сервере. Но, конечно, если вы используете GitLab, нет необходимости настраивать Buddy в качестве дополнительного инструмента, потому что GitLab также является инструментом CD-инструментов для автоматизации рабочих процессов в Kubernetes. Более подробную информацию вы можете найти здесь: buddy-workflow-kubernetes.
Читайте также: автоматизация-рабочие процессы-кубернетес.
Как оказалось, мы обнаружили, что платный план Docker Hub отвечает всем нашим потребностям. Я ценю отличную информацию от @Malgorzata.