kubernete的网络模型假定了所有的pod都在一个可以直接联通的扁平网络里,以方便pod之间的通讯。但在实际搭建k8s集群时,这个假定的容器通讯网络并不存在,需要我们来实现。k8s虽然没有实现该功能,但是定义了网络插件接口即CNI,只要满足CNI标准,都可以用来创建和管理k8s的扁平网络
因此我们需要借助一些开源插件来创建和管理k8s的扁平化网络,常见的有calico,flannel,open-vswitch。
网络插件的本质作用有两点:
- 为POD创建设备接口,并连接到宿主机网桥上
- 为POD分配唯一的IP地址,并维护路由可达
Flannel插件
flannel工作原理:
分配IP:
flannel会连接etcd集群,获取可用的ip网段,并将子网配置信息写入docker配置文件,以此来管理和控制各个节点的子网分配。同时会监控pod地址,在内存中维护一张pod路由表。
传输数据:
源pod数据首先会到达docker网桥,网桥将数据发送给flannel进程,flannel进程使用UDP协议二次封包,读取路由表,利用宿主机网络,将数据包发送给目标主机上的flannel进程。目标主机flannel进程会进行拆包,然后将数据发送给docker网桥,进而发送给目标pod
Calico插件
calico是基于BGP协议的纯三层的网络方案,它利用linux内核的功能,把宿主机节点变成了一个路由器(vRouter), 通过BGP协议把本机上所有的容器路由信息广播出去,并自动设置到其他节点的路由转发规则。它保证了POD之间的数据流量都是通过IP路由的方式来转发的,不需要额外的隧道或者NAT,相比flannel,少了二次封包和拆包的过程,可以节省CPU资源,提升网络转发效率
felix:运行在每个节点上,作用是给容器分配网络和ip,管理路由规则和iptables规则
bird: 负责把felix设置的路由信息通过bgp广播到calico网络域,以实现路由互通
calico的优势是转发效率高,延迟低,可以实现大规模复杂组网,同时支持丰富的网络策略,可以实现复杂的流量控制
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。