Динамическая балансировка нагрузки Docker с Nginx

Я делаю стажировку, ориентированную на Docker, и мне приходится балансировать нагрузку на приложение, в котором есть клиент, сервер и база данных. Я использую Nginx в качестве балансировщика нагрузки, и моя цель - динамически масштабировать количество серверных контейнеров в соответствии с их загрузкой ЦП. Например, если загрузка процессора превышает 60%, я хочу добавить новый контейнер на лету, не перезапуская Nginx, чтобы разделить загрузку процессора. Мне нужно изменить файл nginx.conf, чтобы добавить новый контейнер, но я должен перезапустить контейнер Nginx, чтобы применить изменения, что очень медленно.

Поэтому мой вопрос: есть ли (бесплатный) способ сделать это динамически?

Скажите мне, если вы хотите получить дополнительную информацию и простите мой плохой английский. Благодарю.

РЕДАКТИРОВАТЬ: я сделал, как @Konstantin Азизов сказал мне:

docker cp ./new.conf $(docker ps -f "name=dockerizedrubis_nginx" -q ):/etc/nginx/nginx.conf
docker exec $(docker ps -f "name=dockerizedrubis_nginx" -q) bash -c 'kill -HUP $(cat /run/nginx.pid)'
docker exec $(docker ps -f "name=dockerizedrubis_nginx" -q) bash -c '/etc/init.d/nginx reload'

Файл конфигурации хорошо вставлен в контейнер, поддерживающий Nginx, я посылаю сигнал HUP, чтобы перенастроить процесс Nginx, и затем перезагружаюсь, чтобы применить мои изменения. Ошибок нет, перезагрузка на лету работает нормально, но мои новые узлы не учитываются Nginx, запросы по-прежнему направлены только на первый созданный узел...

РЕДАКТИРОВАТЬ 2: Я нашел источник проблемы. Похоже, что для обновления /etc/hosts контейнера после 'docker-compose scale' этот контейнер необходимо остановить, удалить и перезапустить. В моем случае я действительно не хочу останавливать контейнер, поддерживающий Nginx.

Вопрос: Кто-нибудь имеет представление о том, как обновить /etc/hosts контейнера после перемасштабирования без перезапуска контейнера (кроме грязного скрипта)?

Благодарю.

2 ответа

Решение

Некоторое время я использовал образ прокси-сервера nginx из Json Wilder для балансировки нагрузки между контейнерами, и он работает для нескольких масштабируемых служб. Он отслеживает демон docker и, если происходит событие, он перестраивает конфигурационный файл nginx, добавляя новые экземпляры контейнера при масштабировании или удаляя его при масштабировании.

Начиная с Docker 1.10 (не уверен, что это правильная версия), в демон Docker встроен внутренний DNS, поэтому с тех пор я использую функцию циклического перебора. Теперь я использую официальное изображение nginx, чтобы прокси-сервер передавал запросы домену, который я определил как псевдоним в сетевых опциях. Я не знаю, был ли я ясен из-за моего плохого английского, но я верю, что мой пример с Github может помочь.

К сожалению, не существует простого (бесплатного) способа изменить конфигурацию без перезапуска, единственный способ добиться масштабирования без простоев - это изящный перезапуск, при изящном перезапуске Nginx он будет порождать новый экземпляр с новой конфигурацией, ждать, пока он загрузится, а затем убить старую экземпляр с предыдущей конфигурацией.

Смотрите официальное руководство.

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