flannel使用的镜像为quay.io/coreos/flannel:v0.12.0-amd64
下载地址:https://github.com/coreos/flannel/releases
nodes | 容器(pod) | cni0 | flannel.1 |
---|---|---|---|
172.25.60.3(server3) | 10.244.1.36 | 10.244.1.1/24 | 10.244.1.0/32 |
172.25.60.4(server4) | 10.244.2.35 | 10.244.2.1/24 | 10.244.2.0/32 |
(1)在node上创建的容器通过网关将数据传送的cni0
10.244.1.36---->10.244.1.1
容器在物理机上的veth59aab0aa网卡上,因为使用cji接口标准,所以veth59aab0aa网卡会桥接在cni0网桥上。
[root@server3 ~]# brctl show
bridge name bridge id STP enabled interfaces
cni0 8000.1a5f8fc31ca1 no veth59aab0aa
(2)数据包走到cni0网桥后,通过查看路由表
[root@server3 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.25.60.250 0.0.0.0 UG 0 0 0 eth0
10.244.0.0 10.244.0.0 255.255.255.0 UG 0 0 0 flannel.1
10.244.1.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
10.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1
根据路由和掩码,选择对应的flannel.1(.1表示cni0的值),下一跳就是10.244.2.0
(3)进入到flannel.1,封装数据包(vtep进行封装和解封的工作),通过arp来获取对应的mac地址
[root@server3 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.244.2.0 ether ba:30:dd:e7:1a:d0 CM flannel.1
查看目标flannel.1的mac地址:mac地址相同
[root@server4 ~]# ip addr show
6: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
link/ether ba:30:dd:e7:1a:d0 brd ff:ff:ff:ff:ff:ff
inet 10.244.2.0/32 scope global flannel.1
valid_lft forever preferred_lft forever
inet6 fe80::b830:ddff:fee7:1ad0/64 scope link
valid_lft forever preferred_lft forever
(4)在宿主机之间通过udp传输,进而将server3上的flannel.1上的数据帧发送出去,但是如何知道10.244.2.0 在server4上呢?
通过查看桥接转发的数据库
[root@server3 ~]# bridge fdb show
ba:30:dd:e7:1a:d0 dev flannel.1 dst 172.25.60.4 self permanent
a2:a5:59:51:c7:81 dev flannel.1 dst 172.25.60.4 self permanent
0a:a6:f9:a3:06:4a dev flannel.1 dst 172.25.60.2 self permanent
06:59:bf:4a:4d:f4 dev flannel.1 dst 172.25.60.2 self permanent
所以可以知道ba:30:dd:e7:1a:d0(mac地址)在172.25.60.4宿主机上
(5)查找172.25.60.4对应的mac地址
[root@server3 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
172.25.60.4 ether 52:54:00:4d:cd:c9 C eth0
查看server4上的eth0的mac地址:与上面相同
[root@server4 ~]# ip addr show
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:4d:cd:c9 brd ff:ff:ff:ff:ff:ff
inet 172.25.60.4/24 brd 172.25.60.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe4d:cdc9/64 scope link
valid_lft forever preferred_lft forever