一、简介
flannel是为实现多网段通信的第三方的解决方案, 是 CoreOS 开发的容器网络解决方案。flannel 为每个 host 分配一个 subnet,容器从此 subnet 中分配 IP,这些 IP 可以在 host 间路由,容器间无需 NAT 和 port mapping 就可以跨主机通信。每个 subnet 都是从一个更大的 IP 池中划分的,flannel 会在每个主机上运行一个叫 flanneld 的 agent,其职责就是从池子中分配 subnet。为了在各个主机间共享信息,flannel 用 etcd(与 consul 类似的 key-value 分布式数据库)存放网络配置、已分配的 subnet、host 的 IP 等信息。数据包如何在主机间转发是由 backend 实现的。flannel 提供了多种 backend,最常用的有 vxlan 和 host-gw。其他 backend 请参考 https://github.com/coreos/flannel。 flannel支持多种的backend:目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式,默认使用的是udp的方式。
二、准备工作
三台VM虚拟机
一台用于etcd的部署
另两台用于flannel的部署
系统环境:centOS7.2
docker版本:docker-ce 19.3.5
etcd版本:etcd-3.3.11-2.el7.centos.x86_64
flannel版本:flannel-0.7.1-4.el7.x86_64
三、安装与配置及故障处理
1、部署etcd服务
1.1 安装
[[email protected] ~]# yum install -y etcd #安装etcd
1.2 修改etcd.conf文件
[[email protected] ~]# cd /etc/etcd/
[[email protected] etcd]# cp -p etcd.conf etcd.conf.bak #备份配置文件,回退使用。
[[email protected] etcd]# vim etcd.conf
将以下几项:
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
修改为:
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://172.16.41.251:2379"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.41.251:2379"
[[email protected] ~]# grep ^[A-Z] /etc/etcd/etcd.conf #查看文件内容
--name :方便理解的节点名称,默认为 default ,在集群中应该保持唯一,可以使用 hostname。
--data-dir :服务运行数据保存的路径,默认为 ${name}.etcd。
--listen-client-urls :对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379 ,客户端会连接到这里和 etcd 交互。
--advertise-client-urls :对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点。
1.3 新建etcd.sh文件并添加相应内容
在根目录创建etcd.sh文件
[[email protected] ~# vim etcd.sh
在etcd.sh文件中添加以下内容:
{"Network":"10.2.0.0/16","SubnetLen":24,"Backend":{"Type":"vxlan"}}
Network:定义host主机的IP地址池为10.2.0.0/16,注:由于etcd并不是动态保存host上flannel网络的,比如:当有节点被删除后,etcd中的关于这个节点的subnet网络并不会被删除,所以使用10.X.X.X的网络,保证有足够的网络可用
SubnetLen:指定每个主机分配的subnet大小为24位,即10.2.x.0/24
Backend为vxlan,即主机之间通过vxlan通信,backend分为vxlan和host-gw这两种方式
1.4 新建network/config文件及添加内容
[[email protected] ~]# cd /usr/local/bin/
[[email protected] bin]# mkdir network
[[email protected] network]# etcdctl --endpoints=http://172.16.41.251:2379 set /usr/local/bin/network/config </root/etcd.sh #将etcd.sh的文件内容输入config中
[[email protected] network]# etcdctl --endpoints=http://172.16.41.251:2379 get /usr/local/bin/network/config
--endpoints=http://192.168.7.222:2379 指定etcd的url
/usr/local/bin/network/config 保存key的地方,flanneld会读取这个配置,保证自己能获取到subnet,这个key可以任意指定,当host主机分配到subnet后,key会修改docker的启动参数
[[email protected] network]# systemctl restart etcd #重启etcd服务
etcd服务配置完成!!!!!
2、flannel安装与配置
[[email protected] ~]# yum install -y flannel #安装flannel
[[email protected] ~]# cd /etc/sysconfig/
[[email protected] sysconfig]# cp -p flanneld flanneld.bak #备份flanneld文件
[[email protected] sysconfig]# vim flanneld
修改以下内容:
FLANNEL_ETCD_ENDPOINTS="http://172.16.41.251:2379" #连接etcd的地址
FLANNEL_ETCD_PREFIX="/usr/local/bin/network" #etcd的key的地址
[root[email protected] sysconfig]# systemctl start flanneld
[[email protected] etc]# ifconfig flannel.1 #查看flannel.1网络
在两台flannel主机上都安装启动完flannel,就可以看见每个主机上起了一个flannel.1的网络
两台flannel主机都会出现一个flannel.1的路由,路由都是10.2.0.0的
[[email protected] etc]# route
[[email protected] system]# mkdir docker.service.d
[[email protected] system]# cd docker.service.d/
[[email protected] docker.service.d]# vim 10-machine.conf
添加以下内容:
Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver devicemapper --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pe --tlskey /etc/docker/server-key.pem --label provider=generic --bip=10.2.31.1/24 --mtu=1450
Environment=
注:--bip为flannel.1的分配段地址
这个参数要与/run/flannel/subnet.env中保持一致
[[email protected] sysconfig]# cat /run/flannel/subnet.env
修改/usr/lib/systemd/system/docker.service文件,添加以下内容:
在ExecStart=/usr/bin/dockerd后添加$DOCKER_NETWORK_OPTIONS
和
EnvironmentFile=/run/flannel/docker
如果不添加这两条会出现,docker启动后查看下启动的docker0不是被flannel托管了
注:另一台同样的操作。
重启docker
[[email protected] sysconfig]# systemctl daemon-reload
[[email protected] sysconfig]# systemctl restart docker
[[email protected] etc]# ifconfig
[[email protected] docker.service.d]# docker run -dit --name b1 busybox
[[email protected] docker.service.d]# docker exec b1 ifconfig
[[email protected] sysconfig]# docker run -dit --name b2 busybox
[[email protected] sysconfig]# docker exec b2 ifconfig
ping测试
[[email protected] docker.service.d]# docker exec b1 ping -c 2 10.2.67.2
[[email protected] sysconfig]# docker exec b2 ping -c 2 10.2.31.2
第三方flannel实现docker多网段通信测试成功!!!
原文地址:https://blog.51cto.com/3001441/2467337