目前,已经有多个开源组件支持容器网络模型。常见的网络组件,包括Flannel、Open vSwitch、直接路由和Calico。
1.Flannel
Flannel之所以可以搭建k8s依赖的底层网络,是因为它能实现以下两个功能。
(1)它能协助k8s,给每一个Node上的Docker容器分配互相不冲突的IP地址。
(2)它能在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内。
2.Open vSwitch
Open vSwitch是一个开源的虚拟交换软件,类似于Linux中的Bridge,但是功能要复杂得多。Open vSwitch的网桥可以直接建立多种通信通道(隧道),如Open vSwitch with GRE/VxLAN。这些通道的建立可以很容易地通过OVS的配置命令实现。在k8s、Docker场景下,通常主要建立L3到L3的隧道。
3.直接路由
通过直接手动写路由的方式,以实现Node之间的网络通信功能。该直接路由配置方法的问题是,在集群节点发生变化时,需要手动维护每个Node上的路由表信息,效率很低。为了有效管理这些动态变化的网络路由信息,动态地让其他Node都感知到,需要使用动态路由发现协议来同步这些变化。
在实现这些动态路由发现协议的开源软件中,常用的有Quagga、Zebra等。
4.Calico
Calico是容器网络的又一种解决方案,与其他虚拟网络最大的不同是,它没有采用overlay网络做报文的转发,提供了纯3层的网络模型。三层通信模型表示每个容器都通过IP直接通信,中间通过路由转发找到对方。
在这个过程中,容器所在的节点类似于传统的路由器,提供了路由查找的功能。要想路由能够正常工作,每个虚拟路由器(容器所在的主机节点)必须有某种方法知道整个集群的路由信息,Calico采用的是BGP路由协议,其全称是Border Gateway Protocol。
除了能用于容器集群平台Kubernetes、共有云平台AWS、GCE等,也能很容易地集成到openstack等IaaS平台。
Calico在每个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发。每个vRouter通过BGP协议把在本节点上运行的容器的路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则。
Calico保证所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。Calico节点组网可以直接利用数据中心的网络结构(L2或者L3),不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络通信效率。
标签:容器,网络,节点,开源,组件,vSwitch,k8s,Calico,路由 From: https://blog.51cto.com/key3feng/6517471