Рубрики
Uncategorized

Ловушки на пути сине-зеленых развертываний с докером

Docker (а также Kubernetes) дает вам возможность обновить свои приложения без простоя через стратегию, называемую сине-зеленым развертыванием. Здесь мы можем видеть общую ловушку (и решение) при создании приложений на основе PHP и выполнение развертываний к сине-зеленым.

Автор оригинала: Asmir Mustafic.

Docker (а также kubernetes) предлагает вам возможность обновить свои приложения без простоя с помощью общей стратегии, называемой сине-зеленым развертыванием.

Работание сине-зеленых развертываний:

  1. Ваше развернутое в настоящее время приложение («Green») обслуживает входящий трафик.
  2. Новая версия вашего приложения развернута («синяя») и проверена, но еще не получает никакого движения.
  3. Когда «синий» готов, мы можем начать отправлять входящий трафик на «синий» тоже.
  4. На данный момент у нас есть два копии нашего приложения, работающего параллельно («зеленый» и «синий»).
  5. Теперь мы должны перестать отправлять входящий трафик на «зеленое» приложение, «синий» обрабатывает все входящие трафик.
  6. Поскольку «зеленый» больше не получают никакого движения, его можно смело удалить.
  7. «Синий» будет помечен как «зеленый», что позволяет в будущем развертывать более новую версию, используя ту же стратегию.

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»