kubernetes基础知识之underlay与overlay网络

360影视 2025-01-11 07:54 2

摘要: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科技君

相关推荐