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网络模式的主要内容,如果未能解决你的问题,请参考以下文章