摘要:bird(BGP Client)通过BGP协议告诉剩余calico节点,从而实现网络互通。
calico是目前主流的kubernetes cni插件。
目前封装是一个kubernetes网络插件的主流技术。
calico的架构分成:
①:felix
②:bird(BGP client)
③:confd
calico支持通过api-server或者直接连通etcd进行存储数据。
非覆盖网络underlay通过BGP协议将我们整个的pod规划成路由。
Felix的作用:
①:管理网络接口
②:编写路由
③:编写ACL
④:报告状态
bird(BGP Client)通过BGP协议告诉剩余calico节点,从而实现网络互通。
confd 通过监听etcd来了解bgp配置和全局默认值的修改。confd将etcd的数据更新动态生成bird的配置文件。当配置文件更改时,confd触发bird重新加载新配置。
calico通过felix、bird、confd三个组件的协同,来达到网络扁平化的目的。
VxLAN:(Virtual Extensible LAN),虚拟可扩展局域网,VxLAN是Linux本身支持的一种网络虚拟化技术。VxLAN可以完全在内核态实现封装和解封装工作,从而实现“隧道”机制,构建出覆盖网络(Overlay Network)。
VxLAN是基于三层的“二层”通信,层即vxlan包封装在UDP数据包中,要求udp在kubernetes节点间三层可达。二层即vxlan封包的源MAC地址和目的MAC地址是自己的vxlan设备MAC和对端vxlan设备MAC实现通讯。
flannel网络模式是在用户空间加了一个flanneld这样一个进程,数据报文的封装和解封需要在用户空间完成。用户空间和内核空间发生数据交换,需要拷贝,是需要消耗资源的。如果封装和解封装在内核空间完成的话,那么效率是足够高的,不会发生跟用户空间的拷贝关系。
隧道就是在外面套上一层壳,calico网络模式利用VxLAN技术,实现网络的扁平化。
UDP数据包在k8s节点之间三层可达,就是说udp数据包经过kubernetes 节点的网卡,不管是通过路由器或者交换机是一种三层可达的状态,三层可达的状态比二层可达的状态要求要低,因为可以跨越广播域。二层可达是基于MAC地址的寻址实现的,三层只不过是一种跨节点通讯的手段。
基于三层的二层通讯,一般在每个kubernetes的node节点上都有calico-vxlan设备,当数据报文下潜到内核态的时候,vxlan设备calico-vxlan就会工作在外层,封装数据包的vxlan信息,实现vxlan改造,跨节点实现对应的连通通信。
VxLAN底层的封包模型是在原始报文前面加上vxlan封装。
原始报文分成:负载、内层IP头部、内层以太网头部。负载就是报文本身,也就是承载的真实数据段。
VxLAN封装分成:VxLAN头部、外层UDP头部、外层IP头部、外层以太网头部。
VxLAN封装是封装的自己的VxLAN的MAC信息和对方VxLAN的MAC信息去实现通讯。
VxLAN需要进行数据包的封包,在VxLAN设备上将pod发来的数据包源MAC、目的MAC修改为本机VxLAN网卡和对端节点VxLAN网卡的MAC信息。外层UDP目的IP地址根据路由和对端VxLAN的MAC查fdb表去获取。
FDB表是MAC地址和IP地址对应表。VxLAN通过UDP跨节点实现数据传递,再通过VxLAN的MAC信息去进行通信。
VxLAN的优势:只要kubernetes节点之间三层是互通的,就可以达到扁平化的网络通信。VxLAN可以跨网段,尤其是大规模的网络环境,VxLAN对主机网关路由没有特殊要求。kubernetes 各个worker node节点通过VxLAN设备实现基于三层的二层互通,三层即VxLAN数据包封装在UDP数据包中,要求UDP在kubernetes节点间三层可达,可以跨路由。
二层即VxLAN封包的源MAC地址和目的MAC 地址是自己的VxLAN设备MAC和对端VxLAN设备的MAC地址。
VxLAN的缺点是进行数据包的封包和解包会存在一定的性能损耗。
--name:CALICO_ipv4POOL_VXLAN
--name:CALICO_IPv6POOL_VXLAN
--value:"Always"
更改calico_backend:"bird"为:
calico_backend:"vxlan"
注释掉网桥做的存活探测和就绪探测:
#--bird-live
#--bird-ready
验证calico使用vxlan模式:
ifconfig vxlan.calico
开启calico的vxlan模式之后,系统中会多出来vxlan.calico这样的一个网卡。
或者执行:
calicoctl node status
查看当前节点的BGP信息。由于我们的vxlan直接通过对方的vxlan设备列表去实现查询MAC信息查询,所以不需要BGP协议去获取其他的相关信息,vxlan不需要BGP协议建立节点间的邻接关系。
看到结果是空的,证明开启的是vxlan模式。
calico架构还有另外一种模式是IPIP模式。
IPIP模式是Linux原生支持的,IPIP隧道的工作原理是将源主机的IP数据包封装在一个新的IP数据包内,新的IP数据包的目的地址是隧道的另一端。在隧道的另一端,接收方将解封装原始的IP数据包,并将其传递到目标主机。IPIP隧道可以在不同的网络之间建立连接,例如在ipv4和IPv6网络之间建立连接。
IPIP的隧道设备是tunl0,数据包首先会发到自己的tunl0,然后网卡会通过IP封装包的方式将数据报文传递到另外一个节点的 tunl里面,另外一个tunl在获取到数据包之后,解封装三层头部,然后放到pod中,这样就实现了数据的传递。
原始的数据包结构是数据负载、TCP标记、源IP地址和目的IP地址,也就是IP标记部分。
数据报文被隧道接口进行二次封装之后,在原始的数据报文前面封装了新的IP头部。包括:数据负载、TCP标记、原始的IP头部、新的IP头部。新的IP头部就是自己物理网卡的IP地址和对方主机的物理网卡的IP地址。这样数据报文就可以在三层网络中进行传输。
数据报文到达对方目的主机之后,隧道设备会把数据包的前面新的IP头部拆掉,然后再把剩余的数据包进行本机路由,找到对方的目的地。
ipip模式:数据包的封包,在tunl0设备上将pod发送来的数据包的MAC层去掉,留下IP层封包。外层数据包目的IP地址根据路由得到。
ipip模式的优点是:只要kubernetes节点间三层互通,可以跨网段,对主机网关路由均没有没有特殊要求。
Calico架构的ipip模式缺点是:需要进行ipip的数据包封装和解封装,会存在一定的性能消耗。
Calico架构的ipip模式和vxlan模式都会存在一定的性能损耗,因为要做数据包的二次封装,ipip模式不可以ipv4跨ipv6的。
开启ipip模式:
--name:CALICO_IPV4POOL_IPIP
--value:"Always"
--name:CALICO_IPV4POOL_VXLAN
--value:"Never"
--name:CALICO_IPV6POOL_VXLAN
--value:"Never"
模式验证:
第一种:
ifconfig tunl0
每台服务器会有一个tunl0的网卡,它就会对当前的数据报文做三层头部信息的封装。
第二种:
calicoctl node status
可以看到BGP协议,获取到的相邻信息,这样就知道对方的物理IP和私有IP的关联。
网络插件
鼓励的话语:遇事要忍,出手要狠,善后要稳!
来源:图图k科技君