Docker 节点级负载平衡不工作
Docker node level load balancing not working
我有两台笔记本电脑,Ubuntu-14 和 Mac (Big Sur),它们都安装了 docker(支持 swarm)。
- 我使用 Ubuntu 作为我的 Swarm 管理器(和)Mac 作为我的工作节点。
- Ubuntu 私有 IP 是 192.168.0.14(并且)Mac 私有 IP 是 192.168.0.11 [私有 IP 可以在 public 中共享,没有任何问题,因为每个 class C 网络具有相同的 IP :P]
- "docker swarm init --advertise-addr" 是我用来创建 Ubuntu 主机的命令,管理器(和)我在 Mac 中输入了加入命令使 Mac 节点作为工作节点加入 Swarm。
所以,在高层次上,我使用了 docker-compose.yml(它只有 1 个 python 网络服务)。使用撰写文件,我启动了一个“docker 堆栈”,然后将“python webservice”实例复制到 5。所有这些操作都在 Manager 节点中执行。
Ubuntu 管理器节点(也有 2 个容器实例并充当工作人员)(并且)Mac 节点有 3 个“python web 服务的容器实例”。我已将“端口”设置为“80:1234”,这意味着如果我点击主机的端口 80,它将重定向到“python 应用程序 Web 服务端口”,即 1234 运行在容器内。
当我点击管理器 IP (192.168.0.14:80) 大约 50 次并检查 Mac 和 Ubuntu 中所有 5 个容器的日志时,
我在 Ubuntu 中找到了所有 2 个容器,每个都获得了 25 次点击(以循环方式)但是,
我找不到 Mac 机器中存在的任何容器的任何日志。
这是预期的行为吗?
- 只有当我直接命中 Mac 机器(worker)的 IP 地址(192.168.0.11:80)时,我才能获得 logs/request 中存在的容器的命中Mac 机.
所以,这里有两种类型的负载平衡,
当我点击 IP:port(属于 worker/manager)时,只有 worker/manager 机器中的容器会被负载均衡并服务于循环方式(我可以看到这是使用的算法)。我们将此负载均衡类型命名为“容器级负载均衡器”
但是,当我访问 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)如前所述有点坏了,
- 在此评论中 https://dev.to/aguedeney/comment/172d6(和)
- 后续线程(https://dev.to/natterstefan/docker-tip-how-to-get-host-s-ip-address-inside-a-docker-container-5anh).
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 损坏的原因。有知道这方面知识的朋友分享一下。
我有两台笔记本电脑,Ubuntu-14 和 Mac (Big Sur),它们都安装了 docker(支持 swarm)。
- 我使用 Ubuntu 作为我的 Swarm 管理器(和)Mac 作为我的工作节点。
- Ubuntu 私有 IP 是 192.168.0.14(并且)Mac 私有 IP 是 192.168.0.11 [私有 IP 可以在 public 中共享,没有任何问题,因为每个 class C 网络具有相同的 IP :P]
- "docker swarm init --advertise-addr" 是我用来创建 Ubuntu 主机的命令,管理器(和)我在 Mac 中输入了加入命令使 Mac 节点作为工作节点加入 Swarm。
所以,在高层次上,我使用了 docker-compose.yml(它只有 1 个 python 网络服务)。使用撰写文件,我启动了一个“docker 堆栈”,然后将“python webservice”实例复制到 5。所有这些操作都在 Manager 节点中执行。
Ubuntu 管理器节点(也有 2 个容器实例并充当工作人员)(并且)Mac 节点有 3 个“python web 服务的容器实例”。我已将“端口”设置为“80:1234”,这意味着如果我点击主机的端口 80,它将重定向到“python 应用程序 Web 服务端口”,即 1234 运行在容器内。
当我点击管理器 IP (192.168.0.14:80) 大约 50 次并检查 Mac 和 Ubuntu 中所有 5 个容器的日志时, 我在 Ubuntu 中找到了所有 2 个容器,每个都获得了 25 次点击(以循环方式)但是, 我找不到 Mac 机器中存在的任何容器的任何日志。
这是预期的行为吗?
- 只有当我直接命中 Mac 机器(worker)的 IP 地址(192.168.0.11:80)时,我才能获得 logs/request 中存在的容器的命中Mac 机.
所以,这里有两种类型的负载平衡,
当我点击 IP:port(属于 worker/manager)时,只有 worker/manager 机器中的容器会被负载均衡并服务于循环方式(我可以看到这是使用的算法)。我们将此负载均衡类型命名为“容器级负载均衡器”
但是,当我访问 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)如前所述有点坏了,
- 在此评论中 https://dev.to/aguedeney/comment/172d6(和)
- 后续线程(https://dev.to/natterstefan/docker-tip-how-to-get-host-s-ip-address-inside-a-docker-container-5anh).
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 损坏的原因。有知道这方面知识的朋友分享一下。