Как управлять обновлениями программного обеспечения в 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.

Другие вопросы по тегам