kubernetes主流网络方案Flannel分析
一.Flannel简单说明
Flannel是kubernetes集群的CNI网络插件之一,实质上是一种overlay网络,flannel支持多种网络转发策略,常用的vxlan、hostgw等。
二.Flannel网络的特点
- 使集群中不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
- 简历一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器,覆盖网络时建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在亮一个分组内来讲网络服务与底层基础设施分离,在将封装的数据包转发到端点后,将其解封装。
- 创建一个新的虚拟网卡flannel0接收docker网桥的数据。通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
- etcd保证了所有node上flanned所到的配置是一致的,同时每个node上的flanneld监听etcd上的数据变化,实时感知集群中node的变化。
三.各组件解释
cni0
网桥设备,每创建一个Pod都会创建一对veth pair,其中一端是Pod中的eth0,一端是cni0网桥中的端口(网卡)。Pod从网卡eth0发出的流量都会发送到cni0网桥设备的端口(网卡)上。cni0设备获得的IP地址是该节点分配到的网络的第一个地址
flannel.1
overlay网络的设备,用来进行vxlan报文的处理(封包和解包)。不同node之间的Pod数据流量都从overlay设备以隧道的形式发送到对端。flanneld
flanneld在每个主机中运行flanneld作为agent,它会为所有主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。同时flanneld监听k8s集群数据库,为flannel.1设备提供封装数据时必要的mac,ip等网络数据信息。
四.不同Node上的Pod通信流程
1)Pod中产生数据,根据Pod的路由信息,将数据发送到cni0
2)cni0根据节点的路由表,将数据发送到隧道设备flannel.1
3)flannel.1查看数据包的目的IP,从flanneld获得对端隧道设备的必要信息,封装数据包。
4)flannel.1将数据包发送到对端设备。对端节点的网卡接收到数据包,发现数据包为overlay数据包,解开外层封装,并发送内层封装到flannel.1设备。
5)flannel.1设备查看数据包,根据路由表匹配,将数据发送给cni0设备。
6)cni0匹配路由表,发送数据给网桥上对对应的端口。
测试集群kubernetes定义的flannel网络(POD CIDR)为172.20.0.0/16,下面用案例解释网络内不同Pod间的通信:
10.19.114.100 - pod1 路由
#kubectl -n stack exec -it api-0 -- bash
#ip route show
default via 172.20.0.1 dev eth0
172.20.0.0/24 dev eth0 proto kernel scope link src 172.20.0.73
172.20.0.0/16 via 172.20.0.1 dev eth0
10.19.114.101 - pod2 路由
#kubectl -n stack exec -it redis-64c6c549ff-5plcq -- bash
#ip route show
default via 172.20.1.1 dev eth0
172.20.0.0/16 via 172.20.1.1 dev eth0
172.20.1.0/24 dev eth0 proto kernel scope link src 172.20.1.11
由此可看出,默认POD 网卡网关走 .1 网关,而网关即为cni0 的IP,下一步分析流量到了宿主机之后的走向~
10.19.114.100 宿主机路由
#ip route -n
default via 10.19.114.1 dev eth0
10.19.114.0/24 dev eth0 proto kernel scope link src 10.19.114.100
10.250.250.0/24 dev eth1 proto kernel scope link src 10.250.250.100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.20.0.0/24 dev cni0 proto kernel scope link src 172.20.0.1
172.20.1.0/24 via 172.20.1.0 dev flannel.1 onlink
172.20.2.0/24 via 172.20.2.0 dev flannel.1 onlink
10.19.114.101 宿主机路由
#ip route -n
default via 10.19.114.1 dev eth0
10.19.114.0/24 dev eth0 proto kernel scope link src 10.19.114.101
10.250.250.0/24 dev eth1 proto kernel scope link src 10.250.250.101
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.20.0.0/24 via 172.20.0.0 dev flannel.1 onlink
172.20.1.0/24 dev cni0 proto kernel scope link src 172.20.1.1
172.20.2.0/24 via 172.20.2.0 dev flannel.1 onlink
由如上路由可知,据最小匹配原则,匹配到上面的一条路由表项。从10.19.114.100 上去往172.20.1.0/24 网段的包,发送172.20.1.0 网关,网关设备是flannel.1
flannel.1为vxlan设备,当数据包来到flannel.1时,需要将数据包封装起来。此时的dst ip 为172.20.1.11,src ip为172.20.0.73。数据包继续封装需要知道172.20.1.11 ip地址对应的mac地址。此时,flannel.1不会发送arp请求去获得172.20.1.11 的mac地址,而是由Linux kernel将一个“L3 Miss”事件请求发送的用户空间的flanned程序。Flanned程序收到内核的请求事件之后,从etcd查找能够匹配该地址的子网的flannel.1设备的mac地址,即发往的pod所在host中flannel.1设备的mac地址。Flannel在为Node节点分配ip网段时记录了所有的网段和mac等信息,所以能够知道。
#ip neigh |grep 172
172.20.2.0 dev flannel.1 lladdr 82:c4:0e:f2:00:6f PERMANENT
172.20.1.0 dev flannel.1 lladdr 42:6e:8b:9b:e2:73 PERMANENT
到这里,vxlan的内层数据包就完成了封装。格式是这样的:
VXLAN的转发过程主要依赖于FDB(Forwarding Database)实现, VXLAN设备根据MAC地址来查找相应的VTEP IP地址,继而将二层数据帧封装发送至相应VTEP。
#/sbin/bridge fdb show dev flannel.1
42:6e:8b:9b:e2:73 dst 10.19.114.101 self permanent
ba:8b:ce:f3:b8:51 dst 10.19.114.101 self permanent
42:6f:c7:06:3e:a0 dst 10.19.114.102 self permanent
82:c4:0e:f2:00:6f dst 10.19.114.102 self permanent
kernel需要查看node上的fdb(forwarding database)以获得内层封包中目的vtep设备所在的node地址。因为已经从arp table中查到目的设备mac地址为42:6e:8b:9b:e2:73,同时在fdb中存在该mac地址对应的node节点的IP地址。如果fdb中没有这个信息,那么kernel会向用户空间的flanned程序发起”L2 MISS”事件。flanneld收到该事件后,会查询etcd,获取该vtep设备对应的node的”Public IP“,并将信息注册到fdb中。
当内核查看fdb获得了发往机器的ip地址后,arp得到mac地址,之后就能完成vxlan的外层封装。
具体可以通过wireshark抓包分析:
10.19.114.101节点的eth0网卡接收到vxlan设备包,kernal将识别出这是一个vxlan包,将包拆开之后转给节点上的flannel.1设备。这样数据包就从发送节点到达目的节点,flannel.1设备将接收到一个如下的数据包
目的地址为172.20.1.11,到达10.19.114.101 flannel.1后查找自己的路由表,根据路由表完成转发,由下图可知,flannel.1将去往172.20.1.0/24的流量转发到cni0上去。
查看cni0网桥信息, cni0 网络通过绑定pod 的网卡和宿主机网卡,通过veth实现通信:
#brctl show
bridge name bridge id STP enabled interfaces
cni0 8000.a656432b14cf no veth1f7db117
veth3ee31d24
veth521bc030
veth5a59ced4
veth649412bd
veth65bbf59f
veth6ed62916
veth7e8e7733
veth9787b6ba
veth98c762b8
vethaf05d94b
vethc07c69cd
vethdf62bded
vethe2cf7392
vethf4995a29
docker0 8000.024216a031b6 no
由下图可知 172.20.1.11 的POD 网卡 对应 link-netnsid 0
由下图可知 172.20.1.11 的POD 网卡 在宿主机上的veth 为 vethf4995a29
所以在cni0网桥上挂载的pod的veth pair为vethf4995a29 , eth0@if21和vethf4995a29@if3组成的一对veth,pair。从而将流量注入到pod的eth0网卡上。
本文转载自:https://mp.weixin.qq.com/s/68QMlmGVJTZO5nkrpc-uMg
kubernetes主流网络方案Flannel分析的更多相关文章
- Kubernetes网络方案 Flannel和calico
摘抄某博客 1. Flannel Flannel是为kubernetes设计的一个非常简洁的多节点三层网络方案,解决不同host上的容器互联问题,原理是为每个host分配一个subnet,容器从此 ...
- kubernetes 配置网络插件 flannel
概述 在学习docker时知道docker有四种常用的网络模型 bridge:桥接式网络 joined:联盟式网络,共享使用另外一个容器的网络名称空间 opened:容器直接共享使用宿主机的网络名称空 ...
- 容器中跨主机的网络方案-flannel
容器中的网络是建立docker集群的重要内容. 本文将介绍如何用flannel实现容器的多节点互通. 下图是flannel的实现原理,摘自: http://docker-k8s-lab.readthe ...
- Kubernetes网络方案的三大类别和六个场景
欢迎访问网易云社区,了解更多网易技术产品运营经验. 本文章根据网易云资深解决方案架构师 王必成在云原生用户大会上的分享整理. 今天我将分享个人对于网络方案的理解,以及网易云在交付 Kubernetes ...
- k8s网络之Flannel网络
k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划 ...
- k8s 各种网络方案 - 每天5分钟玩转 Docker 容器技术(170)
网络模型有了,如何实现呢? 为了保证网络方案的标准化.扩展性和灵活性,Kubernetes 采用了 Container Networking Interface(CNI)规范. CNI 是由 Core ...
- 浅谈K8S cni和网络方案
此文已由作者黄扬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接 ...
- k8s 各种网络方案【转】
网络模型有了,如何实现呢? 为了保证网络方案的标准化.扩展性和灵活性,Kubernetes 采用了 Container Networking Interface(CNI)规范. CNI 是由 Core ...
- 基于Kubernetes(k8s)网络方案演进
VIP PaaS在接近两年时间里,基于kubernetes主要经历四次网络方案的变迁: 1. kubernetes + flannel 2. 基于Docker libnetwork的网络定制 3. k ...
- Kubernetes网络之Flannel工作原理
目录 1.Docker网络模式 1.1 bridge网络的构建过程 1.2 外部访问 2.Kubernetes网络模式 2.1 同一个Pod中容器之间的通信 2.2 不同Pod中容器之间的通信 2.3 ...
随机推荐
- 防止恶意解析——禁止通过IP直接访问网站
一.什么是恶意解析 一般情况下,要使域名能访问到网站需要两步,第一步,将域名解析到网站所在的主机,第二步,在web服务器中将域名与相应的网站绑定.但是,如果通过主机IP能直接访问某网站,那么把域名解析 ...
- 使用ssh连接virtual Box里的虚拟机
使用ssh连接virtual Box里的虚拟机 需求:virtual Box提供的文件拖放功能在从虚拟机拖向主机时,会出现一些卡顿,因此考虑使用ssh代替其文件传输功能. 高级 -> 端口转发 ...
- Windows 鼠标右键失效
突然有一天...小邋遢他变了... 哦不是...鼠标右键/键盘菜单键莫名其妙失效了. 解决办法 运行 regedit 打开注册表编辑器 依次展开 HKEY_CURRENT_USER\Software\ ...
- STM32F4_HAL_CAN总线注意事项
如果CAN总线没有连接其他设备,即HL是悬空状态,则发送会失败,下图的Error_Handler需要屏蔽,否则会造成系统卡顿,或影响其他功能模块的使用 /* ********************* ...
- kettle介绍-Step之加密及解密
加密 进入kettle的安装目录 cd /d D:\Application\pdi-ce-6.0.0.0-353\data-integration windows系统命令行执行:Encr.bat -k ...
- fiddler模拟弱网配置
1.延长加载时间 Rules-cumtomize rules,打开fiddler scripteditor 搜索simulatemodem-更改时间为需要延长加载的时间(单位为毫秒)-保存退出 2.打 ...
- 🚀 放弃 Oh-My-Posh,转而手搓 FastPrompt,打造快速高效的命令提示
「够用.够快.够自由」才是我心目中的终端提示符. 一个开发者的烦恼 每天打开 PowerShell,等待提示符加载完毕,我的内心就像在等待一个磨蹭的同事. 我用的是 Windows Terminal ...
- Web前端开发规范手册(有点老,仅供参考)
一.规范目的 1.1 概述 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. 本 ...
- Python3处理文档_word文档(二)
添加分页符 你想要下一个文本在一个单独的页面,即使你所在的一个不是满的."hard"分页符可以做到这一点: document.add_page_break() doc.add_he ...
- <HarmonyOS第一课07>从网络获取数据
视频链接: https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497918284399?ha_sou ...