首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对接网格使用什么路由算法?

对接网格使用什么路由算法?
EN

Server Fault用户
提问于 2021-08-24 22:54:13
回答 1查看 244关注 0票数 3

我们想知道Docker用于将请求路由到容器的算法。原因如下:

我们将应用程序部署到自托管的码头群中。我们使用码头路由网将流量定向到各个节点,如下所示:

  • 因特网->
  • 防火墙->
  • 负载指示器(nginx) ->
  • nginx“最小连接”路由到三个群集管理器->
  • 码头网格->
  • 在三个不同的非管理员停靠节点上运行的六个应用程序容器中的任何一个。

我们的开发人员怀疑,码头网状结构正在路由流量循环,这可能导致一些应用程序容器超载缓慢的请求,而其他容器的使用不足。如果devs是正确的,那么我们不应该使用码头网格,而应该使用负载指示器来使用比循环更聪明的算法将流量引导到单个容器。

另一方面,如果码头网格正在跟踪每个集装箱的飞行请求数量,并以最少的请求将流量传递给集装箱,那么我们就不需要绕过码头网格。

问题

码头网格使用了什么算法来引导流量到可用的集装箱?这是简单的循环吗?

我们的nginx配置

我们的nginx接收来自互联网的流量,并将其代理到三个码头管理节点中任意一个的码头网格上:

代码语言:javascript
运行
复制
upstream document_service {
  least_conn;
  server dockermgr1.nosuchdomain:8402;
  server dockermgr2.nosuchdomain:8402;
  server dockermgr3.nosuchdomain:8402;
}

server {
...
        proxy_pass http://document_service;

我们的码头-组成配置

docker -组合文件将服务配置为在三个对接者运行节点上有6个副本:

代码语言:javascript
运行
复制
version: "3.4"

services:
  documentsservice:
    image: ${IMAGE_LOCATION}documents_service/documentsservice:prod-${COMPOSE_BUILD_TAG:-latest}
    container_name: documentsservice
    ports:
      - "8402:80"
    ...
    deploy:
      replicas: 6
      placement:
        constraints: [node.role != manager]
      resources:
        limits:
          memory: 1024MB
      update_config:
        parallelism: 1
        order: start-first
        failure_action: continue

版本

  • 码头-ce 5:19.03.12~3-0~debian-buster
  • nginx- 1.14.2-2+deb10u4 10u 4
  • 码头工人-组成: 1.27.4
EN

回答 1

Server Fault用户

发布于 2021-08-25 16:48:39

网格路由最有可能是只循环

我跳进了码头源。我找到了对各种路由方法的引用,但似乎唯一使用的方法是循环。我还在码头论坛上发现了一个问题,似乎证实了网格路由是只循环的。

检查源

供应商/github.com/moby/ipv/constants.go中,这个有趣的路由策略列表是:

代码语言:javascript
运行
复制
const (                                                                                                                                                                                        
        // RoundRobin distributes jobs equally amongst the available                                                                                                                           
        // real servers.                                                                                                                                                                       
        RoundRobin = "rr"                                                                                                                                                                      
                                                                                                                                                                                               
        // LeastConnection assigns more jobs to real servers with                                                                                                                              
        // fewer active jobs.                                                                                                                                                                  
        LeastConnection = "lc"                                                                                                                                                                 
                                                                                                                                                                                               
        // DestinationHashing assigns jobs to servers through looking                                                                                                                          
        // up a statically assigned hash table by their destination IP                                                                                                                         
        // addresses.                                                                                                                                                                          
        DestinationHashing = "dh"                                                                                                                                                              
                                                                                                                                                                                               
        // SourceHashing assigns jobs to servers through looking up                                                                                                                            
        // a statically assigned hash table by their source IP                                                                                                                                 
        // addresses.                                                                                                                                                                          
        SourceHashing = "sh"                                                                                                                                                                   
                                                                                                                                                                                               
        // WeightedRoundRobin assigns jobs to real servers proportionally                                                                                                                      
        // to there real servers' weight. Servers with higher weights                                                                                                                          
        // receive new jobs first and get more jobs than servers                                                                                                                               
        // with lower weights. Servers with equal weights get                                                                                                                                  
        // an equal distribution of new jobs                                                                                                                                                   
        WeightedRoundRobin = "wrr"                                                                                                                                                             
                                                                                                                                                                                               
        // WeightedLeastConnection assigns more jobs to servers                                                                                                                                
        // with fewer jobs and relative to the real servers' weight                                                                                                                            
        WeightedLeastConnection = "wlc"                                                                                                                                                        
)  

然而,每次使用的这些常量中只有一个是RoundRobin:

代码语言:javascript
运行
复制
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) ).是否有可能配置负载平衡方法(例如(加权)最小连接、源/目标散列…)蜂群模式的路由网?

答案是:

群模式路由网格(也称为入口)在layer4上工作,不知道所要求的配置细节。文档可以在这里找到:https://docs.docker.com/engine/swarm/ingress/ 45。您粘贴的链接的目标是“为什么使用联锁代理作为优势”。如果您拥有企业许可证:您有权使用联锁代理,这是UCP的一部分。它是一个layer7反向代理/负载平衡器。早在我尝试早期版本的联锁时,它就有了一些利器。从我在变更日志中看到的内容来看,当前的版本似乎接近traefik所能做到的。如果您正在Docker上运行,您可能需要查看一下traefik。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1075555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档