kubernetes网络之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的特点
1.使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
2.建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。
3.创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
4.etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。
flannel对网络要求提出的解决方法
一、互相不冲突的IP
1.flannel利用kubernetes Api通过ETCD存储整个集群的网络配置,根据配置记录集群使用的网段
2.flannel在每个主机上英雄flanneld作为agent,它会为所在主机从集群的网络地址空间中获取一个小网段subnet,本主机内所有容器IP将从中分配
1)Node01节点

2)Node02节点


在flannel network中,每个Pod都会分配一个唯一的IP地址,且每个k8s Node的subnet不重叠
二、Pod之间互相访问
1.flanneld将本机获取的subnet以及主机之间通信的public ip通过etcd存储起来,需要时发给相应模块
2.flanneld通过各种backend mechanism,如vxlan、udp等跨主机转发容器之间的网络流量,完成容器之间的跨主机通信
Flannel架构原理
一、flannel架构图和各组件

1.cni0:网桥设备,每创建一个Pod都会创建一对veth pair,其中一端是pod的eth0,另一端是cni0网桥中的端口(网卡),Pod中从eth0的流量都会发送到cni端口(网卡)上

Cni0设备获取到的地址,是分配到本机网段的第一个IP
2.Flannel.1:overlay网络的设备,用来进行vxlan的报文处理(封包和解包);不同node之间的Pod数据流量都从overlay设备以隧道的形式发送到对端

3.flanneld:flannel会在每个主机运营flanneld作为agent,它会会主机在集群网络地址空间中获取一个小网段,本机内所有容器的IP地址都从中分配;
同时flanneld会监听etcd,为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匹配路由表,发送数据给网桥上对应的端口
具体的通信流程
测试Node1的Pod和Node2的Pod通信流程

Node1上的PodIP是:10.244.1.3,命名为Pod1
Node2上的PodIP是:10.244.2.2,命名为Pod3
一、Pod1中的容器到cni0设备
1)Pod1能Ping通Pod3

2)Ping包的dst ip为10.244.2.2,根据路由表匹配到第二条路由表项,去往10.244.0.0/16的包都转发给10.244.1.1

3)去宿主机Node1上查看cni0的IP地址是 10.244.1.1

二、cni0到flannel.1 (这一步在宿主机操作(Node1))
1)当icmp包到达cni0后,cni发现dst ip为10.244.2.2,cni根据路由表来查找匹配项目

根据最小匹配原则,匹配到图上的一条路由表,去往10.244.2.0网段的包,发送到10.244.2.0网关,网关设备是flannel.1
三、flannel.1(node1的flannel.1)
flannel .1为vxlan设备,当数据包来到flannel.1时,需要将数据包封装起来,此时的dest ip为10.244.2.2,src ip为10.244.1.3,数据包需要知道10.244.2.2的mac地址.此时flannel.1不会发送arp请求去获得10.244.2.2的mac地址,而是由Linux kernel将一个"L3 miss"事件请求发送给用户空间的flanned程序.flanneld程序收到内核的请求事件后,从etcd查找能够匹配该地址的子网的flannel.1设备的mac地址;flannel在为node分配ip网段时记录了所有的网段和mac等信息,所以能知道,交互流程如下图:↓↓↓

flanneld将查询到的信息放入master node host的arp cache表中

此时,vxlan的内层数据包就完成了封装,格式如下所示

简单总结这个流程
- 数据包到达flannel.1.通过查找路由表,知道数据包要通过flannel.1发往 10.244.2.0(对端flannel.1的设备地址)
- 通过apr cache表,知道了目的ip 10.244.2.0的mac地址(对端flannel.1的mac地址)
- kernel需要查看node上的fdb(forwarding database)以获得内层封装包中目的veth设备所在的node地址.因为已经从arp table中查到目的设备mac地址为e2:11:f0:43:33:fd,同时在fdb中存在该mac地址对应的node节点地址.如果fdb中没有,kernel会向用户空间的flanneld发起"L2 MISS"事件.flanneld收到该事件后,会查询etcd,获取该veth设备对应的node的"public ip",并将信息注册到etcd
当内核获得了发往机器的IP地址后,arp得到mac地址,之后就能完成vxlan的外层封装

四、对端flannel.1(node02机器)
Node节点的eth0网卡接收到vxlan数据包,kernel将识别出这事一个vxlan数据包,将包拆开后转给节点上的flannel.1设备,这样数据包就从发送节点到达目的节点,flannel.1将收到这样一个数据包

目的地址为10. 244.2.2,flannel.1查找自己的路由表(node02上的flannel.1),根据路由表完成转发

根据最小匹配原则,flannel.1将去往10.244.2.0的流量转发到cni0上去
五、对端cni0到Pod(node02节点上的)
cni0是一个网桥设备.当cni0拿到数据包后,通过veth pair,将数据发送给pod.
1)查看node2节点中的网桥

2)在node2节点上通过arp解析可以看出,10.244.2.2的mac地址为:c2:33:c5:49:c0:0d

