【发布时间】:2020-12-28 08:18:13
【问题描述】:
我有两台笔记本电脑,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 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 个命中(以循环方式)但是, 我找不到 Mac 机器中存在的任何容器的任何日志。
这是预期的行为吗?
- 只有当我直接点击 Mac 机器(worker)的 IP 地址 (192.168.0.11:80) 时,我才能获取 Mac 机器中存在的容器的日志/请求命中。
所以,这里发生了两种类型的负载平衡,
-
当我点击 IP:port(工人/经理的)时,只有该工人/经理机器中存在的容器将被负载平衡并以循环方式提供服务(我可以看到这是使用的算法)。我们将这种负载均衡类型命名为“容器级负载均衡器”
-
但是,当我点击 192.168.0.14(管理器 IP)时,我预计负载将在部署在 2 个节点上的所有 5 个容器之间平衡。不知何故,这不起作用。我们称之为“节点级负载均衡器”
我已经尝试在谷歌中搜索很多,但一无所获。大多数网站都在使用 Nginx、HaProxy 负载均衡器等外部技术来解决“节点级负载均衡器”。
docker 本身是否对此提供了开箱即用的支持?
EDIT 1 - 添加了 docker-compose.yml 作为 Metin 在评论部分提出的要求
docker-compose.yml
version: '3'
services:
webservice:
image: python_ws_test
ports:
- '80:1234'
command: ["python", "app.py"]
【问题讨论】:
-
请分享您的完整 docker-compose.yml 以及您如何部署堆栈。您确定您的堆栈网络属于覆盖类型并且端口是通过入口发布的吗?
-
@Metin,我在问题本身中添加了 docker-compose.yml。为了部署堆栈,我使用了命令“docker stack deploy -c docker-compose.yml ws”,然后使用“docker service scale ws_webservice=5”对其进行了扩展
-
@Metin,我是这里的初学者,没有添加任何与覆盖或入口相关的内容。我遵循的过程似乎说服了我去工作,但事实并非如此。可能是docker的底层实现需要一些额外的信息,如入口或覆盖等......你说的。你能帮忙吗?如果那是 RCA?
-
另外,我使用的 scale 命令,将 2 个容器放在 Ubuntu 管理节点中,将 3 个容器放在 Mac 工作节点中。
-
您的 docker-compose.yml 是“非常简单的”,并且没有提供有助于理解问题的 RC 的更多详细信息。下一步:请分享
docker stack ps ws和docker network inspect ws_default的输出
标签: docker containers load-balancing docker-swarm docker-ingress