Calico 是常用的一种 CNI 实现,一开始我以为它的实现会是:
- 通过 Linux Network Bridge 和 Veth Pair 连接 Node 上各个 Pod 的网络
- 通过 VXLAN 连接不同 Node 之间的网络
但实际实现上,Calico 并没有使用 Bridge,而是使用了另外的方式来连接 Node 上的 Pod 网络:
- Calico 为每个 Pod 创建了一个 Veth Pair,一端放在 Host Namespace,一端在 Pod Namespace
root@node:~# ip link 7: vxlan.calico: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default link/ether 66:8d:0d:bd:bd:a0 brd ff:ff:ff:ff:ff:ff 91: cali2953e0ed0cf@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 0
- 设置 Pod Namespace 中默认路由为 169.254.1.1,从 Namespace 内的 Veth 出去
root@pod:/# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 169.254.1.1 0.0.0.0 UG 0 0 0 eth0 169.254.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
- 由于 169.254.1.1 不在当前网段,同时 Calico 为 Veth 开启了 arp proxy 功能,因此,当发往 169.254.1.1 的包会交给 Host Namespace 下的路由转发
root@node:~# cat /proc/sys/net/ipv4/conf/cali2953e0ed0cf/proxy_arp 1
- 而 Calico 也早就将当前 Node 上各 Pod 的 IP 写入了 Node 的路由表,这样,发往当前 Node 其他 Pod 的包会直接被转发给该 Pod 在 Host Namespace 的 Veth 端上
root@node:~# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 172.25.80.1 0.0.0.0 255.255.255.255 UH 0 0 0 cali2953e0ed0cf 172.25.80.3 0.0.0.0 255.255.255.255 UH 0 0 0 cali15236e67fdf 172.25.80.4 0.0.0.0 255.255.255.255 UH 0 0 0 calidabe3f99304 172.25.80.5 0.0.0.0 255.255.255.255 UH 0 0 0 cali553d400c685 172.25.80.6 0.0.0.0 255.255.255.255 UH 0 0 0 calie3b188bf996 172.25.80.7 0.0.0.0 255.255.255.255 UH 0 0 0 cali13506cb9162 172.25.80.8 0.0.0.0 255.255.255.255 UH 0 0 0 cali0e7cdac5a72 172.25.80.9 0.0.0.0 255.255.255.255 UH 0 0 0 cali1eb9c648dc7 172.25.80.10 0.0.0.0 255.255.255.255 UH 0 0 0 calie3d33a381bd 172.25.80.11 0.0.0.0 255.255.255.255 UH 0 0 0 cali72bc6ba5255
- 而其他 Node 的请求会通过本机的 VXLAN Tunnel 发送,FDB 表也能找到对应的记录
root@node:~# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.17.106.0 172.17.106.0 255.255.255.0 UG 0 0 0 vxlan.calico 172.18.141.0 172.18.141.0 255.255.255.0 UG 0 0 0 vxlan.calico 172.20.30.0 172.20.30.0 255.255.255.0 UG 0 0 0 vxlan.calico 172.24.130.0 172.24.130.0 255.255.255.0 UG 0 0 0 vxlan.calico 172.28.221.0 172.28.221.0 255.255.255.0 UG 0 0 0 vxlan.calico root@node:~# bridge fdb 66:4a:bf:03:e5:31 dev vxlan.calico dst 192.168.1.247 self permanent 66:fe:70:54:93:0c dev vxlan.calico dst 192.168.1.214 self permanent 66:ff:7d:9e:13:88 dev vxlan.calico dst 192.168.1.8 self permanent 66:cd:13:6f:ac:f5 dev vxlan.calico dst 192.168.1.183 self permanent 66:fc:db:06:e2:6c dev vxlan.calico dst 192.168.1.93 self permanent 66:eb:56:ef:c0:9d dev vxlan.calico dst 192.168.1.216 self permanent