Docker 节点级负载平衡不起作用

时间:2020-12-28 08:18:13

标签: docker containers load-balancing docker-swarm docker-ingress

我有两台笔记本电脑,Ubuntu-14 和 Mac(Big Sur),它们都安装了 docker(支持 swarm)。

  • 我使用 Ubuntu 作为我的 Swarm 管理器(和)Mac 作为我的工作节点。
  • Ubuntu 私有 IP 是 192.168.0.14(和)Mac 私有 IP 是 192.168.0.11 [私有 IP 可以公开共享而没有任何问题,因为每个 C 类网络都有相同的 IP :P]
  • “docker swarm init --advertise-addr”是我用来制作我的 Ubuntu 主机的命令,管理器(和)我在 Mac 中输入了 join 命令,使 Mac 节点以工作人员的身份加入 Swarm。

所以,在高层次上,我使用了 docker-compose.yml(它只有 1 个 python 网络服务)。使用 compose 文件,我启动了一个“docker stack”,然后将“python webservice”实例复制到 5。所有这些操作都是在 Manager 节点中进行的。

  • Ubuntu 管理器节点(也有 2 个容器实例并充当工作器)(和)Mac 节点有 3 个“python webservice”的容器实例。我已将“端口”设置为“80:1234”,这意味着如果我访问主机的端口 80,它将重定向到容器内运行的 1234 的“python 应用程序 webservice 端口”。

  • 当我点击管理器 IP (192.168.0.14:80) 大约 50 次并检查 Mac 和 Ubuntu 中所有 5 个容器的日志时, 我在 Ubuntu 中找到了所有 2 个容器,每个都获得了 25 次点击(以循环方式)但是, 我找不到 Mac 机器中存在的任何容器的任何日志。

这是预期的行为吗?

  1. 只有当我直接点击 Mac 机器(worker)的 IP 地址 (192.168.0.11:80) 时,我才能获取 Mac 机器中存在的容器的日志/请求点击。

因此,这里发生了两种类型的负载平衡,

  1. 当我点击 IP:port(worker/manager)时,只有存在于该 worker/manager 机器中的容器才会进行负载平衡并以循环方式提供服务(我可以看到这是使用的算法)。我们将此负载均衡类型命名为“容器级负载均衡器”

  2. 但是,当我到达 192.168.0.14(管理器 IP)时,我预计负载将在部署在 2 个节点上的所有 5 个容器之间平衡。不知何故,这不起作用。我们称之为“节点级负载均衡器”

我尝试在谷歌中搜索了很多,但一无所获。大多数网站都在使用 Nginx、HaProxy 负载均衡器等外部技术来解决“节点级负载均衡器”。

docker 本身没有对此提供开箱即用的支持吗?

EDIT 1 - 按照 Metin 在评论部分的要求添加了 docker-compose.yml

docker-compose.yml

version: '3'

services:
    webservice:
        image: python_ws_test
        ports:
            - '80:1234'
        command: ["python", "app.py"]

1 个答案:

答案 0 :(得分:0)

主要问题是,我试图加入一个 Linux 节点和一个 Mac 节点,因为 Mac 的 docker(我认为只有 SWARM)有点像前面提到的那样坏了,

Mac 私有 IP 是 192.168.0.11,但不知何故,192.168.65.3 是 Mac 工作节点采用的 IP。

我是怎么知道的?

第 1 点

=> 我使用“swarm init”命令将 Mac 作为我的管理器,没有任何“advertise-addr”或“lister-addr”等。我得到的“docker swarm join”命令的 IP 地址 = 192.168。 65.3.我不知道为什么,因为我的 Mac 主机 IP 是 192.168.0.11。这不是预期的行为。

=> 我在 Ubuntu 中做了同样的事情,使用“swarm init”原始命令和“docker swarm join”命令使我的 Ubuntu 作为管理器,我得到的 IP 地址 = 192.168.0.14,这是与 ubuntu 相同的 IP主机,这是预期的行为。

第 2 点

堆栈部署后,我尝试使用“docker network inspect $networkName”检查使用的覆盖网络。 Linux 管理器节点的对等点为“自身”和 192.168.65.3,这是无法访问的,因为我的 Mac 节点的 IP 是 192.168.0.11。 但是不知何故,当我在管理器节点(Ubuntu)中使用“scale”命令自动扩展时,docker manager 能够在 Mac 和 Ubuntu 中扩展容器。这很奇怪。

默认 Overlay 网络 - 行为

此外,无论您在 docker-compose.yml 还是 deploy 命令中提及,“docker stack deploy”默认都会创建一个覆盖入口网络。 Docker 管理器和节点在此网络之上进行通信。

回答问题中提到的问题

Docker 对“节点级负载平衡”有开箱即用的支持吗?是的! 我对 Mac 中的这种奇怪行为感到非常沮丧,我在 Mac 中安装了 Ubuntu 20.04 VM,并尝试使用“Ubuntu 14.04”(单独的笔记本电脑/基本操作系统)作为管理器,将 Ubuntu 20.04(虚拟机操作系统)用作工作节点。现在,我能够在两个节点之间进行负载平衡(我在工作节点中获得了点击),尽管我一直只点击管理器的 IP。

如果我获得更多见解,我会更新 Mac 在这里损坏的原因。任何已经知道这方面知识的人,请分享。

相关问题