008.Docker Flannel+Etcd分布式网络部署
程序员文章站
2022-04-13 17:41:24
一 环境准备 1.1 Flannel概述 Flannel是一种基于overlay网络的跨主机容器网络解决方案,即将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于docker多机互联的一个工具,让集群中的不同节点主机创建的容器都具有全集群唯一的虚拟ip ......
一 环境准备
1.1 flannel概述
flannel是一种基于overlay网络的跨主机容器网络解决方案,即将tcp数据包封装在另一种网络包里面进行路由转发和通信,flannel是coreos开发,专门用于docker多机互联的一个工具,让集群中的不同节点主机创建的容器都具有全集群唯一的虚拟ip地址
1.2 原理说明
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。
1.3 基础环境
ntp配置:略 #建议配置ntp服务,保证时间一致性
etcd版本:v3.3.9
docker版本:18.06.1-ce
防火墙及selinux:关闭防火墙和selinux
1 # hostnamectl set-hostname docker01.example.com 2 # hostnamectl set-hostname docker02.example.com 3 # hostnamectl set-hostname etcd1.example.com
提示:主机名非必须。
1.4 架构示意图
数据转发流程
- 容器直接使用目标容器的ip访问,默认通过容器内部的eth0发送出去。
- 报文通过veth pair被发送到vethxxx。
- vethxxx直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。
- 查找路由表,外部容器ip的报文都会转发到flannel0虚拟网卡,这是一个p2p的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。
- flanneld通过etcd维护了各个节点之间的路由表,把原来的报文udp封装一层,通过配置的iface发送出去。
- 报文通过主机之间的网络找到目标主机。
- 报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。
- 数据被解包,然后发送给flannel0虚拟网卡。
- 查找路由表,发现对应容器的报文要交给docker0。
- docker0找到连到自己的容器,把报文发送过去。
1.5 相关顺序
部署顺序建议为:etcd---->flannel---->docker,也可独立分开部署,可能需要重启相关服务,才能使flannel从etcd获取网络信息,docker才能从flannel获取相关ip。
启动顺序必须为:etcd---->flannel---->docker,必须保证etcd启动正常,才能使flannel获取正确地址段,docker容器才能从flannel获取唯一地址。
二 etcd节点部署
2.1 单节点部署etcd
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
2.2 采用systemd管理
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中的配置文件参数启动。
2.4 etcd中添加相应网段
按照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"}}
三 flannel节点部署
3.1 安装flannel
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/
3.2 采用systemd管理
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
3.3 创建flannel配置文件
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。
四 配置docker
4.1 docker环境
docker01和docker02节点均需要安装docker,具体方式见《002.docker版本及安装》。
4.2 修改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节点参考以上配置即可。
五 启动相关服务
5.1 启动etcd服务
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 #验证是否启动正常
5.2 启动flannel服务
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 #验证是否启动正常
5.3 启动docker服务
1 root@docker01:~# systemctl daemon-reload 2 root@docker01:~# systemctl restart docker.service 3 root@docker01:~# systemctl enable docker.service
提示:docker02节点参考以上配置即可。
六 验证确认
6.1 验证flannel获取网络参数
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
七 测试确认
7.1 创建测试容器
1 root@docker01:~# docker run -id --name container01 busybox 2 root@docker02:~# docker run -id --name container01 busybox
提示:flannel为动态分配ip,因此实际ip可能和实例架构图不一致,请根据实际情况规划相关业务ip。
下一篇: 正则表达式简介(5-8)