一 环境准备

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
 # hostnamectl set-hostname docker01.example.com
# hostnamectl set-hostname docker02.example.com
# 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

 root@etcd1:~# mkdir -p /var/log/etcd/			#建议创建etcd日志保存目录
root@etcd1:~# mkdir -p /data/etcd #建议创建单独的etcd数据目录
root@etcd1:~# ETCD_VER=v3.3.10
root@etcd1:~# GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
root@etcd1:~# DOWNLOAD_URL=${GITHUB_URL}
root@etcd1:~# curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
root@etcd1:~# tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
root@etcd1:~# rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz root@etcd1:~# cp /tmp/etcd-download-test/etcd* /usr/local/bin/
root@etcd1:~# etcd --version
 

2.2 采用systemd管理

 root@etcd1:~# vi /lib/systemd/system/etcd.service	#创建用于systemd管理的文件
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
Conflicts=etcd.service [Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0 ExecStart=/usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \
--listen-client-urls http://172.24.8.113:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://172.24.8.113:2379 [Install]
WantedBy=multi-user.target
 
提示:使用yum安装etcd则etcd.service会自动创建,且引用/etc/etcd/etcd.conf中的配置文件参数启动。

2.4 Etcd中添加相应网段

按照1.3基础环境规划网段,添加etcd键值。
 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"}}'
Network(字符串):CIDR格式的IPv4网络,用于整个flannel网络。(这是唯一的强制密钥。)
SubnetLen(整数):分配给每个主机的子网大小,除非Network小于24,否则默认为24(即/24)。
SubnetMin(字符串):子网分配应从哪个IP范围开始,默认为第一个子网Network。
SubnetMax(字符串):子网分配应结束的IP范围的结尾,默认为最后一个子网Network。
Backend(后端):要使用的后端类型和该后端的特定配置。
root@etcd1:~# etcdctl get /flannel/network/config
{"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

 root@etcd1:~# mkdir /tmp/flannel-download-test
root@etcd1:~# FLANNEL_VER=v0.10.0
root@etcd1:~# GITHUB_URL=https://github.com/coreos/flannel/releases/download
root@etcd1:~# DOWNLOAD_URL=${GITHUB_URL}
root@etcd1:~# curl -L ${DOWNLOAD_URL}/${FLANNEL_VER}/flannel-${FLANNEL_VER}-linux-amd64.tar.gz -o /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz
root@etcd1:~# tar xzvf /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz -C /tmp/flannel-download-test
root@etcd1:~# rm -f /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz root@etcd1:~# cp /tmp/flannel-download-test/flanneld /usr/local/bin/
root@etcd1:~# cp /tmp/flannel-download-test/mk-docker-opts.sh /usr/local/bin/
 

3.2 采用systemd管理

 root@etcd1:~# vi /lib/systemd/system/flanneld.service	#创建用于systemd管理的文件
[Unit]
Description=Flanneld overlay address etcd agent
Documentation=https://github.com/coreos/flannel
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service #指定flannel在etcd之后、docker之前启动
Before=docker.service [Service]
User=root
Type=notify
LimitNOFILE=65536
EnvironmentFile=/etc/flannel/flanneld.conf #指定flannel配置文件
ExecStart=/usr/local/bin/flanneld \
-etcd-endpoints=${FLANNEL_ETCD_ENDPOINTS} \
-etcd-prefix=${FLANNEL_ETCD_PREFIX} $FLANNEL_OPTIONS
#使用引用flannel配置文件中的参数形式
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker #见解读部分
Restart=on-failure [Install]
WantedBy=multi-user.target
 

3.3 创建flannel配置文件

 root@docker01:~# mkdir /etc/flannel
root@docker01:~# vi /etc/flannel/flanneld.conf
# Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://172.24.8.113:2379" #指定etcd服务器的监听地址 # etcd config key. This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/flannel/network" #指定etcd网络参数所存储键值的key # Any additional options that you want to pass
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启动参数

 root@docker01:~# vi /lib/systemd/system/docker.service
#……
EnvironmentFile=/run/flannel/docker #添加flannel转换后的docker能识别的配置文件
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS
#……
 
提示:需要将docker修改为采用flannel网络。
docker02节点参考以上配置即可。

五 启动相关服务

5.1 启动etcd服务

 root@etcd1:~# systemctl daemon-reload			#只需要在etcd节点
root@etcd1:~# systemctl restart etcd.service
root@etcd1:~# systemctl enable etcd.service
root@etcd1:~# ps -ef | grep etcd #验证是否启动正常
 

5.2 启动flannel服务

 root@docker01:~# systemctl daemon-reload		        #docker01和docker02节点
root@docker01:~# systemctl restart flanneld.service
root@docker01:~# systemctl enable flanneld.service
root@docker01:~# ps -ef | grep flanneld #验证是否启动正常
 

5.3 启动docker服务

 root@docker01:~# systemctl daemon-reload
root@docker01:~# systemctl restart docker.service
root@docker01:~# systemctl enable docker.service
 
提示:docker02节点参考以上配置即可。

六 验证确认

6.1 验证flannel获取网络参数

 root@docker01:~# cat /run/flannel/docker		#检查flannel获取网络参数情况
DOCKER_OPT_BIP="--bip=10.1.19.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=10.1.19.1/24 --ip-masq=true --mtu=1450"
root@docker01:~# ifconfig | grep -A6 docker
root@docker01:~# ifconfig | grep -A6 flannel
 

七 测试确认

7.1 创建测试容器

 root@docker01:~# docker run -id --name Container01 busybox
root@docker02:~# docker run -id --name Container01 busybox
 
 
提示:flannel为动态分配IP,因此实际IP可能和实例架构图不一致,请根据实际情况规划相关业务IP。

008.Docker Flannel+Etcd分布式网络部署的更多相关文章

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

    一 环境准备 1.1 基础环境 ntp配置:略 #建议配置ntp服务,保证时间一致性 etcd版本:v3.3.9 防火墙及SELinux:关闭防火墙和SELinux 名称 地址 主机名 备注 etcd ...

  2. Docker网络解决方案 - Calico部署记录

    简单来说,实现docker跨主机容器间通信,常用的第三方网络方案是Flannel,Weave,Calico:Flannel会为每个host分配一个subnet,容器从这个subnet中分配ip,这些i ...

  3. kubeadm/flannel/dashboard/harbor部署以及服务发布

    kubeadm/flannel/dashboard/harbor部署以及服务发布 目录 kubeadm/flannel/dashboard/harbor部署以及服务发布 一.部署kubeadm 1. ...

  4. Docker 搭建 etcd 集群

    阅读目录: 主机安装 集群搭建 API 操作 API 说明和 etcdctl 命令说明 etcd 是 CoreOS 团队发起的一个开源项目(Go 语言,其实很多这类项目都是 Go 语言实现的,只能说很 ...

  5. ETCD分布式存储部署

    一.ETCD 概述 ETCD 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置.具有一下优点: 简单: 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致 ...

  6. 使用docker配置etcd集群

    docker配置etcd集群与直接部署etcd集群在配置上并没有什么太大差别. 我这里直接使用docker-compose来实现容器化的etcd部署 环境如下: HostName IP etcd1 1 ...

  7. 服务发现之consul理论整理_结合Docker+nginx+Tomcat简单部署案例

    目录 一.理论概述 服务发现的概念简述 consul简述 二.部署docker+consul+Nginx案例 环境 部署 三.测试 四.总结 一.理论概述 服务发现的概念简述 在以前使用的是,N台机器 ...

  8. 基于docker+etcd+confd + haproxy构建高可用、自发现的web服务

    基于docker+etcd+confd + haproxy构建高可用.自发现的web服务 2016-05-16 15:12 595人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主 ...

  9. docker 镜像仓库 Harbor 部署 以及 跨数据复制

    docker 镜像仓库 Harbor 部署 跨数据复制 Harbor 是 Vmwar 公司开源的 企业级的 Docker Registry 管理项目 它主要 提供 Dcoker Registry 管理 ...

随机推荐

  1. Android NDK编程

    1.首先需要声明native方法: public native String helloWorldNdk(); public native String hello_World_Ndk(); 2.然后 ...

  2. android 服务解析

    https://blog.csdn.net/luoyanglizi/article/details/51586437 2.service和Thread的区别 定义上: thread是程序运行的最小单元 ...

  3. python正则表达式一[转]

    原文:http://blog.jobbole.com/74844/ 作为一个概念而言,正则表达式对于Python来说并不是独有的.但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别. ...

  4. 【Mysql sql inject】POST方法BASE64编码注入write-up

      翻到群里的小伙伴发出一道POST型SQL注入题,简单抓包判断出题目需要base64编码后才执行sql语句,为学习下SQL注入出题与闯关的思路+工作不是很忙,所以花点时间玩了一下,哈哈哈哈哈哈哈哈哈 ...

  5. 【逆向工具】使用x64dbg+spy去除WinRAR5.40(64位)广告弹框

    1 学习目标 WinRAR5.40(64位)的弹框广告去除,由于我的系统为x64版本,所以安装了WinRAR(x64)版本. OD无法调试64位的程序,可以让我熟悉x64dbg进行调试的界面. 其次是 ...

  6. oracle查询重复数据方法

    SQL重复记录查询方法 2008年08月14日 星期四 21:01 SQL重复记录查询 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peop ...

  7. C# .NET Winform等程序一运行就闪退 不同环境 换到其他电脑,例如XP之类的解决方法。

    我现在写标题就跟写tag一样,方便大家索引. 有时候经常会把.NET写的程序拿到其他客户机,发现直接闪退,啥也不报错..那就很蛋疼,又不可能去装IDE来检测是吧,网上还有很多说啥看系统日志的,什么图标 ...

  8. C# 文件拖放

    将控件的属性AllowDrop设置为true,然后添加DragDrop.DragEnter时间处理函数 private void FormMain_DragEnter(object sender, D ...

  9. Java Map 键值对排序 按key排序和按Value排序

    一.理论准备 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black tre ...

  10. vue系列之概念

    一.模板引擎 通常出现在应用层,即服务器端(MVC层中的view) 客户端HTTP请求->应用层的控制器(Controller)->应用层的服务层(Service,访问数据库)->封 ...