Идеальный целевой сценарий
Да, вы должны использовать балансировщик нагрузки и обновлять по одному экземпляру за раз. Я не уверен, в чем заключается связь между контейнерами.
В качестве примера представьте, что у вас есть балансировщик нагрузки, который обслуживает ваш сайт A. Пользователи подключаются к нему только как и знают его только как "A". Балансировщик нагрузки знает, что существует два или более бэкендов (B, C и т.д.), И не имеет значения, являются ли они виртуальными машинами или контейнерами.
Затем вы хотите обновить серверные части, которые в данном случае являются экземплярами Apache.
- удалите B из подходящих бэкендов для балансировщика нагрузки, чтобы он больше не принимал никакого трафика.
- дождитесь обслуживания текущих запросов и закрытия существующих подключений.
- обновите контейнер или базовую виртуальную машину, которая обслуживает B
- перезапустите B, дождитесь его загрузки и начните работать
- протестируйте B, чтобы убедиться, что он правильно обслуживает новые запросы
- добавьте B обратно в серверный пул балансировщика нагрузки, чтобы повторно включить трафик
Затем выполните тот же процесс для C, D и т.д.
Обратите внимание, что есть открытый запрос на обновление контейнеров Docker на месте, с ноября 2013 года, но, похоже, особого прогресса в этом нет, поэтому приведенное выше решение - это то, что вы должны сделать в то же время.
Что нужно сделать для существующего живого сайта
Предположительно, вы спрашиваете об этом, потому что у вас уже есть действующий сайт в этой модели, и вы хотели бы обновить его без простоев. Итак, нам нужно достичь идеального целевого состояния, описанного выше, но постепенно.
Давайте предположим, что:
- у вас есть DNS-имя, указывающее на ваш контейнер
- ваш контейнер работает на каком-то IP-адресе
- ваши пользователи не знают IP-адрес контейнера, и он нигде не задан жестко
Если эти предположения ложны, вы должны сначала исправить это так, чтобы это было правильно.
Затем выполните следующие действия:
- создайте балансировщик нагрузки на новом IP-адресе и направьте его на существующий контейнер в качестве его единственного серверного
- измените DNS, чтобы он указывал непосредственно на балансировщик нагрузки, а не на IP-адрес контейнера
- добавьте идентичный серверный сервер Apache с той же настройкой виртуальной машины + контейнера
- теперь у вас есть балансировщик нагрузки с двумя бэкендами B и C, поэтому следуйте инструкциям в разделе "идеальный целевой сценарий", чтобы обновлять их по одному
Как обновить балансировщик нагрузки
Простой (размещенный) способ
Самый простой вариант - не запускать свой собственный балансировщик. Например, если вы используете облачную платформу, которая обеспечивает балансировку нагрузки в качестве службы, рассмотрите возможность ее использования, и тогда обслуживание и обновление балансировщика нагрузки не будут проблемой.
Ручной способ
Если вы используете свой собственный балансировщик нагрузки, поможет добавление еще одного уровня косвенности (например, DNS). Давайте предположим следующее:
- что у нас есть имя хоста, соответствующее IP-адресу нашего балансировщика нагрузки A, которое мы хотели бы обновить
- наш балансировщик нагрузки имеет серверный пул P1, P2 и т.д.
Мы действуем следующим образом:
и с тобой покончено.
Детали, схемы и инструменты
Ознакомьтесь с этими описаниями и инструментами, которые могут помочь вам автоматизировать процесс, но общая идея та же:
Моральный
"Все проблемы в информатике могут быть решены с помощью другого уровня косвенности, за исключением, конечно, проблемы слишком большого количества косвенных ссылок". — Дэвид Уилер