【问题标题】:Load balancing with docker swarm使用 docker swarm 进行负载均衡
【发布时间】:2018-01-03 14:24:54
【问题描述】:

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

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

预期行为:

我期望得到的行为是,当我访问每个本地主机时,我会得到显示在该主机上运行的容器 ID 的网页。例如,如果pi-manager 有容器A 并且pi-worker 有容器B。当我访问pi-manager 的本地主机地址时,我希望看到A 的容器ID,当我访问pi-worker 的本地主机地址时,我希望看到B 的容器ID。这不是正在发生的事情。

当前行为:

我遇到的行为是,在一段时间内,如果我在pi-managerpi-worker 访问本地主机,我将被定向到容器A 的网页,然后在下一段时间没有无论我访问哪个本地主机(pi-managerpi-worker),我总是被定向到容器B。我猜这是 Docker swarm 内置的负载均衡?

问题:

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

我必须使用哪些工具?码头工人组成?代理图像? (在阅读本文时看到这些?

这个过程有什么好的教程吗?


更新:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我正在开发这个项目作为显示负载平衡的一种示例,这样当我转到主页时,流量被重定向到在pi-managerpi-worker 上运行的这两个不同的容器。所以如果你刷新一个页面,容器地址是不同的,你可以说明负载均衡功能。 Nginx 或 HaProxy 可以做到这一点吗? Thakk 你的例子我看到它是一个粘性连接它到底是如何工作的?
    • 你认为我可以将此 docker 文件转换为在 ARM 架构上工作吗?
    • 如果容器上没有正在运行的 Web 服务,我是否仍会被重定向到正在运行该服务的节点?
    【解决方案2】:

    感谢@kleinsasserm 为我指明了正确的方向,我找到了解决问题的方法!我使用基本 HAProxy docker 映像及其循环负载平衡算法创建了一个负载平衡器,以创建一个 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 刷新页面以显示运行相同服务的不同容器


      参考:

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多