深入剖析Flannel-简介

随着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/github.com/coreos/
[root@localhost /home[12:42]#tree flannel
flannel
├── bin
├── pkg
└── src
    └── github.com
        └── coreos

2)下载代码

[root@localhost /home[12:42]#cd flannel/src/github.com/coreos/
[root@localhost /home/flannel/src/github.com/coreos/[12:42]#git clone https://github.com/coreos/flannel.git
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/github.com/coreos[12:54]#export GOPATH=/home/flannel
[root@localhost /home/flannel/src/github.com/coreos[12:54]#cd flannel
[root@localhost /home/flannel/src/github.com/coreos/flannel[12:54]#make dist/flanneld

在执行make命令之前必须要声明一下环境变量GOPATH,执行工程根目录。 在编译过程中之出现了一个这样的错误:

[root@localhost /home/flannel/src/github.com/coreos[12:54]# make dist/flanneld
go build -o dist/flanneld \
  -ldflags '-s -w -X github.com/coreos/flannel/version.Version=v0.10.0-71-g6147523 -extldflags "-static"'
# github.com/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/github.com/coreos[12:54]#yum install glic* -y

缺少库文件, 可以通过yum install glic* -y进行安装/更新,安装完后在执行make命令行即可。

接下来就可以通过gdb进行调试了。对于如何调试可参考《go语言程序-gdb调试问题》

四、总结

本篇只简单介绍flannel相关内容,对于flannel的使用可参考《Flannel配置以及部署》。这里还有一个小小的福利,用于wirshark解析flannel报文,大家可自行下载(同时支持etcd报文)。后面章节,将对flannel源码进行分析。

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值