K8s部署之解决在Flannel中跨主机互联网络问题
当您将多台服务器节点组成一个Docker集群时,需要对集群网络进行设置,否则默认情况下,无法跨主机容器互联,接下来我们首先分析一下原因。
跨主机容器互联
下图描述了一个简单的集群网络,在该集群内,有两台服务器甲和乙,每台服务器上都有两张网卡,分别连接公网和私网,两台服务器可以通过私网互联,在两个服务器节点上分别安装了Docker,并且运行了A/B/C/D 4个容器。
每台服务器节点上都有一个
docker0网桥,这是docker启动后初始化的虚拟设备,每个容器都与
docker0网桥连接,并且,容器的IP由docker自动分配。
但是这个默认情况下的网络设置不支持跨主机的容器互联,原因有两方面。
一,跨主机访问容器,没有有效路由
比如,容器A要访问容器D,请求的地址为
192.168.1.4,但是主机甲并不知道该将这个IP发送到那个网络设备上,主机甲也不知道主机乙内部有个容器D。
二,多个节点上的容器网段冲突
默认情况下,docker启动后初始化 docker0 网桥时,会随机分配一个IP段,那么,如果不加以协调,多个节点内的容器网络有可能会冲突,比如上图中两个网络都采用了
192.168.1.1/24网段,在这种情况下,就会导致容器IP冲突,比如 B 和 C。
那么,只需要解决这两个问题,我们就可以实现跨主机的容器互联。
脉冲云集群网络设置
使用脉冲云可以非常轻易地完成集群网络设置。在增加集群时,只需要将集群的网络类型设置为Flannel即可。
Flannel 是一个专门用于容器网络互联的软件,脉冲云会自动地在您的服务器节点上部署Flannel实现容器互联。
设置Flannel时,可以指定容器局域网段和子网掩码,如上图所示,如果选择局域网段为
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,那么我们就可以组成下图中所示网络。
图中,主机甲的docker被分配到了
172.16.0.1/20子网,主机已的docker被分配到了
172.16.16.1/20子网,两个子网都处在一个由Flannel管理的虚拟网络
172.16.0.0/12中,图中以虚线代表。
到此,在Flannel的协调下,各个主机上的Docker子网IP就不会再冲突了,另外,Flannel会维护容器网络的路由规则,容器A就可以通过
172.16.16.3访问容器D了,也就实现了跨主机容器互联。
Flannel维护的容器网络是一个虚拟网络,在图中的虚线也是为了抽象理解,如果你对Flannel的实现方式感兴趣,可以继续查阅Flannel的官方文档。
一些说明
· 上文中为了简化方便理解,网桥IP和子网IP段没有分开说明,在上图中,主机甲所分配的子网网段是
172.16.0.0/20,网段中的第一个IP172.16.0.1,用作网桥设备的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给主机乙上的容器D发送数据,数据会被路由到 docker0 网桥上,然后数据会被Flannel通过主机甲的真实网卡,发送到主机乙的网卡上,主机乙上运行的Flannel,继续将数据转发到主机乙的
docker0网桥上,最后到达容器D。
那么如果主机有多张网卡,就像图中那样,有两张网卡分别连接公网和私网,那么我们需要为Flannel指定一个网卡/IP用以发送数据,这个IP,我们称为 组网IP。即告诉主机甲上运行的Flannel,使用哪个网卡/IP 去寻找主机乙。
使用脉冲云组建的集群,会默认使用节点的公网IP作为组网IP。那么,多个节点之间的数据通信会被发送到公网之上,除非是跨机房互联,一般情况下,我们希望节点间通过内网传输数据,以提高性能,或降低费用。
将主机添加到集群后,在主机设置页面,选择组网IP即可指定各个主机节点分别使用的组网IP。
NAT设备后的集群
NAT,即网络地址转换,常用的路由器就是NAT设备,在有NAT设备的网络拓扑中,局域网内的主机只有内网IP,没有公网IP,网络如下所示:
在这种网络模型下,各个服务器节点主机都通过路由器
8.8.8.8连接脉冲云,所以脉冲云只能获取到各个服务器的公网IP为
8.8.8.8,按上文所述,脉冲云会默认使用公网IP
8.8.8.8作为Flannel的组网IP,在这种情况下,会导致Flannel组网失败,甚至Flannel会无法启动,因为主机上并不存在一个IP为
8.8.8.8的网卡。
为解决这种问题,只需要手动设置每一个节点的组网IP即可。
某些云服务商的主机也是在NAT设备之后的,比如阿里云服务器,如果使用了阿里云的VPC网络,即使给服务器绑定了公网IP
8.8.8.8,但是从主机上看,并没有绑定公网IP的网卡设备,只有一个内网网卡,原因就是有NAT设备存在。这种情况下,也需要指定内网IP为组网IP。文章分享来自:脉冲云开发平台 阅读更多
- k8s部署测试网络不通问题解决思路
- 用nat转换解决内网主机访问网络的问题
- 解决服务器windows主机显示本地连接网络电缆没插好问题
- 网络上连接Windows主机的问题及解决办法
- virtualbox虚拟机(Ubuntu16.04)在网络设置有NAT和only主机两块网卡时,安装ssh显示无法解析地址的问题解决
- Kubernetes1.91(K8s)安装部署过程(五)--安装flannel网络插件
- 主机网络ping: unknown host baidu.com问题解决
- CuteEdit 虚拟主机部署出错的问题解决
- 解决自动部署到jboss时,设置虚拟主机的问题。
- 解决家庭网络下PHPStorm无法连接线上主机xdebug服务的配置问题
- 小技巧:利用虚拟网卡解决虚拟主机引起的异构网络问题
- 如何解决容器网络性能及复杂网络部署问题?
- 解决自动部署到jboss时,设置虚拟主机的问题。
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之flanneld网络介绍及部署(三)
- 解决Win10服务主机本地系统网络受限,磁盘占用率过高的问题
- VM虚拟机Solaris系统与主机WinXP系统网络不通问题解决
- 解决pxe网络批量安装部署linux遇到的问题和解决方法
- Spring Boot打包war部署到tomcat,并解决404问题
- 解决ubuntu13.04 有线网络 时常掉线的问题
- 超难网络问题,有人能解决吗?