3)该地址为pod的网卡eth0的地址(node2的容器)

通过以上可以看出,cni0通过veth pair把流量转发给Pod3
简单总结cni0转发流量的原理
- 首先通过arp查找出ip地址对应的mac地址
- 将流量转发给mac地址所在eth0网的对应的veth pair端口
- veth pair端口接收到流量,直接将流量注入到pod的eth0网卡上
https://www.cnblogs.com/goldsunshine/p/10740928.html参考
kubernetes网络之Flannel的更多相关文章
- Kubernetes网络之Flannel工作原理
目录 1.Docker网络模式 1.1 bridge网络的构建过程 1.2 外部访问 2.Kubernetes网络模式 2.1 同一个Pod中容器之间的通信 2.2 不同Pod中容器之间的通信 2.3 ...
- Kubernetes网络方案 Flannel和calico
摘抄某博客 1. Flannel Flannel是为kubernetes设计的一个非常简洁的多节点三层网络方案,解决不同host上的容器互联问题,原理是为每个host分配一个subnet,容器从此 ...
- Kubernetes网络插件Flannel的三种工作模式
跨主机通信的一个解决方案是Flannel,由CoreOS推出,支持3种实现:UDP.VXLAN.host-gw 一.UDP模式(性能差) 核心就是通过TUN设备flannel0实现(TUN设备是工作在 ...
- 3.kubernetes的CNI网络插件-Flannel
目录 1.1.K8S的CNI网络插件-Flannel 1.1.1.集群规划 1.1.2.下载软件.解压.软链接 1.1.3.最终目录结构 1.1.4.拷贝证书 1.1.5.创建配置 1.1.6.创建启 ...
- kubernetes进阶(二)核心网络插件Flannel
网络插件Flannel介绍:https://www.kubernetes.org.cn/3682.html 首先,flannel利用Kubernetes API或者etcd用于存储整个集群的网络配置, ...
- k8s网络之Flannel网络
k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划 ...
- Kubernetes网络的4种解决方案
一.Kubernetes + Flannel Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的 ...
- kubernetes网络原理
1.1. 基础原则 每个Pod都拥有一个独立的IP地址,而且假定所有Pod都在一个可以直接连通的.扁平的网络空间中,不管是否运行在同一Node上都可以通过Pod的IP来访问. k8s中Pod的IP是最 ...
- Kubernetes网络方案的三大类别和六个场景
欢迎访问网易云社区,了解更多网易技术产品运营经验. 本文章根据网易云资深解决方案架构师 王必成在云原生用户大会上的分享整理. 今天我将分享个人对于网络方案的理解,以及网易云在交付 Kubernetes ...
随机推荐
- 转:ubuntu16安装python3.6并将环境设置为系统默认
按照本文升级到3.6,但pip无法运行了,问题没有解决 1.添加python3.6安装包,并且安装 sudo apt-get install software-properties-common su ...
- Asp.Net微信js分享
1.准备工作 官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#111 必须是认证过的公众号才 ...
- Qt常用类——QWidget
QWidget类是所有用户界面对象的基类. Widget是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己. 每个Widget都是矩形的,它们按照Z-order进行排序.
- cf1179D
cf1179D 链接 cf 思路 csdn 很玄学,正解是斜率优化dp,但被一个奇妙的贪心过了. 代码 #include <bits/stdc++.h> #define ll long l ...
- ZROI 暑期高端峰会 A班 Day1 组合计数
AGC036F Square Constriants 一定有 \(l_i<p_i\le r_i\). 考虑朴素容斥,枚举每个数是 \(\le l_i\) 还是 \(\le r_i\).对于 \( ...
- 特征值、特征向量与PCA算法
一.复习几个矩阵的基本知识 1. 向量 1)既有大小又有方向的量成为向量,物理学中也被称为矢量,向量的坐标表示a=(2,3),意为a=2*i + 3*j,其中i,j分别是x,y轴的单位向量. 2)向量 ...
- 2018-2019-2 20165315《网络对抗技术》Exp 8 Web基础
2018-2019-2 20165315<网络对抗技术>Exp 8 Web基础 一.实验内容 Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST ...
- Java面向对象入门
Java面向对象入门 一.Java面向对象的基本组成 Java类及类的成员:属性.方法.构造器:代码块.内部类 面向对象三大特征:封装.继承.多态(抽象) 关键字:this.super.static. ...
- excel绘制多列 其中一列作为横坐标 ; 数值拟合
excel绘制多列,其中最左列作为横纵坐标: 选中很多列,然后,,点击菜单栏的“插入”->“图标” -->在弹出的“插入图表”对话框中选择“X Y(散点图)”,默认是条形图. 左边的列会 ...
- JMeter扩展插件实现对自定义协议进行支持 转
本文版权归xmeter.net 所有.欢迎转载,转载请注明出处. 摘要## JMeter本身提供了插件机制,允许第三方扩展JMeter以支持JMeter不支持的协议的测试.本文以扩展一个简单的Apac ...