docker swarm网络模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker swarm网络模式相关的知识,希望对你有一定的参考价值。

参考技术A docker swarm 网络模式

swarm service的路由办法通常有两种,VIP和DSN

这是缺省情况设置,当用户创建service的时候,这个service会被分配一个VIP,然后每一个具体的container都有一个独立的IP,ingress会负责从VIP到各个container之间的路由。

举例来说:

并且看到了它的属性。

创建两个service:

nslookup查看域名解析:

从这个例子我们可以看到:

我们再进入container看看:

每一个container有两块网卡:
eth0: 10.0.1.3 这就是我们前面看到的service container IP地址,是属于网络my-network的。
eth1: 172.18.0.4,这是另一个网络地址;是谁的呢, 是网络docker_gwbridge。(另外bridge网络使用的是172.17网段)
也就是说每一个container属于两个网络,my-network和docker_gwbridge,分别用来service路由,和连接主机网络。

补充一点网卡eth1: 172.18.0.4,对应的网关地址是172.18.0.1,那个这个网关地址172.18.0.1是谁呢,它就是主机网络上的docker_gwbridge,在主机上运行ifconfig可以看到:

bridge网络的网段地址从172.17.X.X/16开始,第一个内置的docker0使用了172.17.X.X,后面每新增一个bridge网络就新增一个网地址,172.18.X.X, 172.19.X.X,。。。

至此两个bridge网络都比较清楚了。

另外如果发布service的时候指定了主机端口映射,那么container里面会有三块网卡分别属于:

做一个总结:

发布service的时候:

注意swarm VIP使用的一个限制:

也就是说无法做到同一个client过来的请求保持路由到同一个container去。

适合使用自己的DSN Load-Balance算法,例如HAProxy。

创建使用DSN轮询的service。

由参数--endpoint-mode决定。

先看一下两个container的ip 地址:

两个contaienr的ip 地址分别是:

再看DSN解析结果:

每次运行ping解析出的IP地址在两个container之间轮换,也就没有虚IP概念了,而且swarm自动实现了DSN轮询的功能。

再看一个nslookup结果:

可见nslookup直接把两个container的地址都解析出来,说明一个域名(service name)对映有两个IP地址。对照前面使用VIP的,一个service name只对映一个IP地址,就是VIP地址,而不管具体有多少个container实例。

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

我是Dockers和容器的新手。我正在浏览docker的教程,并发现了这些信息。 https://docs.docker.com/get-started/part3/#docker-composeyml

   networks:
     - webnet
networks:
  webnet:

什么是网络?该文件说

指示Web容器通过称为webnet的负载平衡网络共享端口80。 (在内部,容器本身将在短暂的端口发布到Web的端口80.)

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

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

答案

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

首先,你在这里关注的文档使用了所谓的docker的swarm mode

什么是swarm mode

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

来自SO文档:

群集是一些共同部署服务的Docker引擎(或节点)。 Swarm用于跨多个物理,虚拟或云计算机分发处理。

因此,使用swarm模式,您可以拥有一个多主机(虚拟机和/或物理)集群,这些集群是通过其docker engine相互通信的机器。

Q1。什么是网络?

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

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

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

Q2。那么,默认情况下,覆盖网络在docker集群中是否负载均衡?

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

Q3。什么是负载平衡算法使用?

从这个SO question由群大师bmitch回答;):

该算法目前是循环法的,我没有看到它可以插入的迹象。更高级别的负载平衡器将允许移除群集节点以进行维护,但是群集模式中的循环算法将撤消任何粘性会话或其他路由功能。

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

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

再次来自docs

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

所以你可以像10个完全相同的容器一样进行部署(假设nginx和你的app html / js一起使用),而不需要处理专用网络DNS条目,端口配置等等......任何传入的请求都会自动负载均衡到参与一群。

希望这可以帮助!

以上是关于docker swarm网络模式的主要内容,如果未能解决你的问题,请参考以下文章

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

如何创建docker network

docker的网络模式:none

Docker Swarm 模式路由网格不适用于wireguard ***

Docker Swarm 环境搭建

Docker swarm 模式初体验