calico网络

网络基础知识

计算机网络分层

分别为: OSI七层参考模型,TCP/IP参考模型,五层参考模型

image.png

网关,网桥,网卡

网桥:一种网络设备,主要用于连接两个或多个局域网(LAN),通常工作在数据链路层。它可以在两个网络之间中继数据帧,确保数据可以在不同的网络之间正确传输。网桥的主要作用是在同类LAN之间连接,而网关则用于连接不同类型的网络或协议

网卡:是计算机与网络进行物理连接的接口设备,全称为网络接口卡。它集成了局域网功能,有时也称为LAN卡或网络适配器。每个网卡都有一个唯一的MAC地址,用于在局域网内寻址。网卡将数字信号转换为电信号,并通过网线发送出去,属于OSI模型的第一和第二层

网关:一种更为复杂的网络设备,用于实现不同局域网(LAN)的连接。与网桥不同,网关建在应用层,并且可以处理不同网络之间的协议转换,使得使用不同通信协议、数据格式或语言的系统可以相互通信。网关的主要优势在于能够将具有不相容的地址格式的网络连接起来,实现不同网络之间的通

网关是邮电局,所有的信息必须通过这里的打包、封箱、寻址,才能发出去与收进来;网卡是设备,也就是邮电局邮筒,你家的信箱;而网桥是邮递员,但他只负责一个镇里面(局域网)不负责广域网

linux的ipip隧道技术:

https://blog.csdn.net/sanhewuyang/article/details/136491896

calico的主要组件

1.Felix:

功能:

分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,可以与kubernetes共用

作用:

Felix会监听etcd中心的存储,从它获取事件,比如说用户在这台机器上加了一个IP,或者是创建了一个容器等。用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。

2.etcd:

功能:

分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,可以与kubernetes共用

3.BGP Client(BIRD):

功能:

calico 为每一个主机部署一个BGP Client,使用BIRD实现,BIRD是一个独特的持续发展项目,实现了众多动态路由协议,比如BGP,OSPF,RIP等,caloco的角色是监听host上有Felix注入的路由信息,然后通过BGP广播告诉剩余的主机节点,从而实现网络互通

作用:

BIRD是一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,你们路由的时候得到这里来。

4.BGP Route Reflector:

功能:

在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步,从而大大减少连接数。

Calico实现的node之间的俩种网络

ipip模式:

采用linux的ipip隧道技术实现数据包的封装和转发

image.png

具体流程

1、数据包从 Pod1 出到达Veth Pair另一端(宿主机上,以cali前缀开头)。

2、进入IP隧道设备(tunl0),由Linux内核IPIP驱动封装,把源容器ip换成源宿主机ip,目的容器ip换成目的主机ip,这样就封装成 Node1 到 Node2 的数据包。

3、数据包经过路由器三层转发到 Node2。

4、Node2 收到数据包后,网络协议栈会使用IPIP驱动进行解包,从中拿到原始IP包。

5、然后根据路由规则,将数据包转发给cali设备,从而到达 Pod2。

calico模式的启用

CALICO_IPV4POOL_IPIP来实现ipip功能的开关:默认是Always,表示开启;Off表示关闭ipip。

# kubectl get daemonsets. calico-node -n kube-system -o yaml | grep -iA 1 ipip        -                 
                - name: CALICO_IPV4POOL_IPIP          
                  value: "Always"

BGP模式

BGP网络相比较IPIP网络,最大的不同之处就是没有了隧道设备 tunl0。 前面介绍过IPIP网络pod之间的流量发送tunl0,然后tunl0发送对端设备。BGP网络中,pod之间的流量直接从网卡发送目的地,减少了tunl0这个环节。

image.png

具体流程

1.数据包也是先从veth设备对另一口发出,到达宿主机上的cali开头的虚拟网卡上(当创建一个pod时帮你先起一个infra containers的容器,调用calico的二进制帮你去配置容器的网络)

2.宿主机根据路由表决定这个数据包到底发送到哪里去,可以从ip route看到路由表信息,这里显示是目的cni分配的子网络和目的宿主机的网络,

3.当进行跨主机通信的时候之间转发到下一跳地址走宿主机的eth0网卡出去

4.一个宿主机的网卡中,在路由表中找到对应的虚拟网卡cali地址

参考链接

https://www.cnblogs.com/goldsunshine/p/10701242.html

https://blog.csdn.net/m0_62609939/article/details/131787738

https://cloud.tencent.com/developer/article/1638845

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容