文章目录
Flannel vxlan
与 host-gw 对比,可以看出各个节点上 路由信息有所不同
指向其他节点网段的路由 10.244.1.0/24 via 192.168.100.112 dev ens10 变成 10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink
Flannel vxlan backend
接 Flannel 介绍中原理章节
- 使用 backendManager 去注册网络时,使用 vxlan 的实现
- 在节点上创建 vxlan 设备,vni = 1,name = flannel.1,vtepPort = 0,vtepIndex = ens10 的 index,vtepAddr = ens10 的 ip
# ip -d link show flannel.1
12: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/ether 7e:6c:7d:fa:00:b0 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535
vxlan id 1 local 192.168.100.111 dev ens10 srcport 0 0 dstport 8472 nolearning ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 gro_max_size 65536
- AcquireLease 去申请 subnet,k8s-api 的模式下,通过 Annotation 去分析;
metadata:
annotations:
flannel.alpha.coreos.com/backend-data: '{"VNI":1,"VtepMAC":"7e:6c:7d:fa:00:b0"}'
flannel.alpha.coreos.com/backend-type: vxlan
flannel.alpha.coreos.com/kube-subnet-manager: "true"
flannel.alpha.coreos.com/public-ip: 192.168.100.111
- 配置 flannel.0 ip,通过分到的网段加 32 位掩码 如:10.244.0.0/32,写 32 位掩码是不要创建 广播路由
在 Flannel 启动后
接 Flannel 介绍中原理章节
当新增 node 时,配置本节点路由信息,其他 node 的 subnet 指向对端的 flannel.0 ip,通过本节点 flannel.0;
流量分析
同 node 不同 pod 之间
pod1 <-> pod2
和 host-gw 场景相同,通过 cni0 转发
不同 node 上 pod 之间
pod1 <-> pod3
在 pod1 和 pod3 抓包是实际报文
21:33:28.347401 ae:a4:10:a2:01:d7 > e6:9c:fa:e2:8e:20, ethertype IPv4 (0x0800), length 98: 10.244.0.7 > 10.244.1.20: ICMP echo request, id 48047, seq 7, length 64
21:33:28.352291 e6:9c:fa:e2:8e:20 > ae:a4:10:a2:01:d7, ethertype IPv4 (0x0800), length 98: 10.244.1.20 > 10.244.0.7: ICMP echo reply, id 48047, seq 7, length 64
在 业务网卡抓包 ens10,是 vxlan 报文
Node 到本 node 上的 pod
和 host-gw 场景相同,通过 cni0 转发
Node 到其他 node 上的 pod
在业务网卡抓包,内部报文 srcIP 为 flannel.0 ip,根据路由 ==10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink ==,外层报文即 两个 endpoint 信息。
Pod 访问 service clusterIP
和 host-gw 场景相同
Node 访问 service clusterIP
Pod 在当前节点的情况 和 host-gw 一样
Pod 在非当前节点的在 业务网卡抓到 vxlan 报文
外部访问 service NodePort,且 backend pod 在当前节点
和 host-gw 场景相同
外部访问 service NodePort,且 backend pod 不在当前节点
在 业务网卡抓包,根据路由组成业务报文,然后 vxlan 封装
总结
将 vxlan 和 host-gw 进行比对,可以看到跨节点的业务报文会被 vxlan 封装,默认端口 8472,vni ID 为 1。