docker集群中的网络基础

docker集群中的网络基础

重点在于介绍,在现有的编排技术下——如docker swarm,k8s——容器的网络实现方式。

我们都知道,容器技术现在是分布式系统中非常火热的技术,如DevOps,CI/CD等,都跟现在的容器技术息息相关。怎么利用容器技术实现我们的集群的稳定性,安全性还有快捷性,这都需要好好的学习一下容器相关的知识。而作为计算机中的通信底层——网络,则是容器技术基础中的基础。

下面,我分不同的实现方式,来简单说明一下在不同的主机之间,容器是怎么互相通信的。

第一种方式:借助于Etcd,利用overlay网络来实现不同主机之间容器互联。

Etcd只是一个Key Value数据库,它只是辅助我们的docker,我们将docker engine相关的网络参数存储在etcd中,这样凡是集群里面的服务器就可以获取到整个集群的网络设置。我们称这个为网络发现(网络发现只是服务发现的一种)。Etcd的作用最明显的体现就是,实现了两个容器的IP不会重复。

下面来简单说明一下Overlay网络,它的问世是为了解决什么难题?

在每台运行Docker的linux的机子上,我们的容器A(IP:172.18.0.100)其实都是链接到了我们一个叫做docker0(IP:172.18.0.1)的网桥上,而这个网桥又是和我们的物理网卡(IP:192.168.10.10)相连,也就是说,如果我们的容器要访问外网,那么我们的容器需要先访问到docker0网桥,通过该网桥再访问到物理网卡,然后通过该网卡再访问到外网。我们每台机子上的网络都是这样的结构,只是IP不同罢了。

那么,我们来计算以下,我们不同主机之间容器通信,最少要经历多少块网卡呢?答案是四块网卡。在这里,我们定义两块底层物理网卡为底层网卡(分别是网卡B和C),两个容器网卡为上层网卡(分别是网卡A和D)。

这里容我插一句:可能有的人会想到为什么我们不能通过网络的NAT方式来实现不同主机之间容器的互相通信呢?

我们当然可以通过NAT的方式实现,但是,我们想要实现的是一种集群,在这个集群里面,我们的容器可以动态生成,动态停止,自动编排的。这就意味着,容器不能限定在具体的主机上。

它的原理又是怎样的呢?答案就在我们的数据包里面。如果要实现这种网络的通信,我们必须保证的条件有:

通信的两台主机之间的实际网络必须连通。如上图,我们的网卡B和C必须连通

还有几个端口必须保证打开(2377[TCP协议],7946[TCP,UDP协议],4789[UDP协议])。

相互通信的两个容器的IP必须在同一个网段,且IP不能相同。其实这一点只要容器在同一个内网下就可以达成。业绩是说我们网卡A和网卡D必须实现逻辑连通

有了上面的条件后,下面我们来简单说明一下Overlay原理:

当我们的数据包从网卡A出来后,我们数据包中的源地址是A,目的地址是D,数据包从网卡B出来后,源地址是B,目的地址是C。从表面上看,我们从网卡A出来的数据包是无法到达网卡D的。但是我们的Overlay网络就是实现了这种情况下的网络通信。当我们的数据包从A出来后,Docker下的Overlay网络就会重新对我们的数据包进行封装,在通过我们的B网卡的时候,从docker出来的数据包就成了网卡B出来的数据包的应用层数据,也就是说,我将B网卡的网络看作是一个发往网卡C的大货车,A网卡的数据包就像是坐在了大货车上面到达了C网卡,这时候,我们的主机2再对受到的数据包进行解包(卸货),卸货下来后,再将我们的货物交给网卡D,这样,我们的两个容器就实现了通信。

以上的过程就是通过UDP数据包实现的。

以上,就是我们不同主机之间容器通信的网络基础实现。

当然,上面说的只是原理,下面的细节,如果有兴趣,各位可以在网络上去搜索以下的关键字:Overlay,VXLAN,Etcd的配置。

 

 

 

发表评论

邮箱地址不会被公开。 必填项已用*标注