背景
如果根据《K8S集群搭建——基于CentOS 7系统》配置flannel,那么backend通信方式默认为UDP。这里就有一个问题,通过UDP方式,数据包的转发是在用户态,因此性能上会有损失,假如数据包的转发能在内核完成,这样就能少一次数据报文的拷贝,性能也就能上去,这就是VXLAN通信方式。
配置vxlan backend
1、master节点
和之前类似,同样使用etcdctl命令,增加对backend的定义,指定为vxlan即可,
etcdctl set /flannel/network/config '{"Network":"10.108.0.0/16","Backend": {"Type": "vxlan"}}'
这里我们设置flannel子网使用10.108网段。
设置完网络配置后,重启flanneld服务即可,同时因为docker依赖于flannel网络,因此docker也需要重启,但是要放到后面,
systemctl restart flanneld docker
两者执行内容大致如下:
- flannel从etcd数据库中获取network的配置信息
- flannel划分子网subnet,并在etcd中进行注册
- flannel将子网信息记录到/run/flannel/subnet.env中
- docker启动时加载subnet.env中的网络配置
因此,服务重启后我们就能看到flannel.1这个网络设备,以及docker0网桥的ip已经处于我们配置的网段中。
[root@CentOS-7-4 ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.108.14.1 netmask 255.255.255.0 broadcast 0.0.0.0
ether 02:42:5c:a0:56:f9 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.108.14.0 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 fe80::1007:9aff:fe3d:2bda prefixlen 64 scopeid 0x20<link>
ether 12:07:9a:3d:2b:da txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 8 overruns 0 carrier 0 collisions 0
2、node节点
对于node节点,同样也是重启flanneld和docker进程即可,
systemctl restart flanneld docker
连通性测试
分别在两个node上起一个容器,互相ping对方ip,能ping通即配置正常。
常见问题
1、docker0网桥设备ip不在我们设置的网段
这一般就是没有重启docker导致的,或者没有在flannel后重启。
2、使用etcdctl命令更新flannel子网信息,重启flannld进程,配置不生效
CentOS 7自带的flannel可能有些问题,重启服务确实无法更新配置,需要先将flannl.1这个网络设备删除,重启后才会生效。
ip link del flannel.1;
systemctl restart flanneld docker
后续使用最版本的flannel验证一下。