专栏首页木二天空008.Docker Flannel+Etcd分布式网络部署

008.Docker Flannel+Etcd分布式网络部署

一 环境准备

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

名称

地址

主机名

备注

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

提示:主机名非必须。

1.4 架构示意图

数据转发流程

  1. 容器直接使用目标容器的ip访问,默认通过容器内部的eth0发送出去。
  2. 报文通过veth pair被发送到vethXXX。
  3. vethXXX直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。
  4. 查找路由表,外部容器ip的报文都会转发到flannel0虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。
  5. flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。
  6. 报文通过主机之间的网络找到目标主机。
  7. 报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。
  8. 数据被解包,然后发送给flannel0虚拟网卡。
  9. 查找路由表,发现对应容器的报文要交给docker0。
  10. 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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 007.基于Docker的Etcd分布式部署

    提示:quay.io/coreos/etcd镜像国内可能无法pull,可在国外节点pull,然后scp至集群节点。

    木二
  • 004.etcd集群部署-动态发现

    在实际环境中,集群成员的ip可能不会提前知道。如使用dhcp自动获取的情况,在这些情况下,使用自动发现来引导etcdetcd集群,而不是指定静态配置,这个过程被...

    木二
  • 014.Kubernetes二进制部署docker

    docker 运行和管理容器,kubelet 通过 Container Runtime Interface (CRI) 与它进行交互。

    木二
  • etcd原理以及基本技术概述铺垫

    作为要了解etcd这个数据库,那么第一步就是要知道从哪里去访问官网,再下一步就是如何从官网中获取自己需要的文档资料。

    Devops海洋的渔夫
  • 彻底搞懂 etcd 系列文章(一):初识 etcd

    etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key...

    aoho求索
  • etcd 与 Zookeeper、Consul 等其它 kv 组件的对比

    本文的主角是 etcd。名称 “etcd” 源自两个想法,即 unix “/etc” 文件夹 和 “d” 分布式系统。“/etc” 文件夹是用于存储单个系统的配...

    aoho求索
  • 二进制安装k8s集群(4)-安装etcd集群

    在上一篇文章里我们主要介绍docker的安装,这里我们主要介绍安装etcd集群安装。这里我们采用下载二进制binary制作linux systemd的方式安装,...

    TA码字
  • 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势

    etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key...

    aoho求索
  • Jepsen对etcd 3.4.3测试的最新结果

    Jepsen对etcd 3.4.3进行了测试和分析,得到了良好的结果和有用的反馈。

    CNCF
  • 更强、更稳、更高效:解读 etcd 技术升级的三驾马车

    导读:etcd 是阿里巴巴内部容器云平台用于存储关键元信息的组件。阿里巴巴使用 etcd 已经有 3 年的历史, 在今年 双11 过程中它又一次承担了关键角色,...

    CNCF

扫码关注云+社区

领取腾讯云代金券