【星海出品】Calico研究汇总
Calico项目由Tigera公司发起并主导开发
源码
https://github.com/projectcalico/calico?tab=readme-ov-file#-join-the-calico-community
简介
Tigera是一家专注于云原生安全的公司,于2016年成立,其核心产品包括开源的Calico项目以及商业版的Calico Enterprise。
Calico项目的首次提交出现在2015年(根据GitHub提交历史)
项目早期专注于为容器和Kubernetes提供网络连接与安全策略,后续持续迭代成为云原生领域的核心网络方案。
作为Kubernetes的CNI(容器网络接口)插件,提供Pod间的网络通信和IP地址管理(IPAM)。
与K8S兼容的插件有很多 例如:
Calico、Flannel、Canal、Cilium、kube-router
Calico和Flannel的区别
Calico是纯三层网络(L3):基于 IP 路由实现通信,不依赖覆盖网络(Overlay Network)。
使用边界网关协议(BGP)在节点间交换路由信息,支持直接路由模式(无隧道)或 Overlay 模式(如 IPIP、VXLAN)。
性能接近物理网络,易与现有网络设备集成。不对数据包进行封装,不需要NAT和端口映射,扩展性和性能都很好。
网络安全策略:原生支持 Kubernetes NetworkPolicy,提供细粒度流量控制(如基于标签、端口、协议的规则)。
高级功能:支持 eBPF、服务网格集成、威胁检测等。
Flannel:
覆盖网络(Overlay Network):通过 VXLAN、UDP 等隧道技术构建虚拟网络。
子网分配:为每个节点分配一个子网,容器通过隧道跨节点通信。
模式:支持 host-gw(直接路由,无隧道)、vxlan、udp 等。
基础网络连通:仅提供容器间通信,无原生网络策略支持。
依赖外部工具:需结合 Calico 或其他插件实现安全策略。
calico
calico把每个节点都作为一个虚拟路由器,并把每个节点上的Pod当作是节点路由器后的一个终端设备并为其分配一个IP地址。各节点路由器通过BGP协议生成路由规则,从而实现不通节点上Pod间的通信。
BGP是一个去中心化自治路由协议,它通过维护IP路由表或“前缀”来实现自治系统之间的可达性,通常作为大规模数据中心维护不同自治系统之间路由信息的矢量路由协议。Linux内核原生支持BGP,因此可以把一台Linux主机配置为边界网关。
BGP里包含AS(Autonomous System)自治系统, 独立维护着一个路由表,具有去中心化,防止单点故障的功能。
BGP 使用路径矢量(AS_PATH)记录路由经过的 AS 列表,防止路由环路。
AS 之间通过 BGP 对等体建立连接,自主协商路由信息,无需第三方介入。
Calico工作模式:
• IPIP:Overlay Network方案,源数据包封装在宿主机网络包里进行转发和通信。(默认)
• BGP:基于路由转发,每个节点通过BGP协议同步路由表,写到宿主机。 (值设置Never)
• CrossSubnet:同时支持BGP和IPIP,即根据子网选择转发方式。(折中方案,集群当中是有两个网段,又想使用路由的高性能)
通过调整参数改变工作模式:
- name: CALICO_IPV4POOL_IPIP
value: "Always"
由于默认是IPIP模式,如果需要启用BGP模式,则需要修改相关配置: 即将CALICO_IPV4POOL_IPIP 和 CALICO_IPV4POOL_VXLAN 的值设置为Never
这两个参数设置为never后,跨节点之间的通信,就不会经过overlay的封装。自然而然就是通过路由的方式实现跨节点pod通信了。
- name: CALICO_IPV4POOL_IPIPvalue: "Never"# Enable or Desable VXLAN on the default IP pool.
- name: CALICO_IPV4POOL_VXLANvalue: "Never"
BGP的几种模式:
1.Full-mesh (全互联模式)
启用 BGP 后,Calico 的默认行为是创建完整的内部 BGP (iBGP)连接,其中每个节点相互对等。
这允许 Calico 在任何 L2 网络上运行,无论是公有云还是私有云全网格非常适合 100 个或更少的中小型部署
但在更大的规模下,Full-mesh的效率会降低,官方建议使用路由反射模式。2.Route reflectors (路由器反射模式)
若要构建内部BGP(iBGP)的大型集群,可以使用 BGP 路由反射器来减少每个节点上使用的 BGP 对等互连数。
在此模型中,一些节点充当路由反射器,并配置为在它们之间建立Full-mesh模式。
然后,将其他节点配置为与这些路由反射器的子集(通常为2 个用于冗余)对等互连,与Full-mesh模式相比,
减少了BGP对等连接的总数。3.Top of Rack(物理边缘路由器)
在使用Top of Rack模式时,可考虑与路由器反射模式一起使用。
在本地部署中,可以将 Calico 配置为直接与物理网络基础结构对等互连。
通常,这涉及禁用 Calico 的默认Full-mesh模式,而是将 Calico与L3 Top of Rack 路由器对等。
构建本地 BGP 网络的方法有很多种。
如何配置 BGP 由您决定 - Calico 适用于 iBGP 和 eBGP 配置\
您可以有效地将 Calico 视为网络设计中的任何其他路由器。
参考文献:
https://www.cnblogs.com/amsilence/p/18229363
配置文件
节点主机目录:/etc/calico/calico-node 文件位于每个 Kubernetes 节点主机的文件系统中
Calico 以 DaemonSet 形式部署,虽然其核心组件(如 Felix、BIRD)运行在 Calico 容器中,但配置文件需要在节点主机上可见,以便:
调试和管理:管理员可以直接在节点主机上查看和修改配置文件,而无需进入容器。
持久化存储:节点主机的文件系统提供了更稳定的存储,避免容器重启或重建时配置文件丢失。
Felix:calico的核心组件,运行在每个节点上。主要的功能有接口管理、路由规则、ACL规则和状态报告
以DaemonSet方式部署,主要负责维护宿主机上路由规则以及ACL规则。(从别的节点学习路由表的信息)接口管理:Felix为内核编写一些接口信息,以便让内核能正确的处理主机endpoint的流量。特别是主机之间的ARP请求和处理ip转发。
路由规则:Felix负责主机之间路由信息写到linux内核的FIB(Forwarding Information Base)转发信息库,保证数据包可以在主机之间相互转发。
通过 proxy_arp 设置解决跨节点 ARP 请求问题
Veth Pair:每个 Pod 通过 veth 对连接到宿主机的网络命名空间
/etc/calico/calico-node 文件用于配置 Calico 在节点上的运行参数,例如:
网络模式:选择 BGP 模式或 IPIP 模式。
IP 地址池:定义 Pod 的 IP 地址范围和子网。
路由规则:配置路由分发和同步策略。
其他参数:如日志级别、健康检查间隔等。
查看节点 BGP 邻居状态
calicoctl node status
网络策略
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:name: deny-db-accessnamespace: default
spec:selector: role == 'db'ingress:- action: Denysource:namespaceSelector: name == 'default'egress:- action: Allow
监控指标
felix_resync_state:数据同步状态
bgp_peer_up:BGP 邻居状态
iptables_chain_update_seconds:策略更新时间
常用命令
验证 BGP 会话状态:
calicoctl node status
查看路由表:
ip route show table all
检查网络策略:
calicoctl get networkpolicy -A
优化
eBPF
调整BGP
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:name: default
spec:logSeverityScreen: InfonodeToNodeMeshEnabled: trueasNumber: 64512