云原生虚拟网络之 Flannel 工作原理

发表于 2年以前  | 总阅读数:463 次

我以前在看 k8s 相关知识的时候,由于网络知识相对薄弱,所以看到 Flannel 网络这块看不大懂,所以最近就研究了一些云原生虚拟网络知识,写了两篇文章: 云原生虚拟网络之 VXLAN 协议 和 云原生虚拟网络 tun/tap & veth-pair 介绍了虚拟网络的一些知识,这些都是为了 flannel 做铺垫,现在终于来到 Flannel 篇了。

概述

在讨论 Flannel 之前,我们先看看 Docker 的网络模式。在默认情况,Docker 使用 bridge 网络模式:

Docker 在安装的时候会创建一个 docke0 的虚拟网桥,然后当运行容器时,在宿主机上创建虚拟网卡 veth pair 设备,veth pair 设备是成对出现的,从而组成一个数据通道,数据从一个设备进入,就会从另一个设备出来。将veth pair 设备的一端放在新创建的容器中,命名为 eth0;另一端放在宿主机的 docker0 中,以 veth 为前缀的名字命名,这一段内容我在前一篇文章 云原生虚拟网络 tun/tap & veth-pair 已经讲过。

在 Docker 的默认配置下,一台宿主机上的 docker0 网桥,和其他宿主机上的 docker0 网桥,没有任何关联,它们互相之间也没办法连通。所以,连接在这些网桥上的容器,自然也没办法进行通信了。

这个时候 Flannel 就来了,它是 CoreOS 公司主推的容器网络方案。实现原理其实相当于在原来的网络上加了一层 Overlay 网络,该网络中的结点可以看作通过虚拟或逻辑链路而连接起来的。

Flannel 会在每一个宿主机上运行名为 flanneld 代理,其负责为宿主机预先分配一个Subnet 子网,并为 Pod 分配ip地址。Flannel 使用 Kubernetes 或 etcd 来存储网络配置、分配的子网和主机公共 ip 等信息,数据包则通过 VXLAN、UDP 或 host-gw 这些类型的后端机制进行转发。

安装

安装我用的是 kubeasz 来进行安装的,总体参考这个文档:https://github.com/easzlab/kubeasz/blob/master/docs/setup/00-planning_and_overall_intro.md ,基于它我们能快速的搭建好一套完整的 k8s 集群。

在使用 docker exec -it kubeasz ezctl new 集群名 这个命令之后,会在 /etc/kubeasz/clusters/ 这个目录下生成对应的集群配置。

由于我们要自定义安装网络插件,记得修改 /etc/kubeasz/clusters/集群名/hosts 文件内容配置节点信息和网络插件:

...
# master node(s)
[kube_master]
192.168.13.130

# work node(s)
[kube_node]
192.168.13.150
192.168.13.140
192.168.13.130

# 集群网络范围
CLUSTER_CIDR="172.20.0.0/16"

# Network plugins supported: calico, flannel, kube-router, cilium, kube-ovn
CLUSTER_NETWORK="flannel"
...

然后再修改 Flannel 的后端配置/etc/kubeasz/clusters/集群名/config.yml

# node 节点上 pod 网段掩码长度(决定每个节点最多能分配的pod ip地址) 
# 即子网的划分范围
NODE_CIDR_LEN: 24

# [flannel]设置flannel 后端"host-gw","vxlan"等
FLANNEL_BACKEND: "vxlan"

每次用完环境之后可以销毁环境,然后重装,每次重装和销毁都是自动的,相信我,这样是最快的:

docker exec -it kubeasz ezctl destroy 集群名

需要注意的是 udp 模式太老了,现在已经废弃了,所以是无法通过这种方式安装,暂时没找到更好的方式安装,有安装方法的同学不妨和我说一下,感谢。

Subnet 子网

Flannel 要建立一个集群的覆盖网络(overlay network),首先就是要规划每台主机容器的 ip 地址。比如我现在有个三节点的 k8s 集群,那么我们执行下面命令可以看到各自的子网:

