0
点赞
收藏
分享

微信扫一扫

docker网络--多机通信--3--overlay笔记

正义的杰克船长 2022-04-02 阅读 63
linuxdocker

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

举报

相关推荐

0 条评论