kubernetes之flannel 网络分析
女主宣言
Flannel是kubernetes的CNI网络插件之一,实质上是一种主机 overlay网络 。flannel支持多种网络转发模式,常用的是vxlan、hostgw等,我们这里以常用的 udp VXLAN协议讲解。
PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!
1
Flannel 特点
1. 使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
2. 建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。
3. 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
4. etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。
2
各个组件的解释:
`Cni0 ` :网桥设备,每创建一个pod都会创建一对 veth pair。其中一端是pod中的eth0,另一端是Cni0网桥中的端口(网卡)。Pod从网卡eth0发出的流量都会发送到Cni0网桥设备的端口(网卡)上。
Cni0 设备获得的ip地址是该节点分配到的网段的第一个地址。
`Flannel.1 `: overlay网络的设备,用来进行 vxlan 报文的处理(封包和解包)。不同node之间的pod数据流量都从overlay设备以隧道的形式发送到对端。
`Flanneld `:flannel在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。同时Flanneld监听K8s集群数据库,为flannel.1设备提供封装数据时必要的mac,ip等网络数据信息。
3
不同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匹配路由表,发送数据给网桥上对应的端口。
测试集群 k8s定义的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 veth1f7db117veth3ee31d24veth521bc030veth5a59ced4veth649412bdveth65bbf59fveth6ed62916veth7e8e7733veth9787b6baveth98c762b8vethaf05d94bvethc07c69cdvethdf62bdedvethe2cf7392vethf4995a29
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网卡上
360云计算
由360云平台团队打造的技术分享公众号,内容涉及数据库、大数据、微服务、容器、AIOps、IoT等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享
kubernetes之flannel 网络分析相关推荐
- 《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——2.2 容器式Linux系统的Docker配置...
本节书摘来自异步社区<Docker容器:利用Kubernetes.Flannel.Cockpit和Atomic构建和部署>一书中的第2章,第2.2节,作者: [美]Christopher ...
- centos7 k8s1.5.2(kubernetes) etcd flannel dns dashboard nginx tomcat slb haproxy keepalived
1. etcd 部署 yum安装etcd [root@3a9e34429b75 /]# yum install etcd -y 设置开机自启动 [root@3a9e34429b75 /]# syst ...
- kubernetes使用flannel网络插件服务状态显示CrashLoopBackOff
使用Kubeadm安装K8s集群,在安装flannel网络插件后,发现pod: kube-flannel-ds 一直是CrashLoopBackOff 报错内容如下: log is DEPRECATE ...
- Kubernetes 安装flannel组件(本地 kube-flannel.yml 文件)
可以直接用kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-fla ...
- 07 Kubernetes 安装flannel组件
一.对生成的kube-flannel.yml文件执行 kubectl apply -f kube-flannel.yaml 二.kube-flannel.yml文件参考如下: cat << ...
- 解决Kubernetes的flannel pod出现Init:RunContainerError问题
一:故障背景 我们有个k8s集群,一个master节点和三个Node节点,其中node2的节点ping不通node1节点的pod ip.需要排查一下为什么ping不通pod ip的问题. 二:故障排查 ...
- Kubernetes — Flannel CNI
目录 文章目录 目录 Flannel CNI Kubernetes 集成 Flannel CNI UDP 模式 网络模型 转发流程 VxLAN 模式 网络模型 分配 IP 地址 下发路由规则 转发流程 ...
- kubernetes flannel 网络
docker网络基础 flannel通信 首先拥有一个k8s集群,安装了flannel网络. 此处使用一个三节点的集群作为测试使用.接下来准备基础环境 apiVersion: apps/v1 kind ...
- 理解Kubernetes网络之Flannel网络
理解Kubernetes网络之Flannel网络 第一次采用kube-up.sh脚本方式安装的Kubernetes cluster目前运行良好,master node上的组件状态也始终是"没 ...
最新文章
- matlab 插值滤波,插值滤波
- R语言使用plotly绘制3D散点图实战
- freetextbox文本编辑器
- SAP物料主数据采购视图采购价值代码设置
- AI基础:简易数学入门
- elasticsearch ik分词插件配置自定义分词词典
- inode mac客户端_淘宝直播PC客户端适合哪些场景使用?
- JVM各个组成部分和其基本功能
- Bailian3258 兔子产子【递推+打表】
- R语言data manipulation学习笔记之subset data
- 计算激光雷达各点的仰角并分析其线数——根据lidar文档垂直角公式计算自己的激光雷达参数/以aloam为例子
- 全网最!详!细!tarjan算法讲解
- FPGA实现IIC协议(一)IIC总线协议
- 一般纳税人税额计算_一般纳税人税率公式是什么样的,税额是怎么计算的-企业纳税|华律办事直通车...
- Windows编程之虚拟桌面实现原理
- Android 11.0 12.0在系统app安装第三方app弹出 解析安装包出现问题 的解决方案
- 游戏开发中的数学和物理算法10-18
- 全球3D打印机行业一流服务品牌
- 免费java空间_jsp以及免费jsp空间的申请
- 三分钟了解阿里云产品:对象存储OSS概述
热门文章
- 让程序间隔执行并可以停止
- linux top 上次更新到现在的cpu时间占用百分比,使用top命令分析linux系统性能的详解...
- vue——缓存路由组件
- android 拖动缩放窗口大小,Android小应用----图片的拖动、缩放
- mysql中列的默认值
- linux中tomcat安装
- 《日志管理与分析权威指南》一1.6 人、过程和技术
- 使用sysbench来测试Row Cache解惑
- windows8.1下安装Cygwin并通过apt-cyg安装软件包
- mysql5.5和5.6版本间的坑