【K8s】Kubernetes 网络之 Calico 插件理论

文摘   科技   2024-11-18 11:26   北京  

下内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~





基本介绍

Calico 是一个开源的网络及网络安全解决方案,主要用于容器、虚拟机、基于本地主机的工作负载之间的网络连接。

Calico 以其性能、灵活性而闻名,是一个功能全面且复杂的网络解决方案,适用于需要高性能、高可扩展性和安全性的容器网络应用场景,支持的平台包括 Kubernetes、OpenShift、Mirantis Kubernetes Engine (MKE)、OpenStack 以及裸机服务。


Calico 的主要特点如下:
  • 支持多种数据层,包括 Linux eBPF、Linux 标准网络和 Windows HNS
  • 具有丰富的网络策略模型可以轻松锁定需要的通信流量,还内置支持 Wireguard 加密,为 Pod 之间的流量提供保护
  • 可以使用 Linux eBPF 或 Linux 标准网络来提供高性能网络。Calico 可以在大多数环境中运行而无需使用覆盖网络,从而避免了数据包封装/解封的开销,其控制平面和策略引擎可以最大限度地降低整体 CPU 使用率
  • 具备良好的可扩展性
  • 支持 Kubernetes 工作负载与非 Kubernetes 或传统工作负载无缝、安全地通信,所有工作负载都受相同的网络策略模型的约束
  • 支持完整的 Kubernetes 网络策略,与 Kubernetes API 无缝协作,使用户能够更灵活地定义网络策略

Calico 的核心组件如下:
  • Felix:运行在每个节点的代理程序,主要负责网络接口监听、路由信息管理、ARP 信息管理、ACL 规则管理、上报节点网络状态、创建 Calico 虚拟网络设备(如 tunl0、vxlan.calico)
  • ETCD:存储集群中节点的所有路由信息,确保网络元数据的一致性、Calico 网络状态的准确性,可以与 Kubernetes 共用
  • BIRD:BGP 客户端,作用是监听并将 Felix 的路由信息读入内核,并通过 BGP 协议在集群节点中广播分发,实现网络互通。BIRD 支持的路由协议包括 BGP、OSPF、RIP 等
  • BGP Route Reflector:使所有 BGP 客户端仅与特定的 Route Reflector(路由反射)节点互联,并进行路由同步以减少连接数,可以解决大型网络下的节点规模问题
  • Calicoctl:Calico 的命令行管理工具

GitHub 地址:https://github.com/projectcalico/calicoCalico 官方文档:https://docs.tigera.io/archive/v3.21/about/about-calico




网络模式

1、动态路由模式
动态路由模式(Dynamic Routing)采用 BGP 路由协议,自动学习来自其它 AS 自治系统(在 Kubernetes 中即为集群中其他 Node 节点)上的路由条目,也可以称为 BGP 模式。
如果集群 Node 节点均处于同一个二层网络中、或数量规模较大,建议采用该模式。
BGP(Border Gateway Protocol, 边界网关协议)是一种基于策略的域间路由协议,用于实现网络中不同自治系统(AS)之间的互联互通,其特点是可以自动发现和学习路由条目,并找出最佳路由。
BGP 模式可以细分为以下两种模式:
  • 全互联(Node-to-Node Mesh)模式
    • 每一个 BGP Speaker 都需要和其它 BGP Speaker 建立 BGP 连接,BGP 连接总数为 N^2。如果集群规模过大、Node 节点数量过多会消耗大量连接,因此集群 Node 节点数量超过 100 台后,官方不建议使用该模式
  • 路由反射(Router Reflection,RR)模式
    • 指定一个或多个 BGP Speaker 为 Router Reflection,与网络中其他 BGP Speaker 建立连接,每个 BGP Speaker 只需与 Router Reflection 建立 BGP 连接即可获取全网的路由信息。在 Calico 中可以通过 Global Peer 实现该模式


2、覆盖网络模式

覆盖网络模式(Overlay Network)采用 IPIP 或 VXLAN 协议对底层网络数据报文进行封装,然后通过上层覆盖网络通信。

如果集群 Node 节点处于不同的二层网络中,可能由于到达目标主机的跳数太多导致性能下降,建议采用该模式。

覆盖网络模式可以细分为以下两种模式:

  • IPIP(IP in IP)模式

    • IPIP 模式下的每个数据报文都有两个 IP 网络层,内层是 Pod 容器之间的 IP 网络报文,外层是 Node 节点之间的网络报文

    • IPIP 模式下的 Calico 会为每个 Node 节点创建一个 tunl0 接口,作为隧道出入口设备,用来封装 IPIP 数据报文,Pod 间的通信经由 IPIP 的三层隧道进行转发

  • VXLAN(Virtual eXtensible Local Area Network)模式
    • VXLAN 模式的 Calico 会将数据报文的源 MAC 地址和目的 MAC 地址,分别替换为本机 VXLAN 网卡和目的节点 VXLAN 网卡的 MAC 地址,外层 UDP 网络报文的目的 IP 地址将根据路由及目的节点 VXLAN 的 MAC 查 FDB 表获取
    • VXLAN 模式的 Calico 会为每个 Node 节点创建一个 vxlan.calico 接口,作为隧道出入口设备,用来封装 VXLAN 数据报文,Pod 间的通信经由 VXLAN 的三层隧道进行转发
IPIP 模式与 VXLAN 模式对比:
  • 与 VXLAN 模式相比,IPIP 模式开销较小、更轻量化,但其安全性也更差一些
  • IPIP 模式与VXLAN 模式均支持 Always 和 CrossSubnet 两种封装模式
    • Always:始终封装所有流量
    • CrossSubnet:仅在流量跨子网时对其进行封装

最后,以 Calico 的 VXLAN 模式为例,Pod 流量在 Node 节点间的转发原理大致如下图所示:





书籍推荐

最后推荐一本笔者从 Docker 进阶到 Kubernetes 自学过程中,受益较深的书籍。笔者经常复读,并结合工作实践不断加深理解和体会,可谓常读常新。希望这本书可以帮助到更多对 Kubernetes 感兴趣或刚开始学习的读者。


实施运维知识交流
专注于运维、实施交付领域,持续分享个人笔记、学习心得,欢迎关注,共同交流、成长!
 最新文章