我有两台笔记本电脑,Ubuntu-14 和 Mac(Big Sur),它们都安装了 docker(支持 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 机器中存在的任何容器的任何日志。
这是预期的行为吗?
因此,这里发生了两种类型的负载平衡,
当我点击 IP:port(worker/manager)时,只有存在于该 worker/manager 机器中的容器才会进行负载平衡并以循环方式提供服务(我可以看到这是使用的算法)。我们将此负载均衡类型命名为“容器级负载均衡器”
但是,当我到达 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"]
答案 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 在这里损坏的原因。任何已经知道这方面知识的人,请分享。