网络和负载均衡器如何在 docker swarm 模式下工作?

Posted

技术标签:

【中文标题】网络和负载均衡器如何在 docker swarm 模式下工作?【英文标题】:How do networking and load balancer work in docker swarm mode? 【发布时间】:2017-11-22 16:40:20 【问题描述】:

我是 Docker 和容器的新手。我正在阅读 docker 的教程并遇到了这些信息。 https://docs.docker.com/get-started/part3/#docker-composeyml

   networks:
     - webnet
networks:
  webnet:

什么是网络?文件说

指示 web 的容器通过称为 webnet 的负载平衡网络共享端口 80。 (在内部,容器本身会在一个临时端口上发布到 web 的 80 端口。)

那么,默认情况下,覆盖网络在 docker 集群中是负载均衡的?使用什么负载平衡算法?

实际上,我不清楚为什么我们要在覆盖网络上进行负载平衡。

【问题讨论】:

【参考方案1】:

不确定我是否比文档更清楚,但也许改写会有所帮助。

首先,您在此处关注的文档使用所谓的 docker 的 swarm mode

swarm mode 是什么?

swarm 是 Docker 引擎或节点的集群,您可以在其中部署服务。 Docker Engine CLI 和 API 包括用于管理 swarm 节点(例如,添加或删除节点)以及跨 swarm 部署和编排服务的命令。

来自 SO 文档:

swarm 是一组共同部署服务的 Docker 引擎(或节点)。 Swarm 用于在许多物理、虚拟或云机器上分配处理。

因此,在 swarm 模式下,您有一个多主机(虚拟机和/或物理)集群一台机器,这些机器通过它们的 docker engine 相互通信。

第一季度。什么是网络?

webnet 是您的堆栈启动时创建的overlay network 的名称。

覆盖网络管理参与 swarm 的 Docker 守护进程之间的通信

在您的机器集群中,创建了一个虚拟网络,其中每个服务都有一个 ip - 映射到一个内部 DNS 条目(即服务名称),并允许 docker 将传入的数据包路由到正确的容器,无处不在群(集群)。

第二季度。那么,默认情况下,覆盖网络在 docker 集群中是负载均衡的?

是的,如果您使用覆盖网络,但您也可以删除服务networks 配置以绕过它。然后你必须publish你想公开的服务的端口。

第三季度。使用了什么负载均衡算法?

来自这个SO question由群主bmitch回答;):

该算法目前是循环的,我还没有看到任何迹象表明它是可插入的。更高级别的负载均衡器将允许关闭 swarm 节点进行维护,但任何粘性会话或其他路由功能都将通过 swarm 模式下的循环算法撤消。

第四季度。实际上我不清楚为什么我们要在覆盖网络上进行负载平衡

docker swarm 模式/服务的目的是允许编排复制的服务,这意味着我们可以扩大/缩小部署在 swarm 中的容器。

再次来自docs:

Swarm 模式有一个内部 DNS 组件,它会自动为 swarm 中的每个服务分配一个 DNS 条目。 swarm manager 使用内部负载平衡根据服务的 DNS 名称在集群内的服务之间分配请求。

因此,您可以部署 10 个完全相同的容器(假设 nginx 与您的应用程序 html/js),而无需处理私有网络 DNS 条目、端口配置等...任何传入请求都将自动负载平衡到主机参与群。

希望这会有所帮助!

【讨论】:

以上是关于网络和负载均衡器如何在 docker swarm 模式下工作?的主要内容,如果未能解决你的问题,请参考以下文章

Docker Swarm集群中部署Traefik负载均衡器

【swarm】Docker swarm 的负载均衡

33. docker swarm 集群服务通信 之 RoutingMesh - Ingress 网络

[docker swarm] 从单容器走向负载均衡部署

Docker 容器技术 — Swarm 集群

Docker 容器技术 — Swarm 集群