Cilium: 深入解析 Cluster Mesh 的实现原理和跨集群通信机制

在业务规模尚小的时候,一个 Kubernetes 集群往往能撑起所有服务。但随着业务的扩张、多区域部署或故障域隔离的需求出现,多集群架构便成了必然选择。然而,集群一旦多了,新的问题就浮出水面:如何让分散在不同 Kubernetes 集群中的服务像在同一个局域网里一样方便、高效地通信?传统的 Ingress 暴露或者 VPN 方案,要么管理复杂,要么性能堪忧。Cilium Cluster Mesh 的出现,正是为了解决这个棘手的跨集群通信问题。本文将深入探讨 Cilium 如何利用 eBPF 技术,打通多个集群之间的网络脉络。

前置信息

现在的 Cilium Cluster Mesh 还不支持混合模式(v1.17),官方说会在 Cilium 1.19 (~Q1 2026) 支持混合模式。

IssueHow to Configure Native Routing within a Cluster and Encapsulation for Cross-Cluster Communication in a Cilium Cluster Mesh?

hybrid-routing-mode-issue

一、Cilium Cluster Mesh 是什么

image-20250713200431541

Cilium Cluster Mesh 是 Cilium 提供的一种多集群解决方案。它能够将多个独立的,以 Cilium 为 CNI 的 Kubernetes 集群连接成一个“网格”(Mesh),使其在网络层面如同一个统一的大集群。在最优配置下,跨集群 Pod 间的通信性能几乎能与集群内通信相媲美。

这种模式不仅能有效隔离故障域,还为实现灰度发布、蓝绿部署等高级发布策略提供了一个新的方案。

借用一下官方的解释(上面的图也是官方文档中摘的。):

二、Cilium Cluster Mesh 原理

Cilium Cluster Mesh 的架构遵循数据平面和控制平面两个部分。

控制平面

image-20250713200452963

控制平面会提供所有 Pod 的信息。

在开启 Cilium Cluster Mesh 功能的集群,每个集群都会启动一个 clustermesh-apiserver,Cluster 里面会有两个容器,一个是 etcd ,一个是 Proxy,etcd 中存储着集群的特定信息,clustermesh-apiserver 通过 NodePort/LB 类型的 Service 对外提供服务。

当多个 Cluster 组成了 Mesh 的时候,各个集群的节点的 Cilium Agent,都会通过 TLS 连接到其他集群的 clustermesh-apiserver,并以只读的方式“监听”和“复制”相关的元数据。

clustermesh-apiserver 提供的数据包含:

数据平面

image-20250713200507753

Cilium 的数据平面是执行网络转发、安全策略和负载均衡的核心引擎。它由两部分构成:

数据平面的核心职责是:从控制平面(clustermesh-apiserver)同步所有集群的 Pod、服务和策略信息,并在数据包的收发路径上,高效地执行以下关键功能。

数据平面的作用:

结合描述:

三、Cilium Cluster Mesh 路径模式

正如集群内部需要 Overlay 或 Underlay 网络来实现 Pod 间通信一样,Cluster Mesh 也必须在集群之间建立可靠的通信链路。

具体采用哪种组网方案,则取决于现有条件,例如各集群间的网络连通性以及基础设施的限制。基于这些因素,Cluster Mesh 提供了隧道(Tunneling)和原生路由(Native Routing)等多种灵活的连接模式供用户选择。

Cluster Mesh 有一些基础要求:

需要注意的是,所有集群必须配置相同的网络模式,并不只是 Cluster 内部,当需要在整个 Cluster Mesh 范围使用 IPSec 或者 WireGuard 进行封装时,Cluster 内部 Pod 间通信也需要先配置 IPSec 或者 WireGuard 封装。

隧道模式 (Tunnel Mode):

image-20250713200523845

