flannel工作原理

flannel模型

  • udp:使用用户态udp封装,默认使用8285端口。由于是在用户态封装和解包,性能上有较大的损失
  • vxlan:vxlan封装,需要配置VNI,Port(默认8472)和GBP
  • host-gw:直接路由的方式,将容器网络的路由信息直接更新到主机的路由表中,仅适用于二层直接可达的网络     推荐使用,效率极高
  • aws-vpc:使用 Amazon VPC route table 创建路由,适用于AWS上运行的容器
  • gce:使用Google Compute Engine Network创建路由,所有instance需要开启IP forwarding,适用于GCE上运行的容器
  • ali-vpc:使用阿里云VPC route table 创建路由,适用于阿里云上运行的容器

host-gw模型

《flannel工作原理》
在主机的路由表中创建到其他主机 subnet 的路由条目,从而实现容器跨主机通信
[root@hdss7-21 flannel]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.4.7.1        0.0.0.0         UG    100    0        0 eth0
10.4.7.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
172.7.21.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.7.22.0      10.4.7.22       255.255.255.0   UG    0      0        0 eth0

Vxlan模型

《flannel工作原理》
VXLAN是Linux内核本身支持的一种网络虚拟化技术,是内核的一个模块,在内核态实现封装解封装,构建出覆盖网络,其实就是一个由各宿主机上的Flannel.1设备组成的虚拟二层网络,由于VXLAN由于额外的封包解包,导致其性能较差。

使用Vxlan模型

关闭flanne

[root@hdss7-21 flannel]# supervisorctl stop flanneld-7-21
flanneld-7-21: stopped
[root@hdss7-21 flannel]# ps -ef|grep flannel
root      93584      1  0 11:04 ?        00:00:34 ./flanneld --public-ip=10.4.7.21 --etcd-endpoints=https://10.4.7.12:2379,https://10.4.7.21:2379,https://10.4.7.22:2379 --etcd-keyfile=./cert/client-key.pem --etcd-certfile=./cert/client.pem --etcd-cafile=./cert/ca.pem --iface=eth0 --subnet-file=./subnet.env --healthz-port=2401
root     159370 117643  0 14:14 pts/1    00:00:00 grep --color=auto flannel
[root@hdss7-21 flannel]# kill -9 93584
删除路由
[root@hdss7-21 flannel]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.4.7.1        0.0.0.0         UG    100    0        0 eth0
10.4.7.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
172.7.21.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.7.22.0      10.4.7.22       255.255.255.0   UG    0      0        0 eth0
[root@hdss7-22 flannel]# route del -net 172.7.22.0/24 gw 10.4.7.22
删除etcd的网络配置
[root@hdss7-21 etcd]# ./etcdctl rm /coreos.com/network/config
PrevNode.Value: {"Network": "172.7.0.0/16", "Backend": {"Type": "host-gw"}}
[root@hdss7-21 etcd]# ./etcdctl get /coreos.com/network/config
Error:  100: Key not found (/coreos.com/network/config) [15]
重新添加网络配置
[root@hdss7-21 etcd]# ./etcdctl set /coreos.com/network/config '{"Network": "172.7.0.0/16", "Backend": {"Type": "VxLAN"}}'
{"Network": "172.7.0.0/16", "Backend": {"Type": "VxLAN"}}
[root@hdss7-21 etcd]# ./etcdctl get /coreos.com/network/config
{"Network": "172.7.0.0/16", "Backend": {"Type": "VxLAN"}}
启动flannel
[root@hdss7-21 etcd]# supervisorctl start flanneld-7-21
测试
[root@hdss7-21 etcd]# ping 172.7.22.2
PING 172.7.22.2 (172.7.22.2) 56(84) bytes of data.
64 bytes from 172.7.22.2: icmp_seq=1 ttl=63 time=16.6 ms
64 bytes from 172.7.22.2: icmp_seq=2 ttl=63 time=1.06 ms

[root@hdss7-21 etcd]# ifconfig
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 172.7.21.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::a0ce:40ff:fedd:e054  prefixlen 64  scopeid 0x20<link>
        ether a2:ce:40:dd:e0:54  txqueuelen 0  (Ethernet)
        RX packets 4  bytes 336 (336.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4  bytes 336 (336.0 B)
        TX errors 0  dropped 8 overruns 0  carrier 0  collisions 0

[root@hdss7-22 flannel]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.4.7.1        0.0.0.0         UG    100    0        0 eth0
10.4.7.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
172.7.21.0      172.7.21.0      255.255.255.0   UG    0      0        0 flannel.1
172.7.22.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0

VXLAN的Directrouting模式

VXLAN还有另外一种功能,VXLAN也支持类似host-gw的玩法,如果两个节点在同一网段时使用host-gw通信,如果不在同一网段中,即 当前pod所在节点与目标pod所在节点中间有路由器,就使用VXLAN这种方式,使用叠加网络。
结合了Host-gw和VXLAN,这就是VXLAN的Directrouting模式
'{"Network": "172.7.0.0/16", "Backend": {"Type": "VxLAN","Directrouting": true}}'
[root@hdss7-21 etcd]# supervisorctl stop flanneld-7-21
[root@hdss7-21 etcd]# ps -ef|grep flannel
[root@hdss7-21 etcd]# kill -9 162693
[root@hdss7-21 etcd]# ./etcdctl rm /coreos.com/network/config
[root@hdss7-21 etcd]# ./etcdctl get /coreos.com/network/config
[root@hdss7-21 etcd]# ./etcdctl set /coreos.com/network/config '{"Network": "172.7.0.0/16", "Backend": {"Type": "VxLAN","Directrouting": true}}'
[root@hdss7-21 etcd]# ./etcdctl get /coreos.com/network/config
[root@hdss7-21 etcd]# ./etcdctl ls /coreos.com/network/subnets
/coreos.com/network/subnets/172.7.21.0-24
/coreos.com/network/subnets/172.7.22.0-24
[root@hdss7-21 etcd]# ./etcdctl ls /coreos.com/network/subnets/172.7.22.0-24
/coreos.com/network/subnets/172.7.22.0-24
[root@hdss7-21 etcd]# ./etcdctl get  /coreos.com/network/subnets/172.7.22.0-24
{"PublicIP":"10.4.7.22","BackendType":"vxlan","BackendData":{"VtepMAC":"26:75:ab:9b:d4:f5"}}
[root@hdss7-21 etcd]# ./etcdctl get  /coreos.com/network/subnets/172.7.21.0-24
{"PublicIP":"10.4.7.21","BackendType":"vxlan","BackendData":{"VtepMAC":"a2:ce:40:dd:e0:54"}}
[root@hdss7-21 etcd]# supervisorctl start flanneld-7-21
[root@hdss7-21 etcd]# route -n
点赞

发表评论

电子邮件地址不会被公开。

2 × 5 =