深入剖析Flannel-简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xxb249/article/details/85642172

随着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源码进行分析。

猜你喜欢

转载自blog.csdn.net/xxb249/article/details/85642172