0

我有两台笔记本电脑,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 主机、Manager(和)我在 Mac 中输入 join 命令以使 Mac 节点作为工作人员加入 Swarm 的命令。

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

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

  • 当我点击 Manager IP (192.168.0.14:80) 大约 50 次,当我检查 Mac 和 Ubuntu 中所有 5 个容器的日志时,我发现 Ubuntu 中的所有 2 个容器,每个都有 25 个命中(一轮robin 时尚)但是,我找不到 Mac 机器中存在的任何容器的任何日志。

这是预期的行为吗?

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

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

  1. 当我点击(工人/经理的)IP:端口时,只有该工人/经理机器中存在的容器将被负载平衡并以循环方式提供服务(我可以看到这是使用的算法)。让我们将此负载平衡类型命名为“容器级负载平衡器”

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

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

docker 本身没有开箱即用的支持吗?

编辑 1 - 添加了 docker-compose.yml 作为 Metin 在评论部分提出的要求

码头工人-compose.yml

version: '3'

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

1 回答 1

0

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

Mac Private 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)中使用“缩放”命令自动缩放时,docker manager 能够在 Mac 和 Ubuntu 中缩放容器。这很奇怪。

默认覆盖网络 - 行为

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

回答问题中提到的问题

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

如果我获得更多见解,我会在这里更新 Mac 出现故障的原因。已经有这方面知识的朋友,分享一下。

于 2020-12-29T06:09:54.680 回答