[root@localhost ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.0.1/24
FLANNEL_MTU=1450
FLANNEL_ipMASQ=true

通过检查其他两个 node 我们可以知道,在 Flannel 网络中,每个 pod 都会被分配唯一的 ip 地址,且每个 k8s node 的子网各不重叠,没有交集。

下面我们看看子网是怎么分配的。

在 Flannel 安装的时候,一般会设置好整个集群的网络分段,以及子网的长度:

{"Network":"172.20.0.0/16","SubnetLen":24,"Backend":{"Type":"vxlan"}}

在首次启动 Flannel 会在主机中运行 flanneld 作为 agent ,然后从对应的网络划分的范围中,选择一个没有用过的子网作为本机的子网,例如 172.20.0.1/24,然后上报到 etcd ,利用 k8s api 或者 etcd 用于存储整个集群的网络配置,根据配置记录集群使用的网段。

etcd 保证了所有 node 上 flanned 所看到的配置是一致的。同时每个 node 上的 flanned 监听 etcd 上的数据变化,实时感知集群中 node 的变化,从而使得整个集群的 ip 是相互不冲突的。

Flannel backend

关于 Flannel backend 下面讲一下 udp 、vxlan、host-gw。

udp

udp 是 Flannel 最早支持的模式,在这个模式中主要有两个主件:flanneld 、flannel0 。flanneld 进程负责监听 etcd 上面的网络变化,以及用来收发包,flannel0 则是一个三层的 tun 设备,用作在操作系统内核和用户应用程序之间传递 ip 包。

如上图,tun 设备是一个三层网络层设备,它用来模拟虚拟网卡,可以直接通过其虚拟 IP 实现相互访问。tun 设备会从 /dev/net/tun 字符设备文件上读写数据包,应用进程 A 会监听某个端口传过来的数据包,负责封包和解包数据。

所有应用进程 B 发送到另一个虚拟 ip 的数据包都会由应用进程 A 包一层,然后再发出去;发到该虚拟网卡的数据会首先会发到应用进程 A 监听的端口中,然后由它解包之后再发送给应用进程 A ,所以对于 flannel0 来说也是这样。

下图画的是 udp 模式下数据处理过程:

如图,ip 为 172.20.0.8 的容器想要给另一个节点的 172.20.1.8 容器发送数据,这个数据包根据 ip 路由会先交给 flannel0 设备,然后 flannel0 就会把这个 ip 包,交给创建这个设备的应用程序,也就是 flanneld 进程,flanneld 进程是一个 udp 进程,负责处理 flannel0 发送过来的数据包。

flanneld 进程会监听 etcd 的网络信息,然后根据目的 ip 的地址匹配到对应的子网,从 etcd 中找到这个子网对应的宿主机 node 的 ip 地址,然后将这个数据包直接封装在 udp 包里面,然后发送给 node 2。

由于每台宿主机上的 flanneld 都监听着一个 8285 端口,所以 node 2 机器上 flanneld 进程会从 8285 端口获取到传过来的数据,解析出封装在里面的发给源 ip 地址。

flanneld 会直接把这个 ip 包发送给它所管理的 tun 设备,即 flannel0 设备。然后网络栈会将这个数据包根据路由发送到 cni0 网桥,cni0 网桥会扮演二层交换机的角色,将数据包发送给正确的端口,进而通过 veth pair 设备进入到容器里。

至于 veth-pair ,它是一对的虚拟设备接口,它是成对出现的,一端连着协议栈,一端彼此相连着,在 veth 设备的其中一端输入数据,这些数据就会从设备的另外一端原样不变地流出。在 k8s 中的 veth 直接连在 cni0 网桥上,利用网桥的能力就可以将数据发送到同一个 node 节点的不同容器上。

上面所讲的 Flannel udp 模式现在已经废弃,原因就是因为它经过三次用户态与内核态之间的数据拷贝。容器发送数据包经过 cni0 网桥进入内核态一次;数据包由 flannel0 设备进入到 flanneld 进程又一次;第三次是 flanneld 进行 udp 封包之后重新进入内核态,将 UDP 包通过宿主机的 eth0 发出去。

VXLAN

在讲 VXLAN 模式之前,我们现在看看什么是 VXLAN(虚拟可扩展局域网),它是 Linux 内核本身就支持的一种网络虚似化技术。

VXLAN 采用 L2 over L4 (MAC in UDP)的报文封装模式,把原本在二层传输的以太帧放到四层 UDP 协议的报文体内,同时加入了自己定义的 VXLAN Header。在 VXLAN Header 里直接就有 24 Bits 的 VLAN ID,可以存储 1677 万个不同的取值,VXLAN 让二层网络得以在三层范围内进行扩展,不再受数据中心间传输的限制。VXLAN 工作在二层网络( ip 网络层),只要是三层可达(能够通过 ip 互相通信)的网络就能部署 VXLAN 。VXLAN 的整个报文结构如图:

通过上面的报文我们可以知道,其实就是将内层的数据报文再包了一层,然后通过一个叫 VTEP 的进程负责解包和封包。VXLAN header 里面还有一个 VNI 标志,它的作用主要是用来标记数据包是不是属于当前租户的,用来做网络隔离使用。

VXLAN 在通信的时候,VTEP 在进行通信前会通过查询转发表 FDB 来确定目标 VTEP 地址,转发表 FDB 用于保存远端虚拟机/容器的 MAC 地址,远端 VTEP IP,以及 VNI 的映射关系,这个映射关系在 k8s 上 Flannel 会通过 flanneld 进程来自动更新 FDB(查询转发表) 表项。

比如 node1 的容器要和 node2 的容器通信,那么会经过如下:

  • • 发送端:在 node1 中发起 ping 172.20.1.2ICMP 报文经过 cni0 网桥后交由 flannel.1 设备处理。 flannel.1 设备是 VXLAN 的 VTEP 设备,负责 VXLAN 封包解包。因此,在发送端,flannel.1 将原始L2报文封装成 VXLAN UDP 报文,然后从 eth0 发送;
  • • 接收端:node2 收到 UDP 报文,发现是一个 VXLAN 类型报文,交由 flannel.1 进行解包。根据解包后得到的原始报文中的目的 ip,将原始报文经由 cni0 网桥发送给相应容器;

host-gw

host-gw模式通信十分简单,它是通过 ip 路由直连的方式进行通信,flanneld 负责为各节点设置路由 ,将对应节点Pod子网的下一跳地址指向对应的节点的 ip :

比如 node1 的容器想要访问 node2 的容器,那么会匹配 node1 节点上这条路由规则:

[root@easzlab ~]# ip r
...
172.20.1.0/24 via 192.168.13.140 dev ens33

这条路由规则会把目的 ip 地址属于 172.20.1.0/24 网段的 ip 包,应该经过本机的 ens33 设备发出去(即:dev ens33);并且,它下一跳地址(next-hop)是 192.168.13.140

一旦配置了下一跳地址,那么接下来,当 ip 包从网络层进入链路层封装成帧的时候,ens33 设备就会使用下一跳地址对应的 MAC 地址,作为该数据帧的目的 MAC 地址。显然,这个 MAC 地址,正是 node2 的 MAC 地址。

node2 从数据帧里拿到 ip 包后,发现这个 ip 包的目的 ip 地址是 172.20.1.2,然后会匹配 node2 上面这条路由规则:

[root@localhost ~]# ip r
...
172.20.1.0/24 dev cni0 proto kernel scope link src 172.20.1.1

然后会进入到 cni0 网桥,进而进入到对应容器中。

从上面我们可以知道 host-gw 模式能够正常工作的核心,就在于 ip 包在封装成帧发送出去的时候,会使用路由表里的下一跳来设置目的 MAC 地址。这样,它就会经过二层网络到达目的宿主机。所以说,Flannel host-gw 模式必须要求集群宿主机之间是二层连通的。

总结

这篇文章首先使用 kubeasz 来快速搭建我们的实验环境,让大家可以快速的在自己机器上也模拟一个这样的环境。然后讲了一下 Flannel 一些通信机制,包括子网、三个后端(udp、vxlan、host-gw)等,分别研究了它们实现原理。

对比三种网络,udp 主要是利用 tun 设备来模拟一个虚拟网络进行通信;vxlan 模式主要是利用 vxlan 实现一个三层的覆盖网络,利用 flannel1 这个 vtep 设备来进行封拆包,然后进行路由转发实现通信;而 host-gw 网络则更为直接,直接改变二层网络的路由信息,实现数据包的转发,从而省去中间层,通信效率更高。

本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/qqVcOkifm8xRSRk7ZSBMKA

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237227次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8063次阅读
 目录