Page 37 - 网络电信2022年7/8月刊
P. 37
把容器之间的请求封装成VXLAN的请求,将链路层的以太网包封 图4 分布式微服务系统的跨主机通信案例架构
装到UDP包中进行传输。首先举个例子,从C1去访问宿主机上C2
的容器,先通过C1发出这个包之后,它首先进行封包,要查找
中心化存储C2是在哪个主机上的,查到的是这个主机上,就把
这个请求的包封装成宿主机之间的包,把这个包送达到对应宿
主机上,再通过一定的约定去解包,最终转发到另外一个主机
上的一个容器。其缺点是对带宽的损耗比较大,因为看到这里
去封包,它肯定是把这个容器的包上面又加了一层包,这个包
上面肯定会有一些自己的占用,一般像封包模式,MTU最终都会
小于宿主机之间的MTU,它还会造成一些资源占用。比如说在这
个地方去封包的时候,它可能会占用CPU去做一下封包操作,还
会占用CPU去做解包的操作,所以会增加主机上的负载,但是它
的好处是对基础设施要求比较低,它只需要两个宿主机之间可
以三层互通。
Docker的overlay驱动也是封包模式的实现,它的封包方 口到物理网络,因为物理网络10.159.62.0/24 无法直接访问
式是基于VXLAN。VXLAN内部把一个二层的包、链路层的一个请 ■ overlay网络中的容器,需要容器中映射端口到物理网络。
求封装成一个VXLAN的一个包,这里面会有一个约定的信息,比 ■ noverlay网络中的容器默认通过与主机之间的bridge访
如VXLAN ID,还有一个外部的UDP的头,最终会把这个包通过 问物理网络。
UDP发往对应的主机上面去,对应的主机再做VXLINE的解包。 2.开放Docker Swarm 集群所需的主机端口
Docker还会做IP的地址管理和网络信息同步。 Swarm集群的成员主机都需要开放集群所需的主机端口:
2.路由模式 firewall-cmd --zone=public --add-port=2377/tcp
举例来说,主机1上的容器想要访问主机2的容器,首先这 --perma-nent
个机器上是没有主机2的IP地址,它出了机器之后到达路由器, firewall-cmd --zone=public --add-port=7946/tcp
再通过路由器上的路由表,去把对应的请求网端转发到对应的 --perma-nent
主机2上面,主机2上面是有这个容器的IP,所以它就能够做到 firewall-cmd --zone=public --add-port=7946/udp
这个容器的跨主机通信。它的好处在于它没有封包,所以它的 --perma-nent
性能很好,但是它对于基础设施有一些要求,比如我的基础设 firewall-cmd --zone=public --add-port=4789/tcp
施要支持、能够配置这个路由表,如果用Linux路由要支持二层 --perma-nent
的转发。 firewall-cmd --zone=public --add-port=4789/udp
3.两种模式优缺点比较 --perma-nent
总的来说,二层VLAN网络需要二层网络设备支持,通用性 firewall-cmd –reload
和灵活性不如Overlay网络。相比之下,Overlay网络在不改变 3.创建Docker Swarm 集群
现有网络基础设施的前提下,通过某种约定通信协议,把二层 Docker Swarm是Docker开源组织提供的Docker环境集群管
报文封装在IP报文之上的新的数据格式。能够充分利用成熟的 理工具,它能够把若干台Docker主机的抽象为一个逻辑上的主
IP路由协议进程数据分发,突破VLAN的数量限制,并可将广播 机,它也是一种用于统一管理Docker主机的CLI工具,可用来控
流量转化为组播流量,避免广播数据泛滥。因此,Over lay网 制Docker主机。Swarm调用的是Docker API标准接口,兼容非集
络实际上是目前最适合的Docker容器跨节点通信方案。 群模式的操作指令,比如通过常规的docker运行命令来启动容
器,Swarm会自动选择适合的主机来运行相关容器。也就是说,
四.分布式微服务架构系统的跨主机网络通 像Compose编排脚本可以在不经任何改动的情况下,直接通过
信解决方案与实施 Swarm来实现对集群的管理。
1.案例说明 创建Docker Swarm集群命令:
■ 如图所示,假设本地局域网段10.159.62.0/24中存在主 docker swarm init --advertise-addr <MANAGER-IP>
机159.62.231,10.159.62.232和10.159.62.233互联互通; 将其他Docker主机节点加入Swarm集群中:
■ 每个主机上都运行Docker引擎,通过Docker运行若干个 docker swarm join \
Docker容器,例如图中的Order,Billing等; --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0
■ 将这3台主机建立成为一个Docker Swarm集群; xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
■ 创建一个Docker Overlay网络(网段10.10.0.0/24), 192.168.99.100:2377
每个主机上的容器都被加入该overlay网络中,通过overlay网 查看集群所有服务器节点:
络实现跨主机的容器相互通信; docker node ls
■ 假设Console,Terminal和API这三个服务均需要暴露端 至此,Docker Swarm集群创建完毕。
网络电信 二零二二年七,八月 65