讲解一下Flannel的安装和配置

Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信,

Flannel是CoreOS开发,专门用于docker多机互联的一个工具,让集群中的不同节点主机创建的容器都具有全集群唯一的虚拟ip地址

Flannel使用go语言编写

Flannel实现原理

原理说明

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

数据转发流程

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

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

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

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

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

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

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

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

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

docker0找到连到自己的容器,把报文发送过去。

Flannel安装配置

环境准备

节点名称 IP地址 安装软件
docker1 192.168.198.133 etcd、flannel、docker
docker2 192.168.198.130 flannel、docker

安装etcd

etcd下载地址:https://github.com/coreos/etcd/releases

启动命令:

etcd -name etcd1 -data-dir /var/lib/etcd --advertise-client-urls http://192.168.198.133:2379,http://127.0.0.1:2379 --listen-client-urls http://192.168.198.133:2379,http://127.0.0.1:2379 &

安装Flannel

flannel下载地址:https://github.com/coreos/flannel/releases

添加flannel网络配置信息到etcd:

etcdctl --endpoints http://127.0.0.1:2379 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:用于指定Flannel地址池

SubnetLen:用于指定分配给单个宿主机的docker0的ip段的子网掩码的长度

SubnetMin:用于指定最小能够分配的ip段

SudbnetMax:用于指定最大能够分配的ip段,在上面的示例中,表示每个宿主机可以分配一个24位掩码长度的子网,可以分配的子网从10.0.1.0/24到10.0.20.0/24,也就意味着在这个网段中,最多只能有20台宿主机

Backend:用于指定数据包以什么方式转发,默认为udp模式,host-gw模式性能最好,但不能跨宿主机网络

启动Flannel

# cat /etc/systemd/system/flanneld.service

[Unit]
Description=Flanneld
Documentation=https://github.com/coreos/flannel
After=network.target
Before=docker.service

[Service]
User=root
ExecStartPost=/usr/local/bin/mk-docker-opts.sh
ExecStart=/usr/local/bin/flanneld \
--etcd-endpoints="http://192.168.198.133:2379" \
--iface=192.168.198.133 \
--ip-masq=true \
--etcd-prefix=/coreos.com/network
Restart=on-failure
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
# systemctl daemon-reload# systemctl start flanneld

Flannel启动过程解析:

从etcd中获取network的配置信息,划分subnet,并在etcd中进行注册,将子网信息记录到/run/flannel/subnet.env中,Flannel必须先于Docker启动。

验证Flannel网络

查看etcd中的数据:

# etcdctl ls /coreos.com/network/subnets
/coreos.com/network/subnets/10.0.18.0-24

查看docker1的flannel网卡信息:

38: flannel.1:  mtu 1450 qdisc noqueue state UNKNOWN group default
   link/ether 1a:8e:8b:09:d6:d4 brd ff:ff:ff:ff:ff:ff
   inet 10.0.18.0/32 scope global flannel.1
      valid_lft forever preferred_lft forever
   inet6 fe80::188e:8bff:fe09:d6d4/64 scope link
      valid_lft forever preferred_lft forever

可以看到flannel0网卡的地址和etcd存储的地址一样,这样flannel网络配置完成

配置Docker

Docker安装完成以后,需要修改其启动参数以使其能够使用flannel进行IP分配,以及网络通讯

在Flannel运行之后,会生成一个环境变量文件,包含了当前主机要使用flannel通讯的相关参数,如下:

# cat /run/flannel/subnet.env

FLANNEL_NETWORK=10.0.0.0/16
FLANNEL_SUBNET=10.0.18.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

可以使用flannel提供的脚本将subnet.env转写成Docker启动参数,创建好的启动参数默认生成在/run/docker_opts.env文件中:

# /opt/flannel/mk-docker-opts.sh -c# cat /run/docker_opts.env
DOCKER_OPTS=" --bip=10.0.18.1/24 --ip-masq=false --mtu=1450"
修改docker的服务启动文件如下:

# vim /lib/systemd/system/docker.service

EnvironmentFile=/run/docker_opts.env
ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://

重启docker

systemctl daemon-reload
systemctl restart docker

这时可以看到docker0的ip已经位于flannel网卡的网段之中:

3: docker0:  mtu 1500 qdisc noqueue state DOWN group default
   link/ether 02:42:de:a3:d8:7d brd ff:ff:ff:ff:ff:ff
   inet 10.0.18.1/24 brd 10.0.18.255 scope global docker0
      valid_lft forever preferred_lft forever
   inet6 fe80::42:deff:fea3:d87d/64 scope link
      valid_lft forever preferred_lft forever
38: flannel.1:  mtu 1450 qdisc noqueue state UNKNOWN group default
   link/ether 1a:8e:8b:09:d6:d4 brd ff:ff:ff:ff:ff:ff
   inet 10.0.18.0/32 scope global flannel.1
      valid_lft forever preferred_lft forever
   inet6 fe80::188e:8bff:fe09:d6d4/64 scope link
      valid_lft forever preferred_lft forever

验证容器互通

root@ubuntu:~# docker run -it busybox
/ # ip a
1: lo:  mtu 65536 qdisc noqueue qlen 1000
   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
39: eth0@if40:  mtu 1450 qdisc noqueue
   link/ether 02:42:0a:00:12:02 brd ff:ff:ff:ff:ff:ff
   inet 10.0.18.2/24 brd 10.0.18.255 scope global eth0
      valid_lft forever preferred_lft forever
/ # ping 10.0.12.2
PING 10.0.12.2 (10.0.12.2): 56 data bytes
64 bytes from 10.0.12.2: seq=0 ttl=62 time=0.803 ms
root@ubuntuserver:~/flannel# docker exec -it b4d /bin/bash
root@b4d65fdc02a3:/usr/local/apache2# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
   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
5: eth0@if6:  mtu 1450 qdisc noqueue state UP group default
   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
root@b4d65fdc02a3:/usr/local/apache2#
root@b4d65fdc02a3:/usr/local/apache2#
root@b4d65fdc02a3:/usr/local/apache2# ping 10.0.18.2
PING 10.0.18.2 (10.0.18.2) 56(84) bytes of data.
64 bytes from 10.0.18.2: icmp_seq=1 ttl=62 time=0.794 ms
64 bytes from 10.0.18.2: icmp_seq=2 ttl=62 time=0.957 ms

此时的网络数据包流向如图:

配置backend为host-gw

host-gw bakcend是flannel的另一个backend。与vxlan不同,host-gw不会封装数据包,而是在主机的路由表中创建到其他主机的subnet的路由条目,从而实现容器网络跨主机通信。需要说明的是,host-gw不能跨宿主机网络通信,或者说跨宿主机网络通信需要物理路由支持。

修改etcd如下:

etcdctl --endpoints http://127.0.0.1:2379 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": "host-gw"}}'

重启flanneld与docker:

systemctl restart flanneld docker

可以在宿主机上查看到路由条目:

root@ubuntu:~# ip route
default via 192.168.198.2 dev ens33 proto dhcp metric 100
10.0.12.0/24 via 192.168.198.130 dev ens33
10.0.18.0/24 dev docker0 proto kernel scope link src 10.0.18.1 linkdown
169.254.0.0/16 dev ens33 scope link metric 1000
192.168.198.0/24 dev ens33 proto kernel scope link src 192.168.198.133 metric 100

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/222978.html<

赞 (0)
管理的头像管理
上一篇2025-04-15 18:13
下一篇 2025-04-15 18:14

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注