Балансировка нагрузки с помощью Docker Swarm

Я настроил рой докеров из двух узлов с управляющим узлом pi-manager и рабочим узлом pi-worker в стеке из 2 Raspberry Pi 3 Model 3 B с Raspbian. Я создал образ, который запускает веб-страницу типа helloworld на локальном хосте, который также идентифицирует контейнер, на котором работает страница. Пример:

пример веб-страницы с изображением докера

Из ноды менеджера докеров я могу создать сервис «flairhello», а затем масштабировать его до 2-х континеров (назовем их A и B).

Ожидаемое поведение:

Поведение, которое я ожидал получить, заключалось в том, что при посещении каждого локального хоста я получал веб-страницу с идентификатором контейнера, работающим на этом хосте. Например, если pi-manager имеет контейнер A, а pi-worker имеет контейнер B. Когда я посещаю локальный адрес pi-manager, я ожидаю увидеть идентификатор контейнера A, а когда я посещаю локальный адрес pi-worker, я ожидаю увидеть идентификатор контейнера B. Это НЕ то, что происходит.

Текущее поведение:

Поведение, которое я испытываю, заключается в том, что в течение некоторого времени, если я захожу на локальный хост pi-manager или pi-worker, я перенаправляюсь на веб-страницу контейнера A, а затем в течение следующего периода времени независимо от того, какой локальный хост (pi-manager или pi-worker) я посещаю. меня всегда направляют в Контейнер B. Я предполагаю, что это встроенная балансировка нагрузки роя Docker?

Вопросы:

Как я могу использовать балансировщик нагрузки, чтобы получить желаемое поведение от моего роя?

Какие инструменты я должен использовать? Докер сочиняет? Хапрокси образ? (видели эти упоминания из чтения на этом?

Есть ли хорошие учебники для этого процесса?


ОБНОВИТЬ:

Шаги по созданию балансировщика сетевой нагрузки с HAProxy в моем ответе ниже!


person ob1    schedule 27.07.2017    source источник


Ответы (2)


Да, это правильно. Рой Docker имеет сетку маршрутизации роя https://docs.docker.com/engine/swarm/ingress/, и это не привязано (ipvs) к дизайну. Если вам нравится быть липким, вы должны развернуть в своем стеке балансировщик нагрузки, который поддерживает фиксацию сеанса, например Traefik (https://traefik.io/).

Но вы также можете использовать Nginx, например, как мы. -> https://github.com/n0r1sk/border-controller. Но это более изощренно.

person m4r10k    schedule 27.07.2017
comment
Я разрабатываю этот проект как своего рода пример для отображения балансировки нагрузки, чтобы при переходе на главную страницу трафик перенаправлялся на эти два разных контейнера, работающих на pi-manager и pi-worker. Поэтому, если вы обновите страницу, адрес контейнера будет другим, и вы можете проиллюстрировать функцию балансировки нагрузки. Возможно ли это с Nginx или HaProxy? Спасибо за ваш пример, я вижу, что это липкое соединение. Как именно оно работает? - person ob1; 27.07.2017
comment
Как вы думаете, я могу преобразовать этот файл докера для работы с архитектурой ARM? - person ob1; 27.07.2017
comment
Если в контейнере нет работающей веб-службы, буду ли я по-прежнему перенаправлен на узел с работающей службой? - person ob1; 27.07.2017

Спасибо @kleinsasserm за то, что указал мне правильное направление, я нашел решение своей проблемы! Я создал балансировщик нагрузки, используя базовый образ докера HAProxy и его алгоритм балансировки нагрузки Round Robin, чтобы создать веб-страницу hello world, которая будет отображать контейнер, в котором он находится, чередуя контейнер при каждом обновлении! Это лабораторный проект, используемый для демонстрации балансировки нагрузки с помощью Docker.

Шаги для этого решения:

Чтобы установить и настроить этот балансировщик нагрузки, я сделал следующее:

  1. Созданный образ HAProxy Docker

    • Создайте каталог для вашего изображения

      $ mkdir haproxyImage
      $ cd hapoxyImage
      
    • Создайте файл докера со следующим содержимым

      FROM haproxy:1.7
      COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
      
    • Создайте свой haproxy.cfg файл

      global
          daemon                       
          log 127.0.0.1 local0 notice 
          maxconn 256                 
      
      
      defaults
          log     global
          mode    http
          option  httplog
          option  dontlognull
          retries 3
          option redispatch
          timeout connect  5000
          timeout client  10000
          timeout server  10000
      
      listen stats
          bind 0.0.0.0:80 # This is the page you will access
          mode http
          stats enable
          stats uri /haproxy?stats
          stats realm Strictly\ Private
          stats auth A_Username:user
          stats auth Another_User:password
          balance roundrobin # Defines our balancing algorithm as round robin.
          option httpclose
          option forwardfor
          server pi-manager <ip address>:8080 check # Docker node
          server pi-worker1 <ip address>:8080 check # Docker node
          # Add more docker nodes here
      
    • Создайте свой образ Docker

      $ docker build -t swarm-haproxy .
      
  2. Запустите службу Docker Swarm:

    $ docker service create -p 8080:80 --name helloworld --replicas 10 <image name>
    
  3. Запустите образ HAProxy Я запускаю это на компьютере, а не на стеке pi

    $ docker run -d -p 80:80 swarm-haproxy
    
  4. На компьютере, на котором запущен образ HAproxy, перейдите по адресу http://0.0.0.0, обновите страницу, чтобы отобразить различные контейнеры, на которых работает тот же сервис


    Ссылки:

person ob1    schedule 27.07.2017