这篇文章主要为大家展示了“如何搭建Flannel容器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何搭建Flannel容器”这篇文章吧。

随着docker容器化兴起,云计算面对的挑战越来越大,例如:网络管理、存储等。一个数据中心很容易搞出成百上千个容器,这么多的容器我们需要如何管理呢。

Flannel实现原理原理说明

Flannel为每个host分配一个subnet,容器从这个subnet中分配IP,这些IP可以在host间路由,容器间无需使用nat和端口映射即可实现跨主机通信

每个subnet都是从一个更大的IP池中划分的,flannel会在每个主机上运行一个叫flanneld的agent,其职责就是从池子中分配subnet

Flannel使用etcd存放网络配置、已分配 的subnet、host的IP等信息

Flannel数据包在主机间转发是由backend实现的,目前已经支持UDP、VxLAN、host-gw、AWS VPC和GCE路由等多种backend

数据转发流程

容器直接使用目标容器的ip访问,默认通过容器内部的eth0发送出去。

报文通过veth pair被发送到vethXXX。

vethXXX是直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。

查找路由表,外部容器ip的报文都会转发到flannel0虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。

flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。

报文通过主机之间的网络找到目标主机。

报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。

数据被解包,然后发送给flannel0虚拟网卡。

查找路由表,发现对应容器的报文要交给docker0。

docker0找到连到自己的容器,把报文发送过去。

Flannel安装配置环境准备

节点名称IP地址安装软件docker1192.168.198.133etcd、flannel、dockerdocker2192.168.198.130flannel、docker安装etcd

etcd下载地址:https://github.com/coreos/etcd/releases

启动命令:

etcd-nameetcd1-data-dir/var/lib/etcd--advertise-client-urlshttp://192.168.198.133:2379,http://127.0.0.1:2379--listen-client-urlshttp://192.168.198.133:2379,http://127.0.0.1:2379&安装Flannel

flannel下载地址:https://github.com/coreos/flannel/releases

添加flannel网络配置信息到etcd:

etcdctl--endpointshttp://127.0.0.1:2379set/coreos.com/network/config'{"Network":"10.0.0.0/16","SubnetLen":24,"SubnetMin":"10.0.1.0","SubnetMax":"10.0.20.0","Backend":{"Type":"vxlan"}}'

Network:用于指定Flannel地址池

SubnetLen:用于指定分配给单个宿主机的docker0的ip段的子网掩码的长度

SubnetMin:用于指定最小能够分配的ip段

SudbnetMax:用于指定最大能够分配的ip段,在上面的示例中,表示每个宿主机可以分配一个24位掩码长度的子网,可以分配的子网从10.0.1.0/24到10.0.20.0/24,也就意味着在这个网段中,最多只能有20台宿主机

Backend:用于指定数据包以什么方式转发,默认为udp模式,host-gw模式性能最好,但不能跨宿主机网络

启动Flannel

#cat/etc/systemd/system/flanneld.service[Unit]Description=FlanneldDocumentation=https://github.com/coreos/flannelAfter=network.targetBefore=docker.service[Service]User=rootExecStartPost=/usr/local/bin/mk-docker-opts.shExecStart=/usr/local/bin/flanneld\--etcd-endpoints="http://192.168.198.133:2379"\--iface=192.168.198.133\--ip-masq=true\--etcd-prefix=/coreos.com/networkRestart=on-failureType=notifyLimitNOFILE=65536[Install]WantedBy=multi-user.target#systemctldaemon-reload#systemctlstartflanneld

Flannel启动过程解析:

从etcd中获取network的配置信息,划分subnet,并在etcd中进行注册,将子网信息记录到/run/flannel/subnet.env中,Flannel必须先于Docker启动。

验证Flannel网络

查看etcd中的数据:

#etcdctlls/coreos.com/network/subnets/coreos.com/network/subnets/10.0.18.0-24

查看docker1的flannel网卡信息:

38:flannel.1:mtu1450qdiscnoqueuestateUNKNOWNgroupdefaultlink/ether1a:8e:8b:09:d6:d4brdff:ff:ff:ff:ff:ffinet10.0.18.0/32scopeglobalflannel.1valid_lftforeverpreferred_lftforeverinet6fe80::188e:8bff:fe09:d6d4/64scopelinkvalid_lftforeverpreferred_lftforever

可以看到flannel0网卡的地址和etcd存储的地址一样,这样flannel网络配置完成

配置Docker

Docker安装完成以后,需要修改其启动参数以使其能够使用flannel进行IP分配,以及网络通讯

在Flannel运行之后,会生成一个环境变量文件,包含了当前主机要使用flannel通讯的相关参数,如下:

