学习自:
calico网络原理、组网方式和使用-CSDN博客
Kubernetes(k8s)CNI(Calico)网络模型原理 - 腾讯云开发者社区-腾讯云
一文搞明白智一面calico的IPIP网络模式原理 - 干货分享 - 王老师说运维
一图看懂Calico架构原理 - 简书
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形成全网互联的方案会导致规模限制,所有节点需要N
2
个连接,为了解决这个问题,可以采用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(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;
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的下一跳地址。