PREFIX=vxlan IP=$external-ip-of-node-1 DESTIP=$external-ip-of-node-2 PORT=8579 VNI=1 SUBNETID=78 SUBNET=192.$VNI.0.0/16 VXSUBNET=192.$VNI.$SUBNETID.0/32 DEVNAME=$PREFIX.$VNI ip link delete $DEVNAME ip link add $DEVNAME type vxlan id $VNI dev eth0 local $IP dstport $PORT nolearning echo '3' > /proc/sys/net/ipv4/neigh/$DEVNAME/app_solicit ip address add $VXSUBNET dev $DEVNAME ip link set $DEVNAME up ip route delete $SUBNET dev $DEVNAME scope global ip route add $SUBNET dev $DEVNAME scope global
PREFIX=vxlan IP=$external-ip-of-node-2 DESTIP=$external-ip-of-node-1 VNI=1 SUBNETID=87 PORT=8579 SUBNET=192.$VNI.0.0/16 VXSUBNET=192.$VNI.$SUBNETID.0/32 DEVNAME=$PREFIX.$VNI ip link delete $DEVNAME ip link add $DEVNAME type vxlan id $VNI dev eth0 local $IP dstport $PORT nolearning echo '3' > /proc/sys/net/ipv4/neigh/$DEVNAME/app_solicit ip -d link show ip addr add $VXSUBNET dev $DEVNAME ip link set $DEVNAME up ip route delete $SUBNET dev $DEVNAME scope global ip route add $SUBNET dev $DEVNAME scope global
# node1 node1$ bridge fdb add $mac-of-vtep-on-node-2 dev $DEVNAME dst $DESTIP
# node1 node1$ ip neighbor add $ip-on-node-2 lladdr $mac-of-vtep-on-node-2 dev vxlan.1
node1$ docker run -it --rm busybox sh node1$ ip a 1: lo:mtu 65536 qdisc noqueue qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 6: eth0@if7: mtu 1500 qdisc noqueue link/ether 02:42:c0:01:4e:02 brd ff:ff:ff:ff:ff:ff inet 192.1.78.2/24 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:c0ff:fe01:4e02/64 scope link valid_lft forever preferred_lft forever node2$ docker run -it --rm busybox sh node2$ ip a 1: lo: mtu 65536 qdisc noqueue qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 10: eth0@if11: mtu 1500 qdisc noqueue link/ether 02:42:c0:01:57:02 brd ff:ff:ff:ff:ff:ff inet 192.1.87.2/24 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:c0ff:fe01:5702/64 scope link valid_lft forever preferred_lft forever
node1@busybox$ ping -c1 192.1.87.2 PING 192.1.87.2 (192.1.87.2): 56 data bytes 64 bytes from 192.1.87.2: seq=0 ttl=62 time=2.002 ms node2@busybox$ ping -c1 192.1.78.2 PING 192.1.78.2 (192.1.78.2): 56 data bytes 64 bytes from 192.1.78.2: seq=0 ttl=62 time=1.360 ms
node1$ ping -c1 192.1.87.2 PING 192.1.87.2 (192.1.87.2) 56(84) bytes of data. 64 bytes from 192.1.87.2: icmp_seq=1 ttl=63 time=1.49 ms node2$ ping -c1 192.1.78.2 PING 192.1.78.2 (192.1.78.2) 56(84) bytes of data. 64 bytes from 192.1.78.2: icmp_seq=1 ttl=63 time=1.34 ms
A:是的,最新的Flannel中已经加入管理多个网络的能力,你可以在启动时制定多个网络,etcd中配置信息的的格式略有不同,启动flanneld时有参数可以制定初始化哪几个网络。Q:如果使用Flannel过程中发现,跨节点无法访问,该从哪些方便着手排错?
A:首先看一下你指定的虚拟网络是否和现有物理网路中的网段冲突了;然后检查节点之间的UDP端口是否可以连通,最后还需要考虑当前系统是否支持VXLAN,最低要求v3.7,建议v3.9+,CentOS7的默认内核已经可以满足要求。Q:过一组测试数据两台VM to VM (vlan): 7.74 GBits/sec,使用flannel vxlan,两个container之间 1.71 GBits/sec,请问这个数据正常吗,vxlan的带宽损耗发生哪, 有啥调优思路,谢谢。
A:首先我想确认一下你测试的结果是TCP还是UDP,建议实际测试一下,这个是我在Digital Ocean上2台VPS间的测试结果,仅供参考:Q:Flannel 在使用过程中,如果需要新增网段,如何让每个节点获取最新的路由表信息?需要更新所有节点的Flannel配置项,重启Flannel 吗?
https://github.com/yangyuqian/ ... md%23 性能评估
搞清楚原理以后,相信很容易判断瓶颈位置:节点之间是通过UDP来转发L2的数据包的,我认为这部分可能有比较大的嫌疑。
A:这个问题其实还不错,比较接近实战了;首先你确实可以重启flanneld来更新网络配置;然后Flannel每24h会自动重新分配集群内的网络,所以你就算不重启,每24h也会自动刷新本地网络的,如果发现本地网络配置不符合Flannel在etcd中配置的要求,会重新生成网络配置。Q:我在项目中用了flanne lvxlan backend。按照文中说法,转发由内核进行,Flannel挂掉并不影响通宵。但是实际使用中,Flannel挂掉确实导致外部其他访问不到Docker。请问这个可能是什么原因?
A:首先要澄清一下,并不是说挂掉网络没影响,flanneld挂掉会导致本地的ARP entry无法自动更新,但是已经生成的网络环境还是可用的,具体可以看我前面手动搭建overlay network的过程,根本在于ARP table。
以上内容根据2017年03月28日晚微信群分享内容整理。分享人杨谕黔,FreeWheel基础架构高级软件工程师,目前主要从事服务化框架、容器化平台相关的研发与推广,关注和感兴趣的技术主要有Golang、Docker、Kubernetes等。 DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesz,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。
原文发布时间为:2017-04-02
本文作者:杨谕黔
本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。
原文标题:DockOne微信分享(一一二):Flannel中vxlan backend的原理和实现