host-gateway试验拓扑
本文介绍flannel一种没有封解包的容器跨主机通信方案:flannel host-gateway模式,相比于UDP和vxlan模式,host-gateway模式没有额外的封解包过程,单纯依靠路由表项配置实现容器跨主机通信网络。其模型如下图:
需要说明的是:
l 两台机器均已打开内核ipv4转发开关
l 容器分配的IP网段为1.1.0.0/16
l node1维护1.1.1.0/24 IP段
l node2维护1.1.2.0/24 IP段
l 两台主机二层互通
具体的实验拓扑如下所示:
node1操作
ip netns add netns1
ip link add veth1 type veth peer name veth2
ip link set veth2 netns netns1
ip netns exec netns1 ifconfig veth2 1.1.1.2/24 up
ip link add name cni0 type bridge
ifconfig cni0 1.1.1.1/24 up
ip link set dev veth1 master cni0
ifconfig veth1 up
ip netns exec netns1 ip route add default via 1.1.1.1 dev veth2
ip netns exec netns1 route -n
node2操作
ip netns add netns2
ip link add veth3 type veth peer name veth4
ip link set veth4 netns netns2
ip netns exec netns2 ifconfig veth4 1.1.2.2/24 up
ip link add name cni0 type bridge
ifconfig cni0 1.1.2.1/24 up
ip link set dev veth3 master cni0
ifconfig veth3 up
ip netns exec netns2 ip route add default 1.1.2.1 dev veth4
ip netns exec netns2 route -n
分析路由
// node1 查看路由
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.12.1 0.0.0.0 UG 0 0 0 eth0
1.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
10.0.12.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
// node2 查看路由
#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.12.1 0.0.0.0 UG 0 0 0 eth0
1.1.2.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
10.0.12.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
根据路由规则,此时node1上可以ping通自己的1.1.1.2,node2上可以ping通自己的1.1.2.2,但是node1上ping不通node2上的1.1.2.2,node2上也ping不通node1上1.1.1.2。
说明:
// node1
ping -c 1 1.1.1.2 可以通
ping -c 1 1.1.2.2 不通
// node2
ping -c 1 1.1.2.2 可以通
ping -c 1 1.1.1.2 不通
添加路由
因为node1和node2二层互通,要使能在node1上访问node2上的1.1.2.2(veth4),可以考虑在node1上添加一条网关是node2 eth0 IP的路由;考虑回程报文,node2也应该加一条网关是node1 eth0 IP的路由,于是有:
// node1 操作
ip route add 1.1.2.0/24 via 10.0.12.7 dev eth0
route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.12.1 0.0.0.0 UG 0 0 0 eth0
1.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
1.1.2.0 10.0.12.7 255.255.255.0 UG 0 0 0 eth0
10.0.12.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
// node2 操作
ip route add 1.1.1.0/24 via 10.0.12.11 dev eth0
route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.12.1 0.0.0.0 UG 0 0 0 eth0
1.1.1.0 10.0.12.11 255.255.255.0 UG 0 0 0 eth0
1.1.2.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
10.0.12.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
再次验证
在node1上ping node2上的1.1.2.2以及在node2上ping node1上的1.1.1.2:
以下实验均通过ping测试
ping -c 1 1.1.2.2
ip netns exec netns1 ping -c 1 1.1.2.2
ping -c 1 1.1.1.2
ip netns exec netns2 ping -c 1 1.1.1.2
实验小结
flannel host-gateway模式正如host-gateway的含义,通过一条目标主机(host)IP作为网关(gateway)的路由实现容器跨主机通信。相比于UDP模式和vxlan模式,少了tun设备和vxlan设备的封解包过程,在性能上有更大的优势。但是直连路由要求主机间二层互通,这在一定程度上限制了host-gateway的使用场景,特别是公有云环境,不太好满足所有节点二层互通的条件。上文的路由是手动配置的,在flannel的实现中,是通过flanneld进程完成该操作的:每个节点上起一个flanneld进程,flanneld进程起来后注册本节点管理的网段和宿主机IP等信息到etcd(直连etcd或者通过apiServer接口),并且监听其它节点的注册信息,当发现有新节点加入集群时,便会在本节点增加一条网关是新节点IP的路由。