
#打卡不停更# calico IPIP 跨节点通信 原创
当前环境信息
路由聚合
blockSize: 26
虽然,calico 默认限制了每个网段只有 64 的 IP 地址,但是如果一个 node 上超过 64 个地址,还是会继续分配一个 网段。
node 节点的出口采用路由聚合的方式,比如, 将 26 位的掩码聚合成 25位,或者 24位的掩码,这样路由的条目就会大大减少。
Always or CrossSubnet
ipipMode: Always
Always:表示跨节点通信一直使用 IPIP 封装
CrossSubnet:表示在同一个二层,跨节点通信走本地路由,而跨三层的节点互相通信则会通过 IPIP 封装。
BGP
IPIP 模式需要 BGP 来建立节点间的邻接关系,VXLAN 不需要
服务器模拟 IPIP 通信
便于理解,我们在服务器上模拟,tunl1 与 tunl2 之间通过 IPIP 的模式进行通信
1.开启路由模块
2.创建两个名称空间
3.创建两对veth-pair
4.分别给两对 veth-pair 配置上 IP 地址
查看配置是否生效
5.命名空间添加路由
默认新添加的 ns 里没有出去的路由,所以需要我们添加一下
新创建的 Pod 就不会存在这种情况,因为 cni 会默认给我们创建出去的路由
添加 route
查看 route
v1 ping v2 测试连通性
6.创建tunl 和 IPIP Mode
在其对应的名称空间创建 tunnel 设备,并设置隧道模式 ipip,然后还需要设置隧道端点,用 remote 和 local 表示,对应的表示隧道外层 IP,用 ip addr xx peer xx 表示
查看配置
7.抓包验证
对tunl设备抓包,查看原始报文
我们对 v1 或者 v1_p 进行抓包,veth pair 网卡对的报文一致
我们可以看到,原始报文和封装以后的报文,是 ip in ip 的模式
Calico IPIP 跨节点通信数据流向图
环境信息
背景
pod1 10.244.42.68 node1 192.168.0.81
pod2 10.244.103.67 node2 192.168.0.82
pod1 ping pod2
node 路由表
通过路由表,我们可以发现,192.168.0.0 大网段都是通过的 ens33 网卡通信。
任一 node 节点的 ens33 抓包即可
我们采用的是 pod1 ping pod2 ,针对 node1 节点 ens33 网卡进行抓包
Raw IP
我们可以发现, IP in IP 类型的报文都忽略了原始数据包文的 MAC 地址,只有 IP 地址,这种格式的报文,我们称之为 RAW Data
对 tun 设备直接抓包就可以直接识别为 Raw Packet data
TUN/TAP/Tunl
TUN 是 Linux 内核提供的特性,一端在内核协议栈,另一端在用户空间,负责对用户空间和内核协议栈进行报文转发,特点是 TUN 是三层通信,只有 IP地址,没有 MAC 地址,比如 Flannel UDP 模式。
TAP 也是 Linux 内核提供的特性,所有的 veth-pair 都是二层设备,特点是二层通信,具有 MAC 地址。
Tunl 特点也是三层通信,只有 IP 地址,没有 MAC 地址,也是 Raw Data,但是它的两端都在内核空间,并没有在用户空间,这个是和 TUN 设备最大的区别。
TUN 和 tunl 设备不是同一个设备,虽然都是 RAW data,都是三层,但是 calico tunl 的一端并没有在用户空间里,两端都在内核空间,不然 Flannel IPIP 和 Flannel UDP 没有区别。
