学习自:calico网络原理、组网方式和使用-CSDN博客
Kubernetes(k8s)CNI(Calico)网络模型原理 – 腾讯云开发者社区-腾讯云
一文搞明白智一面calico的IPIP网络模式原理 – 干货分享 – 王老师说运维
一图看懂Calico架构原理 – 简书
1、简介
1)calico
calico是一个虚拟网络解决方案,它完全利用路由规则实现动态组网,通过BGP协议通告路由。Calico使用相同的引擎为主机、Pod、应用程序在网络层执行网络策略。它不仅提供了主机与Pod之间的网络连接,还涉及网络安全、管理。
calico是一个基于BGP的纯三层网络方案。calico在每个计算节点上都用Linux Kernel实现了一个高效的虚拟路由器vRouter来负责数据转发。每个vRouter通过BGP协议负责把自己上运行的workload路由信息向整个calico网络内传播——小规模部署可以直接互联,大规模下可以通过指定的BGP route reflector来完成。
每个vRouter都通过BGP1协议将本节点上容器的路由信息向整个calico网络广播,并自动设置到达其他节点的路由转发规则。
calico节点组网时可以直接用数据中心的网络结构(L2或L3),不需要额外的NAT、隧道、Overlay Network,没有额外封包解包,可以节约CPU运算,提高网络效率。
calico基于iptables提供了丰富的网络策略,实现了K8S的网络策略(Network Policy),提供了容器间网络可达性限制的功能。
2)calico优点
endpoint组成的网络是单纯三层网络,报文的流向完全通过路由规则控制,没有overlay等额外开销。
calico的endpoint可以漂移,并且实现了acl。
3)calico缺点
路由数目与容器数目相同,非常容易超过路由器、三层交换、node的处理能力,从而限制了整个网络的扩张;
calico的每个node上会设置大量(海量)的iptables规则、路由,运维、排障难度大;
calico的原理决定了它不可能支持VPC,容器只能从calico设置的网段中获取ip;
calico目前的实现没有流量控制的功能,会出现少数容器抢占node多数带宽的情况;
calico的网络规模受到BGP网络规模的限制。
4)calico架构
Felix:calico核心组件,运行在每个需要运行workload的Node上的agent进程,主要负责配置路由及ACLs(访问控制列表)等信息来确保endpoint的连通状态,保证跨主机容器的网络互通。主要功能有接口管理、路由规则、ACL规则、状态报告;
etcd:保证数据一致性的数据库,存储集群中所有路由信息,确保Calico网络状态的准确性。为了保证数据可靠和容错,至少应该有3个以上的etcd节点;
Orchestrator Plugin:协调器插件,负责允许K8S、OpenStack等原生云平台方便管理Calico,可以通过各自的API来配置Calico网络实现无缝集成。如K8S的cni网络插件;
BGP Client(Bird):BGP客户端,Calico在每个节点上都会部署一个BGP客户端,它的作用是将Felix的路由状态信息读入内核,并通过BGP协议在集群中分发。当Felix将路由插入Linux内核FIB中时,BGP客户端将获取这些路由并将它们分发到部署中的其他节点。来确保部署时有效的路由流量。
BGP Router Reflector:BGP路由反射器,用于较大规模部署的情况下。大型网络仅仅使用BGP Client形成全网互联的方案会导致规模限制,所有节点需要N2个连接,为了解决这个问题,可以采用BGP的Router Reflector方法,使所有BGP Client仅和特定的RR节点互联并做路由同步(防止节点两两互联),从而大大减少连接数。
Calicoctl:calico命令行管理工具。
5)calico工作原理
calico把每个OS的协议栈都认为是一个路由器,然后把所有容器都认为是连在这个路由器上的网络终端,在路由器之间跑标准路由协议——BGP协议,之后让它们自行学习网络拓扑及转发规则。因此Calico就是一个纯三层方案,让每台机器的协议栈的三层去确保容器之间的三层连通性。
6)calico两种网络方式
①IPIP
从字面意思理解,就是把一个IP包套在另一个IP包中,也就是将IP层封装到IP层的一个tunnel中。
它的作用基本上相当于一个基于IP层的网桥。普通的网桥是MAC层,用不到IP,而IPIP方式则是用两端路由做一个tunnel,将两个本来不通的网络通过点对点连接起来。
IPIP技术的源代码可以在内核net/ipv4/ipip.c中找到。
calico IPIP模式工作原理如下图:
其中有个设备tunl0,它是一个IP隧道(IP tunnel)设备。
在上边这个例子中,IP包进入IP tunnel之后,就会被Linux内核的IPIP驱动接管。IPIP驱动会将这个IP包直接封装在一个宿主机网络的IP包中,如下:
②BGP
BGP(Border Gateway Protocol,边界网关协议)是互联网上一个核心的去中心化自治路由协议。
它通过维护IP路由表或前缀表来实现自治系统(AS)之间的可达性,属于矢量路由协议。
BGP不用传统内部网关协议(IGP)的指标,而是用基于路径、网络策略、规则集来决定路由。因此它更适合被称为矢量性协议,而非路由协议。
BGP会将接入机房的多条线路(电信、移动、联通等)融合为一体,实现多线单IP——服务器只需要一个IP地址,最佳访问路由的确认,是由网络上骨干router根据跳数等技术指标确定的,不占用服务器的任何系统。
BGP网络相比IPIP,最大的区别在于没有隧道设备tunl0。前边介绍过IPIP网络中Pod之间的流量发给tunl0,之后tunl0发给对端设备。而BGP网络中,Pod之间的流量直接从网卡发送到目的地,减少了tunl0这个环节。
7)名词解释
endpoint:接入点,接入到calico网络中的网卡称为endpoint;
AS
Autonomous System,网络自治系统,一个自治系统是一个有权自主决定本系统采用何种路由协议的小型单位。
AS通过BGP协议与其他AS网络交换路由信息;AS中内部有多个BGP Speaker,分为IBGP、EBGP,其中EBGP用于与其他AS中的EBGP建立BGP连接。
可以将calico中的node当成一个AS,而node中的容器是AS中的router,calico通过BGP解析,将整个网络中容器地址的路由表绘制出来。
ibgp:internel bgp,AS内部的BGP Speaker,当BGP运行在同一AS中,称为IBGP;
ebgp:externel bgp,AS边界的BGP Speaker,当BGP运行于不同AS之间,称为EBGP。
workloadEndpoint(wl):虚拟机、容器使用的endpoint
hostEndpoints:物理机(node)的地址。
①ACL:Access Control Lists,访问控制列表
了解ACL_一往无前从今始的博客-CSDN博客
访问控制列表_百度百科
ACL,访问控制列表,是由一条或多条规则组成的集合,ACL本质上是一种报文过滤器,设备可以根据读取到的第二、三层的报头信息,依据预先设定好的规则对包进行过滤,符合规则的包允许通过,否则不允许。
2、组网原理
之前曾说过endpoint组成的网络就是单纯三层网络,只涉及网络层及以下的协议层,因此calico组网的核心原理就是IP路由,每个容器/虚拟机都会分配一个workload-endpoint(wl)。
当从nodeA上的容器conA访问nodeB上的容器conB时:
如果nodeA和nodeB位于同一个LAN,那么就像上图type1那样,下一跳的地址直接就是nodeB,此时经过2层交换机即可到达。
如果nodeA和nodeB位于不同网段,就像上图type2所示,报文会被路由到下一跳,经过三层交换或路由器,一步步跳转到node-B。
此时存在一个问题:nodeA如何知道下一跳的地址?
答案是node之间通过BGP协议交换路由信息。每个node上都会运行一个路由软件Bird,并且被设置为BGP Speaker,与其他node通过BGP协议交换路由信息。
简而言之,就是每个node都会向其他node发送一个这样的消息:我的IP是X.X.X.X,某个IP、网段在我这里,如果要去这个IP或网段,那么报文下一跳的地址是我。
通过这种方式,每个Node都可以知晓每个workload-endpoint的下一跳地址。