在 Cluster Mesh 采用 Overlay 模式时,报文会经过封装,其外层网络头体现为 Node IP 到 Node IP 的通信。因此,在这种模式下,对网络的基本要求被简化为:只需保证节点(Node)与节点之间能够互相访问即可

通信策略

隧道模式总结

将 VXLAN、IPSec 或 WireGuard 用作 Cluster Mesh 的通信模式,我们将其统称为隧道模式

在隧道模式下,底层网络只会看到发生在节点与节点之间的通信。这样一来,虽然报文封装增加了网络开销,但也极大地降低了对网络的要求——只需保证 Cluster Mesh 内的所有节点间能够互相通信即可。

优缺点:

优点:

缺点:

原生路由(Native Routing)

image-20250713200657907

要使用原生路由模式的 Cluster Mesh,必须满足以下先决条件:

  1. 集群内部模式:所有成员集群的内部网络模式必须是 Native Routing
  2. CIDR 覆盖:所有集群的 Pod IP 地址范围(PodCIDR)都必须被 ipv4NativeRoutingCIDR 这个配置参数所覆盖。
    • 重要说明:任何目标地址不在 ipv4NativeRoutingCIDR 范围内的流量,都会被 Cilium 进行 SNAT(源地址转换),伪装成节点 IP 发出。在大规模流量下,这会因conntrack表的维护和地址转换本身带来显著的性能损耗。
  3. 底层网络能力:底层网络基础设施必须具备直接处理和转发 Pod 到 Pod 流量的能力。

通信原理:

由于 Cilium 将路由责任交给了底层网络,实现 Pod IP 在整个 Mesh 内互通主要有两种方案,具体取决于集群间的网络拓扑。

方案一:集群位于同一 L2 网络

当所有需要互联的集群节点都位于同一个二层(L2)广播域时(例如,同一个VLAN),可以采用较为简单的静态路由方案。

方案二:Cilium 通过 BGP 通告 PodCIDR

当集群分布在不同的网络(例如,不同的数据中心、VPC),彼此之间通过三层(L3)路由器连接时,静态路由不再可行,此时需要动态路由协议。

优缺点:

优点:

缺点:

四:Global Service 跨集群 Pod

关于从 Global Service 到跨集群 Pod 的流量转发机制,上面其实已经说过一遍了,但是这里还是需要特别说明一下。

首先需要了解 Cilium 是如何使用 eBPF 替代 Kube-Proxy 的:Cilium:基于 eBPF 的 Kube-Proxy 替代方案

  1. 标准路径:在 Kubernetes 中,Pod → Service → Pod 的流量转发通常由 Kube-Proxy 在节点内核中完成。
  2. Cilium 的默认行为:在 Cilium 环境下,如果未启用 kubeProxyReplacement 功能,Cilium 默认也会沿用 Kube-Proxy 来处理上述流量。
  3. 问题所在:然而,完全依赖 Kube-Proxy 的方式,会给 Cilium Cluster Mesh 的 Global Service功能带来实现上的困难,不但侵入性大,而且整个处理逻辑也不只是在局限在 CNI 层。
  4. Cilium 的解决方案:为了确保 Global Service 正常工作,只要开启了 Cluster Mesh(集群网格),Cilium 就会进行干预。即使 kubeProxyReplacement 未开启,Cilium 依然会在数据包进入 Pod 的网络接口时(具体在 veth-pairtc ingress hook 处),主动将 Global Service 的 IP 地址直接转换为最终目标 Pod 的 IP 地址。

总结语

总而言之,Cilium Cluster Mesh 通过同步 Service/Endpoint 与利用底层流量隧道技术,巧妙地构建了一个跨越多个 Kubernetes 集群的统一“扁平网络”。这不仅使得身处不同集群的服务能像邻居一样,通过标准 Service 名称直接通信,更将网络策略(Network Policy)的能力扩展至整个 Cluster Mesh,实现了统一的安全隔离与访问控制。最终,使用者可以忽略底层网络的复杂性,获得无缝且安全的跨集群服务体验。