docker网络--多机通信--3--overlay
一.介绍
终于写到overlay了,我觉得overlay在实际工作中,用到的概率很大,不管是使用docker swarm进行集群还是使用k8s进行集群,都会使用到overlay。本篇文章,主要是对docker官网关于overlay的几篇官方文档,进行理解和做实验。
docker中的overlay网络,主要有3个方面的应用,
第1个是docker系统自带的overlay网络是ingress,这个会重新开一篇文章说
第2个是用户自定义的overlay网络,应用docker swarm service
第3个是用户自定义的overlay网络,应用standalone containers
接下来就会去做第2,3的实验。
ps:研究docker的overlay网络,最好要懂docker swarm,这篇文章讲docker swarm非常不错,点这里查看
二.原理
overlay是一种叠加网络,简单理解就是把一个逻辑网络建立在一个实体网络之上,让我们的虚拟机或者容器,在同一个二层网络之中,这样虚拟机或者容器,就可以在二层网络自由通信。
overlay是一种叠加网络,实现的方式有很多种,有硬件的,也有软件的,比如vxlan,NVGRE,STT等。我们重点研究一下vxlan,因为我们docker的overlay网络,底层实现就是vxlan。
关于overlay技术的总体介绍,以及原理,可以查看,这篇文章,overlay网络技术之VxLAN详解。
关于vxlan的报文协议讲解,可以查看,这篇文章,vxlan的报文协议。
关于vxlan的详细原理讲解,可以查看,这篇文章,vxlan的原理详细讲解。
上面3篇文章,主要都讲的虚拟机方面的overlay相关知识点,感觉本质上来讲,虚拟机和容器是同一类东西,overlay的网络也是运用一样的技术原理。
关于docker overlay的工作原理讲解,可以查看,这篇文章,Docker Overlay 工作原理,关于docker overlay的工作原理讲解,我会在第一个实验详细,说明的更详细。
三.实验----user-defined overlay for docker swarm service
1.说明
Container eth0:eth0它是Overlay网络分配的唯一的IP地址,它是veth pair虚拟设备对,作用是实现点对点的通信,通过桥接到br0这个网桥中,可以实现不同 NameSwitch之间容器进行通信。
这个overlay网络是ingress网络,这个overlay网络主要用来做负载均衡的。
Container eth1:eth1它是Overlay网络分配的唯一的IP地址,它是veth pair虚拟设备对,作用是实现点对点的通信,通过桥接到br0这个网桥中,可以实现不同 NameSwitch之间容器进行通信。
这个overlay网络是我们自定义的overlay网络,这个overlay网络主要用做集群内部通信的。
VETP:对VXLAN数据包的封装与街封装。
Container eth2:eth2是容器主机的默认网络,主要提供容器访问外网所提供的服务,走的默认docker网络架构,只不过他创建了docker_gwbridge这个网桥。
docker_gwbridge:docker_gwbridge是容器所创建的网桥它替代了docker0的服务,可以使得容器能够访问外部网络或者其他的集群节点
enp0s3:真机网卡与外界网卡连接得真机网卡,它用来转发,容器VXLAN与NAT两种网卡类型的数据包到指定的对端节点。
PS:
1.创建任何一个service,service下的容器,容器自动获得3块网卡,2个overlay网卡,1个docker_gwbridge网卡。一块overlay网卡,是ingress用来做复杂均衡用的,一块是用集群内部通信用的,还可有一块网卡用作访问外部网络用的。
2.关于数据如何传递的,在第一个实验会详细说明
2.整体拓扑图
3.预置条件
a.使用virtualbox创建3个虚拟机(xwl-1,xwl-2,xwl-3),3个虚拟机的网络,这3个虚拟机处于同一个网络,并且能够上internet
b.这3个虚拟机的系统,均为ubuntu server 20.04。其他linux系统,肯定也是的行的。
c.在这3个虚拟机上,分别安装好docker
ps:用真实的物理机也行,但是感觉没有太必要。或者使用其他工具如vmware,hype-v,wls等,创建虚拟机也行。
4.操作步骤
1.检查3台机器的网络状态
虚拟机1
虚拟机2
虚拟机3
2.在虚拟机1上,创建docker swarm
3.在虚拟机2,3上,加入docker swarm
子节点加入docker swarm后,会自动创建,ingress和docker_gwbridge这两个网络
在虚拟机2
在虚拟机3
4.在主节点上虚拟机1上,验证集群加入情况
在虚拟机1上,列出节点的情况(一个非常小的docker集群算是搭建成功了)
5.在主机点虚拟机1上,创建一个自定义的overlay网络名字叫nginx-net(创建的时候,我们可以指定子网,ip啥的,这里,就直接全部默认)
6.在master节点(虚拟机1),创建docker swarm service
docker service create --name my-nginx --publish target=80,published=80 --replicas=5 --network nginx-net nginx
在虚拟机1(第一次比较慢,会去下载nginx镜像)
在虚拟机1,查看容器
在虚拟机2,查看容器
在虚拟机3,查看容器
7.进入相关容器,下载相关软件
在主机点(虚拟机1)上,
在子节点(虚拟机2)上,
8.查看容器的网卡
在虚拟机1上的容器1d947ec6dd77
在虚拟机2上的容器ad7040f6340b
9.查看ingress overlay, nginx-net overlay以及docker_gwbridge这三个网络,会发现,容器的ip都在相应的网络详情中查找的到
在master节点,虚拟机1上
ingress网络
nginx-net网络
docker_gwbridge网络
在node节点,虚拟机2上
ingress网络
nginx-net网络
docker_gwbridge网络
5.验证数据访问验证
a.overlay内的容器间访问
1.同一个overlay下的容器,可以直接访问
docker自带的ingress的网络和docker自定义的nginx overlay网络,容器间通信
master节点(xwl-1)容器1d947ec6dd77与node节点(xwl-2)容器ad7040f6340b通信
node节点(xwl-2)容器1d947ec6dd77与node节点(xwl-2)容器ad7040f6340b通信
2.同一个overlay下,docker自带的overlay网络的容器,不能直接访问容器的服务,用户自定义的overlay网络里的容器,可以直接访问容器的服务
master节点(xwl-1)容器1d947ec6dd77与node节点(xwl-2)容器ad7040f6340b通信
node节点(xwl-2)容器1d947ec6dd77与node节点(xwl-2)容器ad7040f6340b通信
b.overlay内的容器访问外部
overlay内的容器访问外部,使用的docker_gwbridge这个网卡,overlay本身的ip是无法访问外部的
在虚拟机1
在虚拟机2
c.外部访问overlay内的容器
外部访问集群服务的时候,数据先到达节点,然后会进入到节点的ingress,然后再通过ipvs进行负载均衡到后面的容器上去(这个在ingress网络中详细说明原理)
d.集群内,不同overlay下的容器访问
不同的overlay是不能跨vxlan访问的(除非做了路由)
本来我想通过在容器中关闭网卡的方式,来验证不同overlay是不能跨vxlan进行通信的,但是在容器中,暂时无法禁用网卡。所以这个实验就没做了。但结论应该就是跨vxlan是无法访问的
四.实验----user-defined overlay for standalone containers
1.说明
overlay网络用在docker swarm集群中,所以用户定义的overlay网络,需要在一个docker swarm集群中,才可可以创建。如果在没有加入集群的的节点上创建,会报错,如下图
只能在master节点上创建overlay,如果在node节点上创建overlay会报错
在docker swarm中,没有加入集群的容器,可以连接到自定义的overlay中,下面就做这个实验
2.整体拓扑图
3.预置条件
预置条件和上一个实验相同
4.操作步骤
1.清除上一个实验的步骤
虚拟机1
虚拟机2
虚拟机3
2.在虚拟机1上,创建docker swarm
3.在虚拟机2,3上,加入docker swarm
子节点加入docker swarm后,会自动创建,ingress和docker_gwbridge这两个网络
在虚拟机2
在虚拟机3
4.在主节点上虚拟机1上,验证集群加入情况
在虚拟机1上,列出节点的情况(一个非常小的do分别cker集群算是搭建成功了)
5.在主机点虚拟机1上,创建一个自定义的overlay网络名字叫test-net(创建的时候,我们可以指定子网,ip啥的,这里,就直接全部默认)
6.在虚拟机1和虚拟机2上,分别创建busybox的容器
在虚拟机1上
在虚拟机2上,原本机器上是没有test-net这个overlay网络,但是, 我们运行容器的时候,它可以自动去关联master节点上的自定义的overlay网络
5.数据访问验证
a.overlay内的容器间访问
可以互相访问
在虚拟机1
在虚拟机2
b.overlay内的容器访问外部
通过docker_gwbridge访问外部网络
c.外部访问overlay内的容器
外部访问集群内部,只能通过ingress,才能访问集群内部的容器,由于单独的容器,不属于任何服务,就没有在容器上挂在ingress的网络的网卡
d.集群内,不同overlay下的容器访问
不同的overlay是不能跨vxlan访问的(除非做了路由)
本来我想通过在容器中关闭网卡的方式,来验证不同overlay是不能跨vxlan进行通信的,但是在容器中,暂时无法禁用网卡。所以这个实验就没做了。但结论应该就是跨vxlan是无法访问的。
五.遗留问题
暂时无
六.参考链接
1.docker官网,关于docker overlay的配置,以及相关注意事项
https://docs.docker.com/network/overlay/
https://docs.docker.com/network/network-tutorial-overlay/
2.docker官网,关于docker swarm网络的总体介绍
https://docs.docker.com/engine/swarm/networking/
3.docker swarm这篇文章非常不错,就是有点长,但是非常值得看
https://www.cnblogs.com/zhujingzhi/p/9792432.html
4.overlay技术的总体介绍,以及原理
http://www.360doc.com/content/19/0424/15/37015604_831158928.shtml
5.VXlan 报文讲解
https://blog.csdn.net/sjin_1314/article/details/80303098
6.vxlan的技术原理详细讲解,主要讲解通信原理
https://blog.csdn.net/u013743253/article/details/80504551
7.docker overlay工作原理
https://www.cnblogs.com/xiangsikai/p/9898174.html