Kubernetes二进制部署——Flannel网络
一、Flannel简介
- Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
- 在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。
- Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。
- Flannel实质上是一种“覆盖网络(overlaynetwork)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,默认的节点间数据通信方式是UDP转发。
二、Flannel原理
- 首先,Flannel通过Kubernetes API把整个集群的网络配置存储在Etcd中,其中最主要的内容为设置集群的网络地址空间。例如,指定整个集群内所有容器的IP都取自“10.1.0.0/16”网段。
- 接着,Flannel在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet(子网),本主机内所有容器的IP地址都将从中分配。
- 然后,Flanneld再将本主机获取的subnet以及用于主机间通信的Public IP,同样通过Kubernetes API存储在Etcd中。
- 最后,Flannel利用各种数据转发方式,例如udp、vxlan、AWS、VPC和GCE路由等等,跨主机转发容器间的网络流量,完成容器间的跨主机通信。

- 首先,定义两个节点主机A POD-A 主机B POD-B
- POD-A首先会发送给docker 0网桥
docker 0会转发给flannel0网桥 - flannel0会转发给flanneld(后台进程),flanned会到ETCD中查看ETCD维护的路由表条目/信息,确认往哪去发送
- flanned 会在转发给宿主机的物理网卡
- 物理网卡会以UDP的方式转发数据包(数据包中除了主机A和主机B的源TP和目标IP之外,还会封装POD-A和POD-B的源/目标Ip)
- 主机B接收到
- 首先解封装,发现源IP地址是找自己的(主机IP地址)
- UDP 转发过来,解封装之后,发现了封装在UDP内部的POD IP(源/目标)
- 主机B的物理网卡就会发送给flanned进行处理
- 而flanned会查询ETCD中维护的路由表信息,发现是自己的pod (也能查询到找的docker-ip网段是什么网段)
- flanned会发送给自己的flannel0网桥,flannel网桥再发送给对应的docker (0)网桥
- docker 网桥(网关),会把这个数据包发送给对应的POD-B
三、Flannel的作用
- 使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
- 建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。
- 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
- etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化
- Overlay Network:覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来
- VXLAN:将源数据包封装到UDP中,并使用基础网络的IP/MAC作外层报文头进行封装,然后再以太网上传输,到达目的地后由隧道端点解封并将数据转发到目标地址
四、Flannel 网络配置
1.node 节点安装 docker
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker
'不要忘记配置镜像加速和优化网络'
vim /etc/sysctl.conf
net.ipv4.ip_forward= 1
service network restart
systemctl restart docker
2.master配置
1、 写入分配的子网段到ETCD中,供flannel使用(master主机)
需要在有证书的目录下使用此命令
写入分配的子网段到ETCD中,供flannel使用
cd k8s/etcd-cert/
/opt/etcd/bin

本文介绍Flannel在Kubernetes中的角色与配置流程。Flannel为容器提供唯一IP,通过覆盖网络实现容器间的通信。文章详细讲解Flannel的工作原理、安装步骤及网络配置。
最低0.47元/天 解锁文章
1949





