Docker flannel网络

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker flannel网络相关的知识,希望对你有一定的参考价值。

参考技术A Flannel网络是croeOS开发的容器网络解决方案,flannel为每一个主机分配一个子网,容器从这个子网中分配ip,这些ip可以在主机间进行路由,容器不需要NAT和端口映射,就能完成跨主机通讯。

由图可知,flannel会分配subnet结构网络,以此分配网段。每一个的subnet都会从一个更大的IP地址进行划分,flannel会在每一个主机上运行flanneld的客户端,职责是联系etcd,分配子网;flannel会用etcd进行存储数据(配置信息、网络关系……);数据是如何在etcd间转发(由backend实现);
Flannel实质上是一种overlay的网络类型,表示的是在一个网络应用层当中,不依靠ip地址传递消息,而是采用一种映射机制,把ip地址映射到某个资源定位上,也就将tcp的数据包包装到另外一种数据包上进行传输,目前支持udp、Vxlan、vps等转发方式。
Flannel采用etcd存储配置数据的子网和配置信息,flannel启动后,后台会首先检索配置和正在使用的子网列表,然后会从中间选择一个子网,尝试去注册,etcd也会存储主机对应的ip地址,flannel使用etcd的监视功能,监视子网下的所有变化信息,并且维护一个路由表,从而提高性能。
Docker0:数据从原容器发出后,经过主机的docker0网卡,再转发到flannel1的网卡(p2p网卡:udp封装、按路由投递)
到另一台主机,先解udp封装,相反操作,

Flannel网卡只支持docker0网卡向容器内进行转发

跨主机网络有:Pipwork、flannel、Weave 、Open、vSwitch、calico……
Weave:在每个宿主机上不止一个特殊的路由的容器,不同主机间的route连接 在一起,route连接所有普通的ip,并通过udp包发送到其他主机的普通容器上,解决了网络的问题,以然是单机。
Flannel:针对K8s设计的,为了集群中所有节点重新规划ip地址的使用规则,同一个内网且不重复的ip地址
Calio:性能和效率低

Flannel工作原理:每个主机配置ip段和子网的个数,flannel使用etcd维护和分配这些子网中实际ip地址之间的映射,对于数据路径上flannel采用udp封装ip数据包,转发到远程主机上

Udp封装:原始数据在起始节点flannel上进行udp封装,投递到目的节点后,被另一端的flanneld还原成原始数据包,两边docker服务感觉不到这个过程。

每个节点上的docker会使用不同的ip地址段:随机生成的地址段去注册,与网络通讯第一定律违背(1个vlan=一个广播域=1个网段),这是因为,flannel通过etcd分配的每个节点可用的ip地址段后,偷偷修改docker的启动参数,在运行flannel服务的节点上,可以查看docker服务进程当中会多出几个参数,为bip,它限制了所有容器获得ip地址的范围,这个范围是由flannel自动分配的,由flannel保存在etcd中的记录,保证他们不会重复,也就意味着,虽然不同网段,但是etcd把这个路由做好了,并且限制了每个容器能够得到的地址是在一个固定的范围内。

为什么发送节点的数据会从docker0路由到flannel0这快虚拟网卡上:数据包从容器A到容器B,(两者地址段不同),数据包从docker0出来后,就会被投递到flannel0上,目标节点上由于投递的地址是一个容器,所以目的地址一定会落在docker0上,即p2p

必须先启动host1的才能启动host2的

ping测试

DOCKER使用 FLANNEL(ETCD+FLANNEL)网络

一、FLANNEL网络简介

Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于docker多机互联的一个工具,让集群中的不同节点主机创建的容器都具有全集群唯一的虚拟ip地址,Flannel使用go语言编写

二、FLANNEL实现原理

2.1、原理说明

技术图片
1、Flannel为每个host分配一个subnet,容器从这个subnet中分配IP,这些IP可以在host间路由,容器间无需使用nat和端口映射即可实现跨主机通信

2、每个subnet都是从一个更大的IP池中划分的,flannel会在每个主机上运行一个叫flanneld的agent,其职责就是从池子中分配subnet

3、Flannel使用etcd存放网络配置、已分配 的subnet、host的IP等信息
4、Flannel数据包在主机间转发是由backend实现的,目前已经支持UDP、VxLAN、host-gw、AWS VPC和GCE路由等多种backend
技术图片

2.2、数据转发流程

技术图片
技术图片
1、容器直接使用目标容器的ip访问,默认通过容器内部的eth0发送出去。

2、报文通过veth pair被发送到vethXXX。

3、ethXXX是直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。

4、查找路由表,外部容器ip的报文都会转发到flannel0虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。

5、flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。

6、报文通过主机之间的网络找到目标主机。

7、报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。

8、数据被解包,然后发送给flannel0虚拟网卡。

9、查找路由表,发现对应容器的报文要交给docker0。

10、docker0找到连到自己的容器,把报文发送过去。
技术图片

三、部署ETCD集群

3.1、环境准备

节点名称
IP地址
安装软件
docker-01
192.168.1.220
etcd
docker-02
192.168.1.221
etcd
docker-03
192.168.1.222
etcd

 

3.2、安装ETCD(三台主机操作)

[root@docker-01 ~]# yum -y install etcd

3.3、配置ETCD

[root@docker-01 ~]# cp /usr/lib/systemd/system/etcd.service{,_bak}
[root@docker-01 ~]# cat /etc/etcd/etcd.conf
ETCD_NAME="docker-01"
ETCD_DATA_DIR="/var/lib/etcd/docker-01.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.1.220:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.220:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.220:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.220:2379"
ETCD_INITIAL_CLUSTER="docker-01=http://192.168.1.220:2380,docker-02=http://192.168.1.221:2380,docker-03=http://192.168.1.222:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[root@docker-02 ~]# cp /etc/etcd/etcd.conf{,_bak}
[root@docker-02 ~]# cat  /etc/etcd/etcd.conf
ETCD_NAME="docker-02"
ETCD_DATA_DIR="/var/lib/etcd/docker-02.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.1.221:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.221:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.221:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.221:2379"
ETCD_INITIAL_CLUSTER="docker-01=http://192.168.1.220:2380,docker-02=http://192.168.1.221:2380,docker-03=http://192.168.1.222:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[root@docker-03 ~]# cp /etc/etcd/etcd.conf{,_bak}
[root@docker-03 ~]# cat /etc/etcd/etcd.conf
ETCD_NAME="docker-03"
ETCD_DATA_DIR="/var/lib/etcd/docker-03.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.1.222:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.222:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.222:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.222:2379"
ETCD_INITIAL_CLUSTER="docker-01=http://192.168.1.220:2380,docker-02=http://192.168.1.221:2380,docker-03=http://192.168.1.222:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

3.4、修改ETCD启动文件(三台都操作)

[root@docker-01 ~]# cp /usr/lib/systemd/system/etcd.service{,_bak}
[root@docker-01 ~]# cat /usr/lib/systemd/system/etcd.service
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
User=etcd
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name="${ETCD_NAME}" --data-dir="${ETCD_DATA_DIR}" --listen-peer-urls="${ETCD_LISTEN_PEER_URLS}" --listen-client-urls="${ETCD_LISTEN_CLIENT_URLS}" --initial-advertise-peer-urls="${ETCD_INITIAL_ADVERTISE_PEER_URLS}" --advertise-client-urls="${ETCD_ADVERTISE_CLIENT_URLS}" --initial-cluster="${ETCD_INITIAL_CLUSTER}"  --initial-cluster-token="${ETCD_INITIAL_CLUSTER_TOKEN}" --initial-cluster-state="${ETCD_INITIAL_CLUSTER_STATE}""
Restart=on-failure
LimitNOFILE=65536

3.5、启动ETCD服务(三台都启动)

[root@docker-02 ~]# systemctl start etcd.service
[root@docker-02 ~]# etcdctl cluster-health
member 164a311aff833bc1 is healthy: got healthy result from http://192.168.1.222:2379
member b1eeb25e6baf68e0 is healthy: got healthy result from http://192.168.1.221:2379
member e7c8f1a60e57abe4 is healthy: got healthy result from http://192.168.1.220:2379
cluster is healthy

3.6、检测ETCD集群状态,至此ETCD安装完成

# 查看cluster状态
[root@docker-02 ~]# etcdctl cluster-health
member 164a311aff833bc1 is healthy: got healthy result from http://192.168.1.222:2379
member b1eeb25e6baf68e0 is healthy: got healthy result from http://192.168.1.221:2379
member e7c8f1a60e57abe4 is healthy: got healthy result from http://192.168.1.220:2379
cluster is healthy
# 列出etcd服务状态,从列出信息可以看出,目前是docker-03为主节点。
[root@docker-02 ~]# etcdctl member list
164a311aff833bc1: name=docker-03 peerURLs=http://192.168.1.222:2380 clientURLs=http://192.168.1.222:2379 isLeader=false
b1eeb25e6baf68e0: name=docker-02 peerURLs=http://192.168.1.221:2380 clientURLs=http://192.168.1.221:2379 isLeader=false
e7c8f1a60e57abe4: name=docker-01 peerURLs=http://192.168.1.220:2380 clientURLs=http://192.168.1.220:2379 isLeader=true

3.7、添加FLANNEL网络配置信息到ETCD

【注释: 此(flannel_use)目录自己可以定义,但是此处设置的目录必须与flannel配置文件中FLANNEL_ETCD_PREFIX="/flannel_use/network"配置保持一致,flannel启动程序只认带“config”的key,否则会报错Not a directory (/flannel_use/network)】 

# 固定配置方式
[root@docker-01 ~]# etcdctl set /flannel_use/network/config ‘{"Network":"10.10.0.0/16"}‘
{"Network":"10.10.0.0/16"}

四、部署FLANNEL

4.1、安装FLANNEL

[root@docker-01 ~]# yum install -y flannel

4.2、修改FLANNEL配置文件

 

 

以上是关于Docker flannel网络的主要内容,如果未能解决你的问题,请参考以下文章

DOCKER学习_005:Flannel网络配置

Docker 配置Flannel网络过程及原理

docker flannel网络部署和路由走向分析

flannel 网络问题排查

Docker网络解决方案-Flannel部署记录

Docker网络解决方案-Flannel部署记录