我有两台笔记本电脑,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 机器中存在的任何容器的任何日志。
这是预期的行为吗?
- 只有当我直接点击 Mac 机器(worker)的 IP 地址(192.168.0.11:80)时,我才能获得 Mac 机器中存在的容器的日志/请求命中。
因此,这里发生了两种类型的负载平衡,
当我点击(工人/经理的)IP:端口时,只有该工人/经理机器中存在的容器将被负载平衡并以循环方式提供服务(我可以看到这是使用的算法)。让我们将此负载平衡类型命名为“容器级负载平衡器”
但是,当我点击 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"]