Flannel是一种基于overlay网络的跨主机容器网络解决方案,即将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于docker多机互联的一个工具,让集群中的不同节点主机创建的容器都具有全集群唯一的虚拟ip地址
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。
ntp配置:略 #建议配置ntp服务,保证时间一致性
etcd版本:v3.3.9
docker版本:18.06.1-ce
防火墙及SELinux:关闭防火墙和SELinux
名称 | 地址 | 主机名 | 备注 |
---|---|---|---|
docker01 | 172.24.8.111 | docker01.example.com | |
docker02 | 172.24.8.112 | docker02.example.com | |
etcd1 | 172.24.8.113 | etcd1.example.com | 用于保存相关IP信息 |
docker01中容器网段 | 10.1.15.2/24 | container01 | 网段10.1.15.0/24 |
docker02中容器网段 | 10.1.20.2/24 | container03 | 网段10.1.20.0/24 |
1 # hostnamectl set-hostname docker01.example.com
2 # hostnamectl set-hostname docker02.example.com
3 # hostnamectl set-hostname etcd1.example.com
提示:主机名非必须。
数据转发流程
部署顺序建议为:etcd---->flannel---->docker,也可独立分开部署,可能需要重启相关服务,才能使flannel从etcd获取网络信息,docker才能从flannel获取相关IP。
启动顺序必须为:etcd---->flannel---->docker,必须保证etcd启动正常,才能使flannel获取正确地址段,docker容器才能从flannel获取唯一地址。
1 root@etcd1:~# mkdir -p /var/log/etcd/ #建议创建etcd日志保存目录
2 root@etcd1:~# mkdir -p /data/etcd #建议创建单独的etcd数据目录
3 root@etcd1:~# ETCD_VER=v3.3.10
4 root@etcd1:~# GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
5 root@etcd1:~# DOWNLOAD_URL=${GITHUB_URL}
6 root@etcd1:~# curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
7 root@etcd1:~# tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
8 root@etcd1:~# rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
9
10 root@etcd1:~# cp /tmp/etcd-download-test/etcd* /usr/local/bin/
11 root@etcd1:~# etcd --version
1 root@etcd1:~# vi /lib/systemd/system/etcd.service #创建用于systemd管理的文件
2 [Unit]
3 Description=etcd
4 Documentation=https://github.com/coreos/etcd
5 Conflicts=etcd.service
6
7 [Service]
8 Type=notify
9 Restart=always
10 RestartSec=5s
11 LimitNOFILE=40000
12 TimeoutStartSec=0
13
14 ExecStart=/usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \
15 --listen-client-urls http://172.24.8.113:2379,http://127.0.0.1:2379 \
16 --advertise-client-urls http://172.24.8.113:2379
17
18 [Install]
19 WantedBy=multi-user.target
提示:使用yum安装etcd则etcd.service会自动创建,且引用/etc/etcd/etcd.conf中的配置文件参数启动。
按照1.3基础环境规划网段,添加etcd键值。
1 root@etcd1:~# etcdctl --endpoints http://172.24.8.113:2379 set /flannel/network/config '{"Network": "10.1.0.0/16", "SubnetLen": 24, "SubnetMin": "10.1.15.0","SubnetMax": "10.1.20.0", "Backend": {"Type": "vxlan"}}'
2 Network(字符串):CIDR格式的IPv4网络,用于整个flannel网络。(这是唯一的强制密钥。)
3 SubnetLen(整数):分配给每个主机的子网大小,除非Network小于24,否则默认为24(即/24)。
4 SubnetMin(字符串):子网分配应从哪个IP范围开始,默认为第一个子网Network。
5 SubnetMax(字符串):子网分配应结束的IP范围的结尾,默认为最后一个子网Network。
6 Backend(后端):要使用的后端类型和该后端的特定配置。
7 root@etcd1:~# etcdctl get /flannel/network/config
8 {"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.1.15.0","SubnetMax": "10.1.20.0", "Backend": {"Type": "vxlan"}}
1 root@etcd1:~# mkdir /tmp/flannel-download-test
2 root@etcd1:~# FLANNEL_VER=v0.10.0
3 root@etcd1:~# GITHUB_URL=https://github.com/coreos/flannel/releases/download
4 root@etcd1:~# DOWNLOAD_URL=${GITHUB_URL}
5 root@etcd1:~# curl -L ${DOWNLOAD_URL}/${FLANNEL_VER}/flannel-${FLANNEL_VER}-linux-amd64.tar.gz -o /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz
6 root@etcd1:~# tar xzvf /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz -C /tmp/flannel-download-test
7 root@etcd1:~# rm -f /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz
8
9 root@etcd1:~# cp /tmp/flannel-download-test/flanneld /usr/local/bin/
10 root@etcd1:~# cp /tmp/flannel-download-test/mk-docker-opts.sh /usr/local/bin/
1 root@etcd1:~# vi /lib/systemd/system/flanneld.service #创建用于systemd管理的文件
2 [Unit]
3 Description=Flanneld overlay address etcd agent
4 Documentation=https://github.com/coreos/flannel
5 After=network.target
6 After=network-online.target
7 Wants=network-online.target
8 After=etcd.service #指定flannel在etcd之后、docker之前启动
9 Before=docker.service
10
11 [Service]
12 User=root
13 Type=notify
14 LimitNOFILE=65536
15 EnvironmentFile=/etc/flannel/flanneld.conf #指定flannel配置文件
16 ExecStart=/usr/local/bin/flanneld \
17 -etcd-endpoints=${FLANNEL_ETCD_ENDPOINTS} \
18 -etcd-prefix=${FLANNEL_ETCD_PREFIX} $FLANNEL_OPTIONS
19 #使用引用flannel配置文件中的参数形式
20 ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker #见解读部分
21 Restart=on-failure
22
23
24 [Install]
25 WantedBy=multi-user.target
1 root@docker01:~# mkdir /etc/flannel
2 root@docker01:~# vi /etc/flannel/flanneld.conf
3 # Flanneld configuration options
4 # etcd url location. Point this to the server where etcd runs
5 FLANNEL_ETCD_ENDPOINTS="http://172.24.8.113:2379" #指定etcd服务器的监听地址
6
7 # etcd config key. This is the configuration key that flannel queries
8 # For address range assignment
9 FLANNEL_ETCD_PREFIX="/flannel/network" #指定etcd网络参数所存储键值的key
10
11 # Any additional options that you want to pass
12 FLANNEL_OPTIONS="-iface=eth0" #指定用于主机间通信的接口,参数值也可为IP地址
提示:使用yum安装etcd则flannel.service会自动创建,若通过yum安装,所有相关systemd管理文件会自动创建,可参考:
https://www.cnblogs.com/kevingrace/p/6859114.html
https://www.cnblogs.com/devilwind/p/8880677.html
进行配置和修改。
docker02节点参考以上配置即可。
解读:
/etc/sysconfig/flanneld:配置相关flannel启动参数,用于flannel从etcd获取唯一地址段;
mk-docker-opts.sh:mk-docker-opts.sh运行后会讲flannel获取的网络参数写入/run/flannel/subnet.env文件;
-k DOCKER_NETWORK_OPTIONS:-k会将默认组合键,即DOCKER_OPTS=转换为DOCKER_NETWORK_OPTIONS,主要方便于yum安装的docker直接引用(即docker.service中的Service字段ExecStart行为已经包括$DOCKER_NETWORK_OPTIONS,从而不需要再次添加$DOCKER_OPTS);
-d /run/flannel/docker:将/run/flannel/subnet.env文件转换为docker能识别的格式后保存为/run/flannel/docker。
docker01和docker02节点均需要安装docker,具体方式见《002.docker版本及安装》。
1 root@docker01:~# vi /lib/systemd/system/docker.service
2 #……
3 EnvironmentFile=/run/flannel/docker #添加flannel转换后的docker能识别的配置文件
4 ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS
5 #……
提示:需要将docker修改为采用flannel网络。
docker02节点参考以上配置即可。
1 root@etcd1:~# systemctl daemon-reload #只需要在etcd节点
2 root@etcd1:~# systemctl restart etcd.service
3 root@etcd1:~# systemctl enable etcd.service
4 root@etcd1:~# ps -ef | grep etcd #验证是否启动正常
1 root@docker01:~# systemctl daemon-reload #docker01和docker02节点
2 root@docker01:~# systemctl restart flanneld.service
3 root@docker01:~# systemctl enable flanneld.service
4 root@docker01:~# ps -ef | grep flanneld #验证是否启动正常
1 root@docker01:~# systemctl daemon-reload
2 root@docker01:~# systemctl restart docker.service
3 root@docker01:~# systemctl enable docker.service
提示:docker02节点参考以上配置即可。
1 root@docker01:~# cat /run/flannel/docker #检查flannel获取网络参数情况
2 DOCKER_OPT_BIP="--bip=10.1.19.1/24"
3 DOCKER_OPT_IPMASQ="--ip-masq=true"
4 DOCKER_OPT_MTU="--mtu=1450"
5 DOCKER_NETWORK_OPTIONS=" --bip=10.1.19.1/24 --ip-masq=true --mtu=1450"
6 root@docker01:~# ifconfig | grep -A6 docker
7 root@docker01:~# ifconfig | grep -A6 flannel
1 root@docker01:~# docker run -id --name Container01 busybox
2 root@docker02:~# docker run -id --name Container01 busybox
提示:flannel为动态分配IP,因此实际IP可能和实例架构图不一致,请根据实际情况规划相关业务IP。