Docker 节点级负载平衡不工作

Docker node level load balancing not working

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

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

这是预期的行为吗?

  1. 只有当我直接命中 Mac 机器(worker)的 IP 地址(192.168.0.11:80)时,我才能获得 logs/request 中存在的容器的命中Mac 机.

所以,这里有两种类型的负载平衡,

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

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

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

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

编辑 1 - 添加了 docker-compose.yml 正如 Metin 在评论部分

中所问

docker-compose.yml

version: '3'

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

主要问题是,我尝试加入一个 Linux 节点和一个 Mac 节点,因为 docker 用于 Mac(我认为只有 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) 中使用“缩放”命令自动缩放时,docker 管理器能够缩放 Mac 和 Ubuntu 中的容器.这很奇怪。

默认覆盖网络 - 行为

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

回答问题中提到的问题

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

如果我获得更多见解,我将在此处更新 Mac 损坏的原因。有知道这方面知识的朋友分享一下。