#cat/run/flannel/subnet.envFLANNEL_NETWORK=10.0.0.0/16FLANNEL_SUBNET=10.0.18.1/24FLANNEL_MTU=1450FLANNEL_IPMASQ=true

可以使用flannel提供的脚本将subnet.env转写成Docker启动参数,创建好的启动参数默认生成在/run/docker_opts.env文件中:

#/opt/flannel/mk-docker-opts.sh-c#cat/run/docker_opts.envDOCKER_OPTS="--bip=10.0.18.1/24--ip-masq=false--mtu=1450"修改docker的服务启动文件如下:#vim/lib/systemd/system/docker.serviceEnvironmentFile=/run/docker_opts.envExecStart=/usr/bin/dockerd$DOCKER_OPTS-Hfd://

重启docker

systemctldaemon-reloadsystemctlrestartdocker

这时可以看到docker0的ip已经位于flannel网卡的网段之中:

3:docker0:mtu1500qdiscnoqueuestateDOWNgroupdefaultlink/ether02:42:de:a3:d8:7dbrdff:ff:ff:ff:ff:ffinet10.0.18.1/24brd10.0.18.255scopeglobaldocker0valid_lftforeverpreferred_lftforeverinet6fe80::42:deff:fea3:d87d/64scopelinkvalid_lftforeverpreferred_lftforever38:flannel.1:mtu1450qdiscnoqueuestateUNKNOWNgroupdefaultlink/ether1a:8e:8b:09:d6:d4brdff:ff:ff:ff:ff:ffinet10.0.18.0/32scopeglobalflannel.1valid_lftforeverpreferred_lftforeverinet6fe80::188e:8bff:fe09:d6d4/64scopelinkvalid_lftforeverpreferred_lftforever验证容器互通

root@ubuntu:~#dockerrun-itbusybox/#ipa1:lo:mtu65536qdiscnoqueueqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforever39:eth0@if40:mtu1450qdiscnoqueuelink/ether02:42:0a:00:12:02brdff:ff:ff:ff:ff:ffinet10.0.18.2/24brd10.0.18.255scopeglobaleth0valid_lftforeverpreferred_lftforever/#ping10.0.12.2PING10.0.12.2(10.0.12.2):56databytes64bytesfrom10.0.12.2:seq=0ttl=62time=0.803msroot@ubuntuserver:~/flannel#dockerexec-itb4d/bin/bashroot@b4d65fdc02a3:/usr/local/apache2#ipa1:lo:mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlovalid_lftforeverpreferred_lftforever5:eth0@if6:mtu1450qdiscnoqueuestateUPgroupdefaultlink/ether02:42:0a:00:0c:02brdff:ff:ff:ff:ff:ffinet10.0.12.2/24brd10.0.12.255scopeglobaleth0valid_lftforeverpreferred_lftforeverroot@b4d65fdc02a3:/usr/local/apache2#root@b4d65fdc02a3:/usr/local/apache2#root@b4d65fdc02a3:/usr/local/apache2#ping10.0.18.2PING10.0.18.2(10.0.18.2)56(84)bytesofdata.64bytesfrom10.0.18.2:icmp_seq=1ttl=62time=0.794ms64bytesfrom10.0.18.2:icmp_seq=2ttl=62time=0.957ms

此时的网络数据包流向如图:

详解:Flannel安装与配置详解:Flannel安装与配置
配置backend为host-gw

host-gw bakcend是flannel的另一个backend。与vxlan不同,host-gw不会封装数据包,而是在主机的路由表中创建到其他主机的subnet的路由条目,从而实现容器网络跨主机通信。需要说明的是,host-gw不能跨宿主机网络通信,或者说跨宿主机网络通信需要物理路由支持。

修改etcd如下:

etcdctl--endpointshttp://127.0.0.1:2379set/coreos.com/network/config'{"Network":"10.0.0.0/16","SubnetLen":24,"SubnetMin":"10.0.1.0","SubnetMax":"10.0.20.0","Backend":{"Type":"host-gw"}}'

重启flanneld与docker:

systemctlrestartflannelddocker

可以在宿主机上查看到路由条目:

root@ubuntu:~#iproutedefaultvia192.168.198.2devens33protodhcpmetric10010.0.12.0/24via192.168.198.130devens3310.0.18.0/24devdocker0protokernelscopelinksrc10.0.18.1linkdown169.254.0.0/16devens33scopelinkmetric1000192.168.198.0/24devens33protokernelscopelinksrc192.168.198.133metric100

以上是“如何搭建Flannel容器”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!