使用docker swarm进行负载均衡

时间:2017-07-27 17:53:54

标签: docker docker-compose load-balancing haproxy docker-swarm

我已经在运行Raspbian的2个Raspberry Pi 3 Model 3 B的堆栈上配置了一个2节点docker swarm,其中包含一个管理器节点pi-manager和一个工作节点pi-worker。我创建了一个在本地主机上运行helloworld类型网页的图像,该网页还标识了正在运行该页面的容器。例如:

example of docker image webpage

从docker manager节点我可以创建服务“flairhello”,然后将其扩展为2个continers(我们称之为A和B)。

预期行为:

我期望获得的行为是,当我访问每个本地主机时,我将获得显示在该主机上运行的容器ID的网页。例如,如果pi-manager包含容器Api-worker包含容器B。当我访问pi-manager的localhost地址时,我希望看到容器ID为A,当我访问pi-worker的本地主机地址时,我希望看到容器ID为{{1} }}。这不是正在发生的事情。

当前行为:

我遇到的行为是,如果我访问Bpi-manager的本地主机,我会被引导到容器pi-worker的网页,然后是下一部分时间,无论我访问哪个localhost(Api-manager),我总是被定向到Container pi-worker。我想这是Docker swarm内置的负载均衡?

问题:

如何使用负载均衡器从我的群中获取我想要的行为?

我必须使用哪些工具? Docker撰写? Haproxy图像? (从阅读中看到这些?

这个过程有没有很好的教程?

更新:

在下面的回答中使用HAProxy创建网络负载均衡器的步骤!

2 个答案:

答案 0 :(得分:2)

是的,这是正确的。 Docker swarm有swarm路由网格https://docs.docker.com/engine/swarm/ingress/,每个设计都不粘(ipvs)。如果你想变粘,你必须在堆栈中部署一个支持会话粘性的负载均衡器,例如Traefik(https://traefik.io/)。

但是你可以像我们一样使用Nginx。 - > https://github.com/n0r1sk/border-controller。但这更复杂。

答案 1 :(得分:0)

感谢@kleinsasserm指出我正确的方向,我找到了解决问题的方法!我使用基本HAProxy docker镜像及其Round Robin负载平衡算法创建了一个负载均衡器,以创建一个hello world网页,显示它所在的容器,每次刷新交替容器!这是一个实验室项目,用于演示使用docker进行负载均衡。

此解决方案的步骤:

为了设置和配置此负载均衡器,我执行了以下操作:

  1. 创建了HAProxy Docker镜像

    • 为图片创建目录

      $ mkdir haproxyImage
      $ cd hapoxyImage
      
    • 使用以下内容创建您的docker文件

      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刷新页面以显示运行相同服务的不同容器

    <小时/> 参考文献: