六、Flannel网络
(1)简介
- 在公司中不可能只有一台机器上安装容器,肯定会出现不同主机容器通信的情况,而使用上面的网络模式可能会出现一些问题,比如ip地址冲突等
- Flannel是一种基于overlay(二层,数据链路层)网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信
- Flannel是CoreOS开发,专门用于docker多机互联的一个工具,让集群中的不同节点主机创建的容器都具有全集群唯一的虚拟ip地址
- Flannel使用go语言编写的第三方软件,并不是Docker官方的,最终实现了不同主机容器的互相通信
- 在使用Flannel时还需要安装etcd用来存放网络配置等信息,并且Flannel是C/S架构,需要在每台主机上安装agent端
(2)Flannel网络实现原理
Flannel为每个host主机分配一个subnet,每个容器从subnet中分配ip地址。subnet可以看做是一个地址池
每个subnet都是从一个更大的ip地址池中划分的,flannel会在每个主机上运行一个叫flanneld的agent进程,它的作用就是负责从更大的ip地址池中分配自己所在主机的subnet
Flannel使用etcd来存放网络配置、已经分配的subnet以及host主机的ip等信息,也正是因为这个去记录每个主机容器的subnet地址池,所以才实现了不同主机容器之间的互相通信(解决了ip地址冲突)
Flannel数据包在主机之间的转发是由backend实现的,目前支持的类型有UDP、VXLAN,host-gw、AWS VPC和GCE路由等多种backend,默认为UDP但是一般都使用VXLAN
VXLAN全称Virtual Extensible LAN,是一种虚拟化隧道通信技术,主要是为了突破VLAN的最多4096个子网的数量限制,以满足大规模云计算数据中心的需求。VLAN技术的缺陷是VLAN Header预留的长度只有12 bit,故最多只能支持2的12次方即4096个子网的划分,无法满足云计算场景下主机数量日益增长的需求。当前VXLAN的报文Header内有24 bit,可以支持2的24次方个子网,并通过VNI(Virtual Network Identifier)来区分不同的子网,相当于VLAN当中的VLAN ID。 不同于其他隧道协议,VXLAN是一个一对多的网络,并不仅仅是一对一的隧道协议。一个VXLAN设备能通过像网桥一样的学习方式学习到其他对端的IP地址,也可以直接配置静态转发表。 当采用VXLAN模式时,flanneld在启动时会通过Netlink机制与Linux内核通信,建立一个VTEP(Virtual Tunnel Access End Point)设备flannel.1 (命名规则为flannel.[VNI],VNI默认为1),类似于交换机当中的一个网口,并将VTEP设备的相关信息上报到etcd当中。网络包在通过宿主机发出前先是加上了UDP头(8个字节),再然后加上了IP头(20个字节)进行封装,因此flannel0的MTU要比eth1的MTU小28个字节(MAC头加IP头)。
- 网络转发结构图:
- 容器直接使用目标容器的ip进行访问,数据默认通过容器内部的eth0发送出去。
- 报文通过veth pair被发送到vethXXX。
- vethXXX是直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。
- 查找路由表,外部容器ip的报文都会转发到flannel.1虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。
- flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。
- 报文通过主机之间的网络找到目标主机。
- 报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。
- 数据被解包,然后发送给flannel0虚拟网卡。
- 查找路由表,发现对应容器的报文要交给docker0。
- docker0找到连到自己的容器,把报文发送过去。
(3)Flannel网络安装配置
-实验环境
系统 | 主机名 | ip地址 | 安装软件 |
Centos7.4 | docker-01 | 192.168.100.202 桥接网卡 | etcd、flannel、docker |
Centos7.4 | docker-02 | 192.168.100.203 桥接网卡 | flannel、docker |
-实验步骤
1.在两台主机上都安装Docker并且开启
******两台主机安装步骤相同 [root@Centos7 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 #安装依赖 。。。。。。 完毕! [root@docker-01 ~]# vim /etc/yum.repos.d/centos.repo [aaa] name=aaa baseurl=file:///mnt enabled=1 gpgcheck=0 [docker] name=docker baseurl=file:///root/docker enabled=1 gpgcheck=0 #保存退出 [root@docker-01 ~]# ll 总用量 54876 -rw-------. 1 root root 1264 1月 12 2021 anaconda-ks.cfg drwxr-xr-x 3 root root 4096 7月 23 13:56 docker #上传yum源仓库 [root@docker-01 ~]# yum -y install docker-ce 。。。。。。 完毕! [root@docker-01 ~]# mkdir -p /etc/docker/ [root@docker-01 ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://w4uieobw.mirror.aliyuncs.com"] } #保存退出 [root@docker-01 ~]# systemctl start docker [root@docker-01 ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since 五 2021-07-23 14:01:14 CST; 3s ago Docs: https://docs.docker.com Main PID: 1570 (dockerd) Memory: 30.6M CGroup: /system.slice/docker.service └─1570 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.306578716+08:00" level=info msg="pickfirstBalancer: HandleS...le=grpc 7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.306643635+08:00" level=info msg="pickfirstBalancer: HandleS...le=grpc 7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.311359751+08:00" level=info msg="Graph migration to content...econds" 7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.311698850+08:00" level=info msg="Loading containers: start." 7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.435279845+08:00" level=info msg="Default bridge (docker0) i...ddress" 7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.492989807+08:00" level=info msg="Loading containers: done." 7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.505914133+08:00" level=info msg="Docker daemon" commit=481b...18.09.6 7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.505962110+08:00" level=info msg="Daemon has completed initialization" 7月 23 14:01:14 docker-01 dockerd[1570]: time="2021-07-23T14:01:14.528081887+08:00" level=info msg="API listen on /var/run/docker.sock" 7月 23 14:01:14 docker-01 systemd[1]: Started Docker Application Container Engine. Hint: Some lines were ellipsized, use -l to show in full.
2.在docker-01主机上安装etcd、Flannel
******(1)先做基础配置 [root@Centos7 ~]# hostnamectl set-hostname docker-01 [root@Centos7 ~]# su [root@docker-01 ~]# systemctl stop firewalld [root@docker-01 ~]# setenforce 0 setenforce: SELinux is disabled [root@docker-01 ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 写保护,将以只读方式挂载 mount: /dev/sr0 已经挂载或 /mnt 忙 /dev/sr0 已经挂载到 /mnt 上 ******(2)安装etcd,上传(下载)软件包 #etcd下载地址:https://github.com/coreos/etcd/releases #wget下载:wget https://github.com/coreos/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz [root@docker-01 ~]# ll 总用量 20436 -rw-------. 1 root root 1264 1月 12 2021 anaconda-ks.cfg -rw-r--r-- 1 root root 11353259 10月 11 2018 etcd-v3.3.10-linux-amd64.tar.gz [root@docker-01 ~]# tar xf etcd-v3.3.10-linux-amd64.tar.gz [root@docker-01 ~]# cd etcd-v3.3.10-linux-amd64 [root@docker-01 etcd-v3.3.10-linux-amd64]# ll 总用量 34296 drwxr-xr-x 11 6810230 users 4096 10月 11 2018 Documentation -rwxr-xr-x 1 6810230 users 19237536 10月 11 2018 etcd -rwxr-xr-x 1 6810230 users 15817472 10月 11 2018 etcdctl -rw-r--r-- 1 6810230 users 38864 10月 11 2018 README-etcdctl.md -rw-r--r-- 1 6810230 users 7262 10月 11 2018 README.md -rw-r--r-- 1 6810230 users 7855 10月 11 2018 READMEv2-etcdctl.md [root@docker-01 etcd-v3.3.10-linux-amd64]# cp etcd* /usr/bin/ #优化命令执行路径 ******(3)启动etcd,启动是放在前台运行的 [root@docker-01 etcd-v3.3.10-linux-amd64]# etcd --name etcd-202 -data-dir /var/lib/etcd --advertise-client-urls http://192.168.100.202:2379,http://127.0.0.1:2379 --listen-client-urls http://192.168.100.202:2379,http://127.0.0.1:2379 。。。。。。会输出信息 #注释: --name:etc取名 --data-dir:定义数据路径 --advertise-client-urls: 建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信,即服务的url。etcd是可以做集群的,这个是集群之间要连接的url --listen-client-urls: 监听的用于客户端通信的url,对外提供服务的地址,客户端会连接到这里和 etcd 交互,同样可以监听多个。这个是客户端要连接的url #复制一个终端 [root@docker-01 ~]# ps -ef|grep etcd #确认服务已经启动 root 1228 1169 0 19:10 pts/1 00:00:00 etcd --name etcd-202 -data-dir /var/lib/etcd --advertise-client-urls http://192.168.100.202:2379,http://127.0.0.1:2379 --listen-client-urls http://192.168.100.202:2379,http://127.0.0.1:2379 root 1259 1239 0 19:14 pts/0 00:00:00 grep --color=auto etcd ————————————————————————————————————————使用etcdctl工具———————————————————————————————————————— 2版本和3版本的命令语法是不一样的,这里使用2版本的 #####etcdctl是一个客户端的连接工具 [root@docker-01 ~]# etcdctl member list #查看集群的成员 8e9e05c52164694d: name=etcd-202 peerURLs=http://localhost:2380 clientURLs=http://127.0.0.1:2379,http://192.168.100.202:2379 isLeader=true #isLeader=True,表示202为领导者,peerURLs表示集群的URL #####使用etcdctl连接etcd数据库,检查etcd的连通性 [root@docker-01 ~]# etcdctl --endpoints http://127.0.0.1:2379 member list 8e9e05c52164694d: name=etcd-202 peerURLs=http://localhost:2380 clientURLs=http://127.0.0.1:2379,http://192.168.100.202:2379 isLeader=true #出现这个表示连通性正常 [root@docker-01 ~]# etcdctl --endpoints http://192.168.100.202:2379 member list 8e9e05c52164694d: name=etcd-202 peerURLs=http://localhost:2380 clientURLs=http://127.0.0.1:2379,http://192.168.100.202:2379 isLeader=true #####查看etcdctl版本 [root@docker-01 ~]# etcdctl --version etcdctl version: 3.3.10 API version: 2 #API表示版本 ——————————————————————————————————————————————————————————————————————————————————————————————— ******(4)安装Flannel,上传(下载)软件包 #flannel下载地址:https://github.com/coreos/flannel/releases #wget下载:wget https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz [root@docker-01 ~]# ll 总用量 20436 -rw-------. 1 root root 1264 1月 12 2021 anaconda-ks.cfg drwxr-xr-x 3 6810230 users 123 10月 11 2018 etcd-v3.3.10-linux-amd64 -rw-r--r-- 1 root root 11353259 10月 11 2018 etcd-v3.3.10-linux-amd64.tar.gz -rw-r--r-- 1 root root 9565743 1月 29 2019 flannel-v0.11.0-linux-amd64.tar.gz [root@docker-01 ~]# tar xf flannel-v0.11.0-linux-amd64.tar.gz [root@docker-01 ~]# cp flanneld /usr/bin/ [root@docker-01 ~]# cp mk-docker-opts.sh /usr/bin/ #命令和脚本优化命令执行路径 ******(5)配置etcd分配的地址池的范围、backend类型等信息 [root@docker-01 ~]# etcdctl set /coreos.com/network/config '{"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0", "Backend": {"Type": "vxlan"}}' {"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0", "Backend": {"Type": "vxlan"}} #如果不是本机可以加参数:--endpoints http://IP:2379 #注释 Network:用于指定Flannel地址池 SubnetLen:用于指定分配给单个宿主机的docker0的ip段的子网掩码的长度 SubnetMin:用于指定最小能够分配的ip段 SudbnetMax:用于指定最大能够分配的ip段,在上面的示例中,表示每个宿主机可以分配一个24位掩码长度的子网,可以分配的子网从10.0.1.0/24到10.0.20.0/24,也就意味着在这个网段中,最多只能有20台宿主机 Backend:用于指定数据包以什么方式转发,默认为udp模式,host-gw模式性能最好,但不能跨宿主机网络 [root@docker-01 ~]# etcdctl get /coreos.com/network/config #确认配置成功 {"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0", "Backend": {"Type": "vxlan"}} ******(6)启动Fannel,进行docker配置 [root@docker-01 ~]# /usr/bin/flanneld --etcd-endpoints="http://192.168.100.202:2379" --iface=192.168.100.202 --etcd-prefix=/coreos.com/network & #启动时指定etcd的utl等信息并且放到后台运行 [1] 1106 。。。。。。 [root@docker-01 ~]# ip a #在启动fannel后,查看网络信息,发现多了一块fannel.1的网卡,并且网段就是配置etcd指定的 。。。。。。 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:77:13:b9:a3 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever 5: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN link/ether d6:08:ca:5c:f8:81 brd ff:ff:ff:ff:ff:ff inet 10.0.6.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::d408:caff:fe5c:f881/64 scope link valid_lft forever preferred_lft forever [root@docker-01 ~]# ps aux | grep fannel #确认成功启动 root 1600 0.0 0.0 112676 984 pts/1 R+ 14:11 0:00 grep --color=auto fannel #可以使用flannel提供的脚本mk-docker-opts.sh 将subnet.env转写成Docker启动参数,创建好启动参数 [root@docker-01 ~]# mk-docker-opts.sh #执行脚本 [root@docker-01 ~]# cat /run/flannel/subnet.env #可以看到都自动写入了参数 FLANNEL_NETWORK=10.0.0.0/16 FLANNEL_SUBNET=10.0.6.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=false [root@docker-01 ~]# cat /run/docker_opts.env #自动写入了配置 DOCKER_OPT_BIP="--bip=10.0.6.1/24" DOCKER_OPT_IPMASQ="--ip-masq=true" DOCKER_OPT_MTU="--mtu=1450" DOCKER_OPTS=" --bip=10.0.6.1/24 --ip-masq=true --mtu=1450" [root@docker-01 ~]# vim /usr/lib/systemd/system/docker.service #修改docker的启动项 1 [Unit] 2 Description=Docker Application Container Engine 3 Documentation=https://docs.docker.com 4 BindsTo=containerd.service 5 After=network-online.target firewalld.service containerd.service 6 Wants=network-online.target 7 Requires=docker.socket 8 9 [Service] 10 Type=notify 11 # the default is not to use systemd for cgroups because the delegate issues still 12 # exists and systemd currently does not support the cgroup feature set required 13 # for containers run by docker 14 EnvironmentFile=/run/docker_opts.env #添加14行修改15行,使docker引用刚才上面的文件 15 ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd:// --containerd=/run/containerd/containerd.sock 16 ExecReload=/bin/kill -s HUP $MAINPID 17 TimeoutSec=0 18 RestartSec=2 19 Restart=always 。。。。。。 #保存退出 [root@docker-01 ~]# systemctl daemon-reload #重载系统服务 [root@docker-01 ~]# systemctl restart docker #重启docker [root@docker-01 ~]# ip a 。。。。。。 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:77:13:b9:a3 brd ff:ff:ff:ff:ff:ff inet 10.0.6.1/24 brd 10.0.6.255 scope global docker0 #再次查看网卡,发现docker0网卡已经变成了之前etcd配置的网段,之后容器的网络地址都是有docker0去分配的 valid_lft forever preferred_lft forever 5: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN link/ether d6:08:ca:5c:f8:81 brd ff:ff:ff:ff:ff:ff inet 10.0.6.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::d408:caff:fe5c:f881/64 scope link valid_lft forever preferred_lft forever [root@docker-01 ~]# etcdctl ls /coreos.com/network/ /coreos.com/network/config /coreos.com/network/subnets ————————————————————————————————————————————注释———————————————————————————————————————————— Flannel启动过程解析: 1. 从etcd中获取network的配置信息 2. 划分subnet,并在etcd中进行注册 3. 将子网信息记录到/run/flannel/subnet.env中 4. Flannel必须先于Docker启动 ———————————————————————————————————————————————————————————————————————————————————————————— ******(7)验证Fannel网络 [root@docker-01 ~]# etcdctl ls /coreos.com/network/subnets /coreos.com/network/subnets/10.0.6.0-24 [root@docker-01 ~]# etcdctl get /coreos.com/network/subnets/10.0.6.0-24 {"PublicIP":"192.168.100.202","BackendType":"vxlan","BackendData":{"VtepMAC":"d6:08:ca:5c:f8:81"}} [root@docker-01 ~]# cat /run/flannel/subnet.env #在Fannel运行后,会产生一个环境变量文件,包含了当前主机要使用flannel网络的相关参数 FLANNEL_NETWORK=10.0.0.0/16 FLANNEL_SUBNET=10.0.6.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=false
3.在docker-02主机上安装Flannel
******(1)先做基础配置 [root@Centos7 ~]# hostnamectl set-hostname docker-02 [root@Centos7 ~]# su [root@docker-02 ~]# systemctl stop firewalld [root@docker-02 ~]# setenforce 0 setenforce: SELinux is disabled [root@docker-02 ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 写保护,将以只读方式挂载 mount: /dev/sr0 已经挂载或 /mnt 忙 /dev/sr0 已经挂载到 /mnt 上 ******(2)上传flannel软件包,安装flannel [root@docker-02 ~]# /usr/bin/flanneld --etcd-endpoints="http://192.168.100.202:2379" --iface=192.168.100.203 --etcd-prefix=/coreos.com/network & [1] 2936 。。。。。。 [root@docker-02 ~]# ps aux | grep flannel root 2936 0.2 2.0 300508 20472 pts/0 Sl 14:36 0:00 /usr/bin/flanneld --etcd-endpoints=http://192.168.100.202:2379 --iface=192.168.100.203 --etcd-prefix=/coreos.com/network root 2965 0.0 0.0 112676 980 pts/0 S+ 14:37 0:00 grep --color=auto flannel [root@docker-02 ~]# mk-docker-opts.sh [root@docker-02 ~]# cat /run/docker_opts.env DOCKER_OPT_BIP="--bip=10.0.12.1/24" DOCKER_OPT_IPMASQ="--ip-masq=true" DOCKER_OPT_MTU="--mtu=1450" DOCKER_OPTS=" --bip=10.0.12.1/24 --ip-masq=true --mtu=1450" [root@docker-02 ~]# vim /usr/lib/systemd/system/docker.service 。。。。。。 #同样修改docker启动文件 13 # for containers run by docker 14 EnvironmentFile=/run/docker_opts.env 15 ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd:// --containerd=/run/containerd/containerd.sock 16 ExecReload=/bin/kill -s HUP $MAINPID 。。。。。。 #保存退出 [root@docker-02 ~]# systemctl daemon-reload [root@docker-02 ~]# systemctl restart docker [root@docker-02 ~]# ip a 。。。。。。 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:2d:ef:10:10 brd ff:ff:ff:ff:ff:ff inet 10.0.12.1/24 brd 10.0.12.255 scope global docker0 #docker0网卡ip成功修改 valid_lft forever preferred_lft forever 5: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN link/ether 62:a3:d4:19:36:9b brd ff:ff:ff:ff:ff:ff inet 10.0.12.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::60a3:d4ff:fe19:369b/64 scope link valid_lft forever preferred_lft forever
4.在docker-01主机上查看docker-02主机是否加入
[root@docker-01 ~]# etcdctl ls /coreos.com/network/subnets #可以看到subnets目录多了一个目录 /coreos.com/network/subnets/10.0.6.0-24 /coreos.com/network/subnets/10.0.12.0-24 [root@docker-01 ~]# etcdctl get /coreos.com/network/subnets/10.0.12.0-24 #查看发现是203也就是docker-02主机 {"PublicIP":"192.168.100.203","BackendType":"vxlan","BackendData":{"VtepMAC":"62:a3:d4:19:36:9b"}} [root@docker-01 ~]# etcdctl get /coreos.com/network/subnets/10.0.6.0-24 #而另一个就是自己的 {"PublicIP":"192.168.100.202","BackendType":"vxlan","BackendData":{"VtepMAC":"d6:08:ca:5c:f8:81"}}
5.验证不同主机间容器互通
******(1)在docker-01主机上创建容器 [root@docker-01 ~]# docker load -i busybox.tar #需要上传一个可以使用ip a的镜像 5b8c72934dfc: Loading layer [==================================================>] 1.455MB/1.455MB Loaded image: busybox:latest [root@docker-01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 69593048aa3a 6 weeks ago 1.24MB [root@docker-01 ~]# docker run -it busybox:latest #开启容器 / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue link/ether 02:42:0a:00:06:02 brd ff:ff:ff:ff:ff:ff inet 10.0.6.2/24 brd 10.0.6.255 scope global eth0 #看到容器ip为6.2 valid_lft forever preferred_lft forever ******(2)在docker-02主机上创建容器 [root@docker-02 ~]# docker load -i busybox.tar #同样先导入镜像 5b8c72934dfc: Loading layer [==================================================>] 1.455MB/1.455MB Loaded image: busybox:latest [root@docker-02 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 69593048aa3a 6 weeks ago 1.24MB [root@docker-02 ~]# docker run -it busybox:latest / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue link/ether 02:42:0a:00:0c:02 brd ff:ff:ff:ff:ff:ff inet 10.0.12.2/24 brd 10.0.12.255 scope global eth0 valid_lft forever preferred_lft forever / # ping 10.0.6.2 #pingdocker-01主机的容器,发现成功通信 PING 10.0.6.2 (10.0.6.2): 56 data bytes 64 bytes from 10.0.6.2: seq=0 ttl=62 time=0.509 ms 64 bytes from 10.0.6.2: seq=1 ttl=62 time=0.360 ms ^C --- 10.0.6.2 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.360/0.434/0.509 ms
至此,配置Flannel网络完成!!!
七、Flannel的backend其他类型
(1)host-gw
- host-gw bakcend是flannel的另一个backend。
- 与vxlan不同,host-gw不会封装数据包,而是在主机的路由表中创建到其他主机的subnet的路由条目,从而实现容器网络跨主机通信。
- 需要说明的是,host-gw不能跨宿主机网络通信,或者说跨宿主机网络通信需要物理路由支持。性能最好
(2)calico
calico网络:
- bgp转发:相当于host-gw转发,不能跨网段进行转发
- ipip转发:相当于vxlan转发模式
calico优势:
- 同时开启了两种转发模式,但是flannel只能开启其中一种转发模式
- 自动判断,如果宿主机跨网段,就是用ipip的方式转发,如果没有跨网段,就使用bgp方式转发
- 有流量策略管理,控制流量