当前位置: 首页 > Web前端 > HTML5

如何使用Flannel搭建跨主机互联的容器网络

时间:2023-04-05 22:44:15 HTML5

如何使用Flannel构建跨主机连接的容器网络原因。跨主机容器互联下图描述了一个简单的集群网络。在这个集群中,有两台服务器A和B,每台服务器都有两块网卡分别连接公网和私网。两台服务器可以通过私网互联,在两台服务器节点上安装Docker,运行A/B/C/D4个容器。每个服务器节点都有一个docker0网桥,是docker启动后初始化的一个虚拟设备,每个容器都连接到docker0网桥上,容器的IP由docker自动分配。但是,由于两个原因,此默认网络设置不支持跨主机容器互连。1、跨主机访问容器没有有效的路由。比如容器A要访问容器D,请求的地址是192.168.1.4,但是主机A并不知道要把这个IP发送给哪个网络设备,主机A也不知道主机B里面有一个容器D.二、多节点容器网段冲突默认情况下,docker启动并初始化docker0网桥时,会随机分配一个IP段,所以如果不进行协调,可能会导致多节点容器网络冲突。例如上图中的两个网络都使用192.168.1.1/24网段。这样的话,就会造成容器IP冲突,比如B和C。那么,我们只需要解决这两个问题,就可以实现跨主机的容器互联了。Pulsecloud集群网络设置使用pulsecloud可以非常轻松的完成集群网络设置。添加集群时,只需将集群的网络类型设置为Flannel即可。Flannel是一款专门用于容器网络互联的软件。ImpulseCloud会自动在您的服务器节点上部署Flannel,实现容器互联。在设置Flannel时,可以指定容器的LAN网段和子网掩码。如上图所示,如果选择局域网网段为172.16.0.0/12,子网掩码为255.255.240.0,则整个集群网络可以分配256个子网。网络,IP段为172.16.0.0/20、172.16.16.0/20、172.16.32.0/20等,每个子网可分配4096个IP。每个节点的docker0网桥使用一个子网,每个容器使用一个子网中的IP,那么我们就可以组成下图所示的网络。图中主机A的docker分配到172.16.0.1/20子网,主机的docker分配到172.16.16.1/20子网。两个子网都在Flannel12管理的虚拟网络172.16.0.0/中,图中虚线表示。至此,在Flannel的协调下,各个主机上的Docker子网IP将不再冲突。另外,Flannel会维护容器网络的路由规则,容器A可以通过172.16.16.3访问容器D。实现跨主机容器互连。Flannel维护的容器网络是一个虚拟网络。图中的虚线也是为了抽象理解。如果你对Flannel的实现感兴趣,可以继续参考Flannel的官方文档。一些解释上面为了简单易懂,桥接IP和子网IP段没有分别解释。上图中主机A分配的子网段为172.16.0.0/20,即172.16.0.1网段中的第一个IP,作为桥接设备的IP。·由于一个网段的第一个IP作为桥接设备IP,最后一个IP作为广播IP,所以在一个子网中,理论上可以分配4096个IP,但实际上只有4094个IP可用。·搭建脉冲云集群网络时,选择的集群网段不能与现有网络冲突。例如目标集群已有10.0.0.0/8网络,那么请选择172.16.0.0/12或192.168.0.0/16作为容器网络。网络IP在上面的Flannel网络示意图中,共有三个网络,公网0.0.0.0/0、私网10.0.0.0/8和虚拟容器网络172.16.0.0/12。之所以强调容器网络是一个虚拟网络,是因为这个网络上的数据必须由其他网络来承载,这个网络是一个二级网络。比如主机A上的容器A向主机B上的容器D发送数据,数据会路由到docker0网桥,然后数据通过主机真实网卡由Flannel发送到主机B的网卡A、主机B上运行的Flannel,继续将数据转发到主机B的docker0网桥,最终到达容器D。那么如果主机有多个网卡,如图,有两个网卡连接到分别是公网和私网,那么我们需要为Flannel指定一个网卡/IP来发送数据。此IP称为网络IP。即告诉主机A上运行的Flannel使用哪个网卡/IP来寻找主机B。PulseCloud形成的集群默认使用节点的公网IP作为联网IP。然后,多个节点之间的数据通信将发送到公网,除非是跨机房互连。一般我们希望节点通过内网传输数据,以提高性能或降低成本。将主机加入集群后,在主机设置页面,选择网络IP,指定各主机节点使用的网络IP。NAT设备后面的集群NAT,即网络地址转换,常用的路由器就是NAT设备。在有NAT设备的网络拓扑中,局域网内的主机只有内网IP,没有公网IP。网络如下:在这种网络模型下,每个服务器节点主机通过路由器8.8.8.8连接到PulseCloud,所以PulseCloud只能获取到每个服务器的公网IP为8.8.8.8。上面提到PulseCloud会默认使用公网IP,8.8.8.8是Flannel的联网IP。在这种情况下,Flannel的组网会失败,甚至Flannel无法启动,因为宿主机上没有IP为8.8.8.8的网卡。解决这个问题,只需要手动设置每个节点的联网IP即可。一些云服务商的主机也在NAT设备后面,比如阿里云服务器。如果使用阿里云的VPC网络,即使服务器绑定了公网IP8.8.8.8,也没有从host绑定。公网IP只有一张网卡,原因是有NAT设备。在这种情况下,您还需要将内网IP指定为组网络IP。