容器跨主机通信
Kubernetes的网络模型
容器和容器之间要互相通信、容器和宿主机之间也要互相通信,简单理解为就是所有网络之间都要可以进行通信;
解决方案(一) ---> Flannel项目
Flannel项目是CoreOS公司主推的容器网络解决方案,Flannel本身只是一个框架,真正提供网络功能的是 Flannel的后端实现,支持三种后端:
1、VXLAN
Virtual Extensible LAN(虚拟可扩展局域网),是Linux内核本身支持的一种网络虚拟 化技术;
VXLAN设计思想:在现有的三层网络之上,"覆盖" 一层虚拟的、由内核VXLAN维护的一 个二层网络,所有容器只要连接到这个二层网络之上,就可以像在一个局域网中进行通 信;
二层网络之间要有一个通信的隧道,VXLAN会在宿主机上设置一个VTEP设备作为隧道两 端;VTEP设备就是(flannel.1)网络设备;
Linux内核会把目的VTEP设备的MAC地址,封装成一个二层数据帧,但是这个时候的二 层数据帧是没有办法直接通信的,然后Linux内核会把"二层数据帧"封装成内部数据帧, 通过宿主机的eth0网卡进行传输;
访问流程:
容器的IP地址--->cni0网桥--->到达本机flannel.1隧道入口--->被Linux内核封装成内 部数据帧--->通过宿主机的eth0网卡进行传输;
CNI设计思想:
Kubernetes在启动Infra容器之后,就可以直接调用CNI网络插件,为这个Infra容器
的Network Namespace,配置网络栈;
网络栈(网卡、路由表、IPTABLES规则)
2、HOST-GW
访问流程:
将每个flannel子网,的"下一跳",设置成对应宿主机的IP;
容器的IP地址--->cni0网桥---->到达flannel.1--->下一跳地址直接就是对应宿主机的IP 地址;
隧道模式和三层网络模式:
不同点:
三层网络是通过配置下一跳主机的路由规则实现互通,隧道是通过在你的IP包外在 封装一个MAC包头来实现的
3、UDP
这种方式已经弃用了,性能很差, 因为封装和解封装需要从用户态到内核态进行多次切 换;