随着docker容器化兴起,云计算面对的挑战越来越大,例如:网络管理、存储等。一个数据中心很容易搞出成百上千个容器,这么多的容器我们需要如何管理呢?今天来介绍的flannel就是为了解决网络问题。
一、网络管理方案
目前使用最多的解决方案有两种:直接路由和overlay network。具体差异如下:
特点 | 代表 | |
直接路由 | 采用直接路由的方式,这种方式性能损耗最低,不需要修改报文数据,但是如果网络比较复杂场景下,路由表会很复杂,对运维同事提出了较高的要求。 | calico |
overlay network | 通过overlay技术(可以理解成隧道技术),在原始报文外再包一层四层协议(udp协议),通过主机网络进行路由转发。这种方式性能有一定损耗,主要体现在对原始报文的修改。目前overlay主要采用vxlan。 | flannel |
二、flannel网络解决方案backend
目前flannel有多种backend管理网络,常用的有三种:hostgw,udp,vxlan,三者差异如下:
特点 | |
hostgw | 这种方式就是直接路由 |
vxlan | 是flannel推荐的方式。需要通信的网络设备能够支持vxlan协议 |
udp | 该方式与vxlan很类似,它对ip层网络进行包装。通常用于调试环境或者不支持vxlan协议网络环境中。 |
后续的源码分析,主要针对vxlan这种backend进行说明。flannel还支持AWS、GCE 和 AliVPC,不过这几种都是需要云服务商提供服务的。
下面是对vxlan、udp报文格式举例说明:
通过上面两张图可知,这两种方式区别:vxlan方式下面多出了:vxlan header和内部mac地址(Vtep的地址)并且内部源ip为vtep所在ip地址。对于vxlan说明,这里有一篇比较高质量文章,大家可参考《vxlan 协议原理简介》。
三、编译
如果要学习一款开源软件有一种最好的方式就是调试。在调试之前我们肯定需要自己编译一下,具体编译步骤如下:
1)创建目录
这里创建目录相当于创建工程目录,具体如下:
[root@localhost /home[12:42]#mkdir /home/flannel
[root@localhost /home[12:42]#mkdir /home/flannel/bin
[root@localhost /home[12:42]#mkdir /home/flannel/pkg
[root@localhost /home[12:42]#mkdir -p /home/flannel/src//coreos/
[root@localhost /home[12:42]#tree flannel
flannel
├── bin
├── pkg
└── src
└──
└── coreos
2)下载代码
[root@localhost /home[12:42]#cd flannel/src//coreos/
[root@localhost /home/flannel/src//coreos/[12:42]#git clone /coreos/
Cloning into 'flannel'...
remote: Enumerating objects: 53, done.
remote: Counting objects: 100% (53/53), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 25608 (delta 20), reused 8 (delta 7), pack-reused 25555
Receiving objects: 100% (25608/25608), 45.51 MiB | 336.00 KiB/s, done.
Resolving deltas: 100% (9173/9173), done.
Checking out files: 100% (2261/2261), done.
[root@localhost /home[12:42]#
3)编译
flannel是golang语言编写的,所以编译环境中必须安装golang。执行如下代码进行编译:
[root@localhost /home/flannel/src//coreos[12:54]#export GOPATH=/home/flannel
[root@localhost /home/flannel/src//coreos[12:54]#cd flannel
[root@localhost /home/flannel/src//coreos/flannel[12:54]#make dist/flanneld
在执行make命令之前必须要声明一下环境变量GOPATH,执行工程根目录。 在编译过程中之出现了一个这样的错误:
[root@localhost /home/flannel/src//coreos[12:54]# make dist/flanneld
go build -o dist/flanneld \
-ldflags '-s -w -X /coreos/flannel/=v0.10.0-71-g6147523 -extldflags "-static"'
# /coreos/flannel
/usr/lib/golang/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/ld: cannot find -lpthread
/usr/bin/ld: cannot find -lc
collect2: 错误:ld 返回 1
make: *** [dist/flanneld] 错误 2
[root@localhost /home/flannel/src//coreos[12:54]#yum install glic* -y
缺少库文件, 可以通过yum install glic* -y进行安装/更新,安装完后在执行make命令行即可。
接下来就可以通过gdb进行调试了。对于如何调试可参考《go语言程序-gdb调试问题》。
四、总结
本篇只简单介绍flannel相关内容,对于flannel的使用可参考《Flannel配置以及部署》。这里还有一个小小的福利,用于wirshark解析flannel报文,大家可自行下载(同时支持etcd报文)。后面章节,将对flannel源码进行分析。