Рейтинг:2

Какой алгоритм маршрутизации использует Docker Mesh?

флаг vu

Мы хотим знать, какой алгоритм использует сетка Docker для маршрутизации запросов к контейнерам. Вот почему:

Мы развертываем наши приложения на самостоятельных роях докеров. Мы используем сетку маршрутизации докеров для направления трафика на отдельные узлы, например:

  • Интернет ->
  • брандмауэр ->
  • директор загрузки (nginx) ->
  • nginx «наименьшее соединение» маршрутизируется к трем менеджерам роя ->
  • сетка докера ->
  • Любой из шести контейнеров приложений, работающих на трех разных док-узлах, не являющихся менеджерами.

Наши разработчики подозревают, что сетка Docker использует циклический алгоритм маршрутизации трафика, что может привести к тому, что некоторые контейнеры приложений будут перегружены медленными запросами, в то время как другие контейнеры будут использоваться недостаточно. Если разработчики правы, мы не должны использовать сетку докеров, а вместо этого должны использовать директор загрузки для направления трафика в отдельные контейнеры с использованием более умного алгоритма, чем циклический перебор.

С другой стороны, если сетка докера отслеживает, сколько запросов поступает к каждому контейнеру, и доставляет трафик в контейнер с наименьшим количеством запросов, то нам не нужно выполнять работу по обходу сетки докера.

Вопрос

Какой алгоритм использует сетка докеров для направления трафика в доступные контейнеры? Это простой цикл?

Наш конфиг nginx

Наш nginx получает трафик из Интернета и проксирует его в сетку докеров на любом из трех узлов диспетчера докеров:

вышестоящий document_service {
  наименьшее_соединение;
  сервер dockermgr1.nosuchdomain:8402;
  сервер dockermgr2.nosuchdomain:8402;
  сервер dockermgr3.nosuchdomain:8402;
}

сервер {
...
        proxy_pass http://document_service;

Наша конфигурация для создания докеров

Файл docker-compose настраивает службу на наличие шести реплик на трех узлах Docker runner:

версия: "3.4"

Сервисы:
  документыобслуживание:
    изображение: ${IMAGE_LOCATION}documents_service/documentsservice:prod-${COMPOSE_BUILD_TAG:-latest}
    container_name: служба документов
    порты:
      - "8402:80"
    ...
    развертывать:
      реплики: 6
      размещение:
        ограничения: [node.role != менеджер]
      Ресурсы:
        пределы:
          память: 1024 МБ
      update_config:
        параллелизм: 1
        порядок: старт-первый
        сбой_действие: продолжить

Версии

  • docker-ce 5:19.03.12~3-0~debian-buster
  • nginx-полный 1.14.2-2+deb10u4
  • докер-составить: 1.27.4
Рейтинг:0
флаг vu

Сетчатая маршрутизация, скорее всего, только циклическая.

Я погрузился в источник докера. Я нашел ссылки на различные методы маршрутизации, но, похоже, используется только циклический перебор. Я также нашел вопрос на форуме докеров, который, кажется, подтверждает, что маршрутизация сетки является только циклической.

Изучение источника


В поставщик/github.com/moby/ipvs/constants.go это интересный список стратегий маршрутизации:

константа (                                                                                                                                                                                        
        // RoundRobin равномерно распределяет задания среди доступных                                                                                                                           
        // реальные серверы.                                                                                                                                                                       
        RoundRobin = "рр"                                                                                                                                                                      
                                                                                                                                                                                               
        // LeastConnection назначает больше заданий реальным серверам с                                                                                                                              
        // меньше активных заданий.                                                                                                                                                                  
        Наименьшее соединение = "lc"                                                                                                                                                                 
                                                                                                                                                                                               
        // DestinationHashing назначает задания серверам, просматривая                                                                                                                          
        // поднимаем статически назначенную хеш-таблицу по их целевому IP-адресу                                                                                                                         
        // адреса.                                                                                                                                                                          
        DestinationHashing = "dh"                                                                                                                                                              
                                                                                                                                                                                               
        // SourceHashing назначает задания серверам через поиск                                                                                                                            
        // статически назначенная хеш-таблица по их исходному IP-адресу                                                                                                                                 
        // адреса.                                                                                                                                                                          
        SourceHashing = "ш"                                                                                                                                                                   
                                                                                                                                                                                               
        // WeightedRoundRobin распределяет задания на реальные серверы пропорционально                                                                                                                      
        // к реальному весу серверов. Серверы с большим весом                                                                                                                          
        // получать новые задания первыми и получать больше заданий, чем серверы                                                                                                                               
        // с меньшими весами. Серверы с одинаковым весом получают                                                                                                                                  
        // равное распределение новых заданий                                                                                                                                                   
        WeightedRoundRobin = "wrr"                                                                                                                                                             
                                                                                                                                                                                               
        // WeightedLeastConnection назначает серверам больше заданий                                                                                                                                
        // с меньшим количеством заданий и по отношению к реальному весу серверов                                                                                                                            
        Взвешенное наименьшее соединение = "wlc"                                                                                                                                                        
)  

Однако единственная из этих констант, которая используется каждый раз, — это RoundRobin:

wayne@treebeard:~/temp/docker-src/moby$ ack 'ipvs\.(RoundRobin|LeastConnection|DestinationHashing|SourceHashing|WeightedRoundRobin|WeightedLeastConnection)'
libnetwork/service_linux.go
117: SchedName: ipvs.RoundRobin,
225: s.SchedName = ipvs.RoundRobin

Хотя это был очень беглый взгляд на источник, я не нашел очевидных способов настроить режим маршрутизации на какой-либо другой, кроме RoundRobin.

Связанный вопрос на форумах докеров

Вопрос на форуме докеров, кажется, подтверждает, что единственный метод маршрутизации, доступный для сетки, — циклический:

https://forums.docker.com/t/configure-swarm-mode-routing-mesh-load-balancing-method/75413

Я читал, что балансировщик нагрузки ячеистой сети маршрутизации в режиме роя использует циклический перебор (https://success.docker.com/article/ucp-service-discovery#externalloadbalancing (swarmmoderoutingmesh) 15).

Есть ли возможность настроить метод балансировки нагрузки (например,(взвешенное) наименьшее количество соединений, хэширование источника/назначения…) сетки маршрутизации в режиме роя?

Ответ был:

Сетка маршрутизации режима роя, также известная как вход, действует на уровне 4 и не знает о тех деталях конфигурации, которые вы запрашиваете. Документацию можно найти здесь: https://docs.docker.com/engine/swarm/ingress/ 45. Ссылка, которую вы вставили, нацелена на «почему использование прокси-сервера блокировки в качестве преимущества».

Если у вас есть корпоративная лицензия: вы имеете право использовать прокси-сервер блокировки, который является частью UCP. Это обратный прокси/балансировщик нагрузки уровня 7. В те дни, когда я пробовал ранние версии блокировки, у нее были некоторые ограничения. Из того, что я прочитал в журнале изменений, текущие версии кажутся близкими к тому, на что способен traefik.

Если вы используете Docker-CE, возможно, вам стоит взглянуть на traefik.

флаг vu
Это скорее предположение, чем что-либо еще, поэтому не ставьте галочку в надежде, что кто-то напишет более достойный ответ.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.