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