前言
IT行业中网络技术本身就是最枯燥但又最复杂的一块,kebernetes用到的这些虚拟网络技术更是难上加难,许多知识点容易记混淆,或者说能背过概念但不清楚它出现的前因后果和应用场景,本篇博文会按照底层协议->上层技术->顶层框架的顺序来为大家好好分享下云原生网络的基本概念,帮助大家形成框架式的知识结构。
协议
二层和三层
二层(数据链路层):将数据封装在点对点协议的帧中通过互联网络发送。
三层(网络层):将数据包封装在附加的IP包头中通过IP网络传送。
二层网络是直接通过MAC寻址,三层网络是通过IP寻址,要搞懂二层网络和三层网络的区别,只需要搞明白交换机和路由器就行。
交换机:连入同一交换机的机器是直接通过MAC寻址的,直接发送“帧”,因为已经确定是对方的东西所以可以无脑发过去。
路由器:局域网自动分配IP,处理TCP/IP协议,根据IP地址寻址,局域网内机器对外共享同一个IP地址。
以上是较为概念性的解释,现在用白话再讲解一下。
目的不一样:交换机解决的是同层网络规模的平行扩展问题,路由器解决的是跨网络传输问题。
举个例子,宿舍10个人一起打Dota,如果你们只是自己局域网玩5V5,只需要购买一个具备10个接口的交换机即可;如果你们要开黑跟别人打,那交换机前必须加一个路由器帮你们把网络打通。
二层网络就是通过交换机组成的网络,网络中机器是直接互通的。 三层网络是通过路由器组成的网络,会引入子网的概念,而子网之间的互通就用到了路由技术。
TPC/IP协议
官方定义: 传输控制协议/网际协议,是指能够在多个不同网络间实现信息传输的协议簇。OK,看到“不同网络”四个字,就知道他是为了解决三层问题的。
核心协议:
TCP: 三次握手、传输、四次挥手,是一种可靠、低效的传输。
UDP:客户端有多大胆网络有多大产,是一种不靠谱但高效的传输。
TCP大家都了解,UDP需要多说几句。UDP在安全上存有很大问题。
洪流攻击:伪造大量小UDP包发往同一个目标随机端口,受害系统必须对流入数据进行分析以确定哪个应用服务请求了数据,溢出的UDP报文能使受害主机网络饱和。
技术
overlay网络
任何网络的底层不是二层网络就是三层网络,因为没有这个底层就不存在网络访问能力,kubernetes也不例外。但kubernetes因为自己的虚拟化技术对网络维护带来巨大的管理成本,所以干脆先把网络划分为两大层。底层叫underlay,就是上述的二层或三层网络,是真正负责传输且真实存在的物理网络;上层叫overlay,使用网络虚拟化在物理基础设施之上建立连接的逻辑网络,实现了控制平面与转发平面的分离。
其实不仅是kubernetes,整个云计算领域网络层的发展都离不开Overlay的功劳,而Overlay是依托SDN(Software Defined Network)技术来实现的,最常用的Overlay技术是VXLAN。
VXLAN
通过三层的网络来搭建虚拟二层网络的虚拟化隧道通信技术,底层原理是将二层以太网帧封装在UDP中,实现了看似直连的效果。
VTEP:隧道断点,是进行报文封包和解包操作的网络设备,是Overlay与Underlay联通的核心。
VNI:网络标识ID,每个Overlay中的租户对应一个VNI,一个租户代表一个虚拟机器或容器,租户内网络直通,租户间网络隔离。
Tunnel:VXLAN隧道,一个逻辑上的概念,或者说是想象中的概念。通过VXLAN技术让VNI双方看似搭建了一个单独的通信信道,但其实底层是UDP技术。
BGP
BGP用于在不同的自治系统(AS)之间交换路由信息。自治系统就是处于一个管理机构控制之下的路由器和网络群组.
优势:
1、使用TCP作为传输协议,提高了路由传输的可靠性;
2、可自定义路由汇总和使用路由惩罚实现路由的稳定性;
3、可支持英特网规模的网络。
eBPF
直接在内核层对网络流量做过滤和复制的技术,我曾经写过一篇博文详细介绍eBPF的由来,详见《BPF相关技术与发展史》
以上都是具体的实现虚拟网络的技术,我们真正使用是需要依赖具体的技术框架。
框架
flannel
flannel的设计目的是为集群中的所有节点重新规划IP地址的使用规则,从而使得集群中的不同节点主机创建的容器都具有全集群“唯一”且“可路由的IP地址”,并让属于不同节点上的容器能够直接通过内网IP通信。
实现原理:
flannel以守护进程方式运行在node上,没有master节点的概念,所有的flannel对接etcd,由etcd做为存储和控制。集群中所有容器共享一个IP段,每个node使用其中一个小地址段,容器启动时向flannel注册申请一个本node中空闲IP。跨node容器间访问时采用VXLan隧道技术。
calico
Calico的功能更为全面,不仅提供主机和pod之间的网络连接,还涉及网络安全和管理。
Calico不基于overlay,而是基于BGP路由协议,所以没有封包解包的过程,CPU消耗和性能上要优于flanel。
calico支持3种模式:BIRD模式(两两互联);RR模式(路由反射器);IPIP模(多租户跨网互通)。
cilium
基于eBPF为Kubernetes提供基本的网络互连互通的能力,实现容器集群中包括Pod、Service等在内的基础网络连通功能。
依托eBPF,实现Kubernetes中网络的可观察性以及基本的网络隔离、故障排查等安全策略;
依托eBPF,突破传统主机防火墙仅支持L3、L4微隔离的限制,支持基于API的网络安全过滤能力。
Cilium有两种模式:叠加网络Overlay模式和直接本地路由模式,其实本质可参考flanel和calico,前者依赖隧道,后者依赖BPG。
CNI
网络框架有这么多,k8s是怎么对接它们的,换框架怎么办?这里需要引入一个概念:CNI(Container Network Interface)容器层和网络层之间的一个接口规范,相当于一个抽象层用于容器与网络的松偶,flannel、calico-、cilium它们都基于这个规范。
总结
云原生网络发展历程:overlay网络->BGP->eBPF,flannel->calico->cilium。
目前对Kubernetes网络的认知也趋于一致。大致分为两大类,一类是Cluster IP,是一层反向代理的虚拟网络;一类是 Pod IP,是容器间交互数据的网络数据平面。
目前主流是calico,而且calico也开始支持eBPF,cilium还未流行的原因是内核要求太高,需要4.9.17以上,但cilium才是未来。