Автор оригинала: Asmir Mustafic.
Docker (а также kubernetes) предлагает вам возможность обновить свои приложения без простоя с помощью общей стратегии, называемой сине-зеленым развертыванием.
Работание сине-зеленых развертываний:
- Ваше развернутое в настоящее время приложение («Green») обслуживает входящий трафик.
- Новая версия вашего приложения развернута («синяя») и проверена, но еще не получает никакого движения.
- Когда «синий» готов, мы можем начать отправлять входящий трафик на «синий» тоже.
- На данный момент у нас есть два копии нашего приложения, работающего параллельно («зеленый» и «синий»).
- Теперь мы должны перестать отправлять входящий трафик на «зеленое» приложение, «синий» обрабатывает все входящие трафик.
- Поскольку «зеленый» больше не получают никакого движения, его можно смело удалить.
- «Синий» будет помечен как «зеленый», что позволяет в будущем развертывать более новую версию, используя ту же стратегию.
Docker ром сине-зеленое развертывание
Если вы используете Docker Rasam, это может быть файл стека, который реализует стратегию развертывания сине-зеленых развертываний.
# app.yml version: '3.4' services: app: image: acme/todo-list:${VERSION} deploy: update_config: order: start-first
Acme/ToDo-list
это простое веб-приложение TODO-списка. update_config.order: начало - сначала
Инструменты Docker ройся до Используйте стратегию развертывания сине-зеленых развертываний.
Разверните v1
Из нашего списка TODO в кластере Docker-Myster мы можем запустить:
VERSION=v1 docker stack deploy todolist_app -c app.yml
Если мы хотим обновить приложение в V2
Мы можем запустить:
VERSION=v2 docker stack deploy todolist_app -c app.yml
Обновление будет следовать за стратегией развертывания синего зеленого развертывания, как описано ранее. Докер будет держать v1
Бег и будет развернуть V2
Отказ Когда V2
готов, он перенасматривает все трафик для V2
и удалит v1
Отказ Аккуратный!
Но если мы посмотрим на журналы нашего балансировщика нагрузки, мы можем увидеть что-то как:
1.2.3.4 - - [13/Jun/2019:06:00:10 +0000] "GET /toto/list HTTP/1.1" 502 150 ....
Код состояния — это 502
, «Плохие ворота». Этот код состояния HTTP, который означает, что балансировщик нагрузки получил недействительный ответ с сервера приложений (или нет ответа). Это почему?
Удалить v1
После остановки для отправки входящего трафика Docker отправляет SIG_TERM
Сигнал на приложение и ждет До 10 секунд для приложения для изящно прекращаются. Если v1
все еще работает через 10 секунд, докер жестоко убивает v1
приложение. Это завершится какое-либо соединение, которое приложение имело (и в ожидании запросов получат ошибку 502).
Изящная остановка
Мы можем изменить количество секунд, докер ждать, прежде чем удалить контейнер, настраивая STOP_GRACE_PERIOD
Параметр:
# app.yml version: '3.4' services: php: image: acme/todo-list:${VERSION} stop_grace_period: 120s deploy: update_config: order: start-first
С этой конфигурацией после отправки SIG_TERM
Сигнал, Докер ждет за две минуты до убийства приложения. В зависимости от конкретной логики и времени отклика вашего приложения, вы можете сказать Docker, как долго Дождитесь завершения вашего приложения, прежде чем принуждать.
Сине-зеленые развертывания и PHP-FPM
Если вы используете PHP-FPM, предыдущие конфигурации могут быть недостаточно.
К несчастью (?) PHP-FPM настроен по умолчанию для завершения сразу после получения SIG_TERM
сигнал. Даже если докер готов дождаться 10 секунд (или любое другое значение, которое вы могли бы настроить с STOP_GRACE_PERIOD
) PHP прекратит себя (и все просьбы обслуживаются) без ожидания.
Это снова приведет к 502
ошибки.
Чтобы решить это, мы должны проинструктировать также PHP, чтобы дать достаточно времени, чтобы завершить обслуживание ожидающих запросов, тюнинг process_control_timeout
Параметр (проверьте здесь Для полного списка конфигураций PHP-FPM).
Установка process_control_timeout
, PHP-FPM будет дождаться до 5 секунд до выхода и уничтожения всех процессов, которые обслуживают запросы.
Мы можем добавить этот параметр в Dockerfile
При строительстве нашего изображения PHP.
# Dockerfile FROM php:fpm # ... RUN { \ echo '[global]'; \ echo 'process_control_timeout = 5'; \ } | tee /usr/local/etc/php-fpm.conf # ...
Таким же образом, как Docker ждал контейнера, чтобы закончить свою работу, теперь PHP сделает то же самое и дождитесь до 5 секунд для своих дочерних процессов, чтобы закончить обслуживание запросов.
Таким образом, мы настроили, как долго Docker должен подождать, прежде чем завершить контейнер, а также, как долго PHP будет ждать, чтобы завершить запросы.
Если PHP способен прекратить работу менее чем за 5 секунд, это сделает это (например, когда все ожидающие запросы будут поданы быстро). То же самое относится и к доке. Таким образом, эти тайм-ауты применяются только для худшего случая.
Этот пост был впервые опубликован на https://www.goetas.com/blog/traps-on-the-way-of-blue-green-deployments/ .
Оригинал: «https://www.codementor.io/@goetas/traps-on-the-way-of-blue-green-deployments-with-docker-vxmydcy3s»