Docker容器之flannel网络

docker ginotang 2282℃ 0评论

简介

flannel是第三方跨主机容器网络,是CoreOS团队专门为Kubernetes开发的,但Docker也可以轻松地使用flannel网络。

flannel在每个主机上运行一个flanneld客户端程序,负责子网IP的分配,另外一些资料例如子网信息,已分配的IP地址池等则依赖etcd来保存。flannel本身不负责主机间的流量转发,这些工作都是通过后端处理,flannel支持多种后端,常用的有VXLAN和host-gw,官方建议使用VXLAN。

环境准备

  • 两台Docker Host,IP地址为192.168.0.202和192.168.0.212,需要安装flannel
  • 一台主机(nas-share)用于安装etcd数据库 ,IP地址为192.168.0.222

安装etcd

etcd目前托管在github上面,最新的二进制安装包版本为3.3.9.

下载并解压软件包

解压后我们只需要etcd和etcdclt两个可执行文件,可以把它们复制到/usr/bin/目录下,方便执行

测试etcd

先启动etcd服务

etcd默认监听127.0.0.1,无法对外提供服务,因此要显式设置监听的网卡。

  • –listen-client-urls 指定接收客户端数据的网卡
  • –advertise-client-urls 指定由哪个网卡通告集群中的成员列表

etcd默认启动为前台进程,因此会占用一个终端,启动成功后另开一个终端测试,使用etcdctl命令向etcd添加一个键值对。

如果没有错误,说明etcd成功运行。由于etcdctl和etcd运行在同一台服务器上,因此不需要设置endpoints参数,否则需要明确指出:

安装flannel

flannel同样托管在github,现在已经提供二进制安装包,一般不用自己编译。

配置flannel

flannel默认会读取etcd数据库上key为/coreos.com/network/config的值,也可以通过--etcd-prefix指定key。该key保存的是一个json配置,支持的选项有:

  • Network (string):CIDR形式的网络地址。必须设置
  • SubnetLen (integer):子网尺寸,默认为24。可选项
  • SubnetMin (string):开始分配的最小子网。可选项
  • SubnetMax (string):可分配的最大子网。可选项
  • Backend (dictionary):指定数据转发的后端。

配置文件示例:

保存数据到etcd

假设网络为10.10.0.0,使用VXLAN作为后端,我们先创建好配置文件

然后使用etcdctl上传配置到etcd

启动flanneld

配置准备完毕就可以启动flanneld,两台服务器都需要启动flanneld,默认启动为前台进程。

注意–etcd-prefix的值是/flannel/network/,而不是/flannel/network/config,如果设置了后者,启动的时候就会出现如下错误:

一旦flanneld启动之后,它会确保主机有一个租赁网络,如果没有则分配一个,租赁网络可以通过下面命令查看:

详细的信息可以如下查看:

另外,flannel还会把一些环境变量保存到/var/run/flannel/subnet.env文件中,里面包括子网信息和支持它支持的MTU值

最后,flannel会添加一个名为flannel.1的虚拟设备

Docker中使用flannel

修改docker守护进程的启动参数

添加--bip--mtu选项,它们的值对应/var/run/flannel/subnet.env中的FLANNEL_SUBNET和FLANNEL_MTU。

然后重启docker

实际上,现在新创建的容器默认就使用flannel提供的网络,因为我们已经指定了docker进程使用的子网。

创建容器

主机1

可见IP地址对应的就是flannel的网络。

主机2

测试网络通讯

进入主机1的busybox1,ping主机2的busybox2

busybox1顺利和busybox2通讯,实际上,两个容器不属于同一个子网,它们是如何通讯的呢?答案是通过主机的路由。

我们先查看主机1的路由配置:

flannel route table

任何发往10.10.41.0的数据都由flannel.1设备处理,另外,本地docker的网络实际上绑定到docker0上,brctl命令可以证实:

veth677efe0设备在busybox1运行之前是不存在的。

主机2上也存在相似的路由表:

flannel route table

最终的网络结构如下

flannel network

转载请注明:Pure nonsense » Docker容器之flannel网络

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x