K8s为什么需要calico? calico 原理深入理解.

本文详细探讨了Calico在Kubernetes中的作用,解释了为何K8s选择Calico作为网络插件。内容涵盖Calico的三层网络模型、BGP路由原理、IPIP模式以及跨节点通信机制。通过对calico Pod间的通信过程的分析,揭示了Calico如何通过BGP协议实现高效、灵活的网络路由,并讨论了其在大规模集群中的挑战与解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么需要calico?

Status: Not Started
Tags: 网络, 面试

-网络插件”千千万”,为何k8s要用calico

Calico作为容器网络方案和我们前面介绍的那些方案最大的不同是它没有采用overlay网络做报文的转发,而是提供了纯3层的网络模型.

三层通信模型表示每个容器都通过IP直接通信,中间通过路由转发找到对方。在这个过程中,容器所在的节点类似于传统的路由器,提供了路由查找的功能。要想路由能够正常工作,每个容器所在的主机节点扮演了虚拟路由器(vRouter)的功能,而且这些vRouter必须有某种方法,能够知道整个集群的路由信息。(必须开启内核ip forward )

Calico是一个基于BGP的纯三层的数据中心网络方案(也支持overlay网络),并且与Kubernetes、OpenStack、AWS、GCE等IaaS和容器平台有良好的集成。

Calico的设计比较新颖,*之前提到flannel的host-gw模式之所以不能跨二层网络,是因为它只能修改主机的路由,Calico把改路由表的做法换成了标准的BGP路由协议。*相当于在每个节点上模拟出一个额外的路由器,由于采用的是标准协议,Calico模拟路由器的路由表信息可以被传播到网络的其他路由设备中,这样就实现了在三层网络上的高速跨节点网络。

calico的架构

Calico组件主要架构由Felix、Confd、BIRD组成:

  • Felix是负责Calico Node运行并作为每个节点Endpoint端点的守护程序,它负责管理当前主机中的Pod信息,与集群etcd服务交换集群Pod信息,并组合路由信息和ACL策略。
  • Confd是负责存储集群etcd生成的Calico配置信息,提供给BIRD层运行时使用。
  • **BIRD(BIRD Internet Routing Daemon)是核心组件,**Calico中的BIRD特指BIRD Client和BIRD Route Reflector,负责主动读取Felix在本机上设置的路由信息,并通过BGP广播协议在数据中心中进行分发路由。

calico Pod 跨node通信

在这里插入图片描述

1、 ping 数据包从pod1从容器的eth0发出后,发现目标ip不是一个子网,所以直接走网关出去

2、pod 的网关是169.254.1.1

3、对网关IP发起ARP请求,谁是169.254.1.1?mac地址是?发现是一个全E的MAC地址

[root@node2 ~]#arping 169.254.1.1
ARPING 169.254.1.1 from 10.244.104.5 eth0
Unicast reply from 169.254.1.1 [EE:EE:EE:EE:EE:EE]  0.540ms
Unicast reply from 169.254.1.1 [EE:EE:EE:EE:EE:EE]  0.550ms
Unicast reply from 169.254.1.1 [EE:EE:EE:EE:EE:EE]  0.540ms

4、node1的 veth pari 端calixxx收到 这个ARP 请求。通过开启网卡的代理 ARP 功能直接把自己的 MAC 地址返回给 pod1。

pod1中的mac 和calixx的mac都是全e,通过在宿主机上查询ARP表得知需要转达到哪个calixxx

可以看下面的抓包数据。

5、pod1 发送目的地址为pod2的IP 数据包(1-4主要是构造二层包)

6、不在一个子网,本地无法处理,数据包查找本地路由表,匹配到如下路由表:

10.244.136.0/26 via 10.50.10.33 dev tunl0 proto bird onlink

经过tunl0封包之后转发到10.50.10.33 也就是master3

此时IP数据报中Inner IP Header的IP:10.244.166.179 --> 10.244.136.13, OuterIP Header:10.50.10.34 → 10.50.10.33

7、tunl0收到数据包之后会按照ipip协议规范对进来的IP数据包封装一层外层IP头,外层IP的目的ip地址根据6步骤中的路由设置目的ip为网关10.50.10.33,外层IP的源ip地址为本node的ip 10.50.10.34。此时IP数据报变为:

Outer IP Header的IP:10.50.10.34 --> 10.50.10.33;

Inner IP Header的IP:10.244.166.179 --> 10.244.136.13。

tunl0把接收到的数据包封装成ipip报文直接发给tcp/ip协议栈。

8、tcp/ip协议栈根据ipip报文的目的地址和系统路由表(如果在一个子网就不需要),知道目的地址为10.50.10.33的数据报需要通过node master3 的eth0发送。

这一步对我的环境来说只直接二层转发因为是在同一个子网,不需要route

9、数据最终到达master3上的路由

10.244.136.13 dev cali3461c4b49f0 scope link

8、此时消息转发到了master3的veth pair calixxx端的设备,这个设备和容器另外一段的veth pair进行通信

在这里插入图片描述

容器内部的arp表

arp -a</
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyySophia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值