Публикация

Nginx. Балансировка нагрузки в Docker

Довольно часто разрабатывая веб-сервисы мне приходится подымать их в Docker и тестировать нагрузку для поиска слабого места и тут пригодится понимание как сделать балансировку на N контейнеров вашего сервиса.

Задача

Допустим что у нас уже есть наш веб-сервис запакованный в Docker image и теперь нам нужно поднять N контейнеров чтобы протестировать например нагрузку на конкретное место/endpoint нашего сервиса и выявить слабое место.

Для этого нам будет нужен Docker и docker-compose файл, где мы используя Nginx подымем Load Balancer который будет равномерно распределять нагрузку на наши контейнеры.

Подготовка

Создаем docker-compose.yml файл со следующим содержимым:

version: "3.7"

services:
  web-service1:
    image: my-web-service:1.0.1
    ports:
      - 3000
    networks:
      - "lb-network"
  web-service2:
    image: my-web-service:1.0.1
    ports:
      - 3000
    networks:
      - "lb_network"
  
  nginx-server:
    image: nginx:1.19
    container_name: nginx-server
    ports:
      - "8080:80"
    volumes:
      - './nginx.conf:/etc/nginx/nginx.conf'
    networks:
      - "lb_network"
    depends_on:
      - web-service1
      - web-service2

networks:
  lb_network:

Хочу немного разъяснить некоторые моменты:

  • web-serviceN - это имя сервиса, именно оно будет использоваться во внутренней сети docker для доступа нашего балансировщика нагрузки.
  • networks - каждый сервис имеет имя сети в которой он будет виден другим сервисам в том числе и nginx.
  • nginx-server - тут мы создаем контейнер Nginx сервера, на который будет приходить весь трафик и уже в созданной нам сети будет распределять этот трафик между существующими сервисами.
  • depends_on - указывает на то, что сервер Nginx должен подняться только после успешного старта всех сервисов описанных тут.
  • volumes - в описании nginx-server сервиса, говорит о необходимости взять файл nginx.conf и покласть его внутри контейнера по пути /etc/nginx/nginx.conf. Сам файл мы создадим ниже. Именно этот файл описывает как будет происходить балансировка.

Теперь создадим nginx.conf файл:

events { worker_connections 4000; }

http {
    upstream app {
        server nginx-server1_1:3000;
        server nginx-server2_1:3000;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://app;
        }
    }
}

Тут в http → upstream мы указываем любое имя для нашего подмножества серверов, которые и есть наши сервисы, а точнее имя контейнера в Docker.

В случае если что-то не работает, то перепроверьте как называются контейнеры в Docker и совпадают ли имена с именами в этом файле.

Также, важно чтобы docker-compose.yml и nginx.conf были в одной директории.

Запускаем

Для запуска нам необходимо в консоли/терминале зайти в директорию содержащую файлы, которые мы создали выше и выполнить следующую команду:

docker-compose up

Или же мы можем не дублировать наш сервис в docker-compose.yml, а выполнить следующую команду после которой автоматически указанный нами сервис подымется N количество раз:

docker-compose up --scale web-service=N

Надеюсь этот материл будет также полезен вам как и мне!

Опубликовано: 15 июля 2021 г.Просмотров: 69

Комментарии

Мы не даем слово анониму 😶
Войдите, пожалуйста.

Еще никто не комментировал эту публикацию 🤔