在 Kubernetes 集群中,如果使用 Calico 的 BGP 模式,并且有三个节点 A、B、C,它们之间如何建立 BGP 对等会话,取决于您在 Calico 中配置的 BGP 网络拓扑模式。
Calico 主要支持两种模式来管理这三个节点间的 BGP 会话:
模式一:Node-to-Node Mesh(节点全互联)
这是 Calico 默认的 BGP 模式,配置最简单。
工作原理:
Calico 会自动在每一个节点和所有其他节点之间建立 BGP 对等会话。
形成一个完全互联的网格(Full Mesh)。
对于 A、B、C 三个节点:
节点 A 与节点 B 建立 BGP 会话。
节点 A 与节点 C 建立 BGP 会话。
节点 B 与节点 A 建立 BGP 会话(同上,双向)。
节点 B 与节点 C 建立 BGP 会话。
节点 C 与节点 A 建立 BGP 会话。
节点 C 与节点 B 建立 BGP 会话。
总共建立 3 × (3-1) / 2 = 3 条独立的 BGP 会话连接(因为 A-B 和 B-A 是同一条会话)。
路由宣告过程:
- 节点 A 宣告:“10.44.1.0/24 (A 上的 Pod 网段) 在我这里,下一跳是 A_IP”。
- 节点 B 宣告:“10.44.2.0/24 在我这里,下一跳是 B_IP”。
- 节点 C 宣告:“10.44.3.0/24 在我这里,下一跳是 C_IP”。
- 每个节点都从其他两个节点学习到相应的路由。
最终路由表(以节点 A 为例):
10.44.1.0/24 → 直连(本地)
10.44.2.0/24 → 下一跳 B_IP
10.44.3.0/24 → 下一跳 C_IP
优点:配置简单,无需额外组件。
缺点:当节点数量增加时,BGP 会话数呈 O(n²) 增长(n 个节点需要 n(n-1)/2 条会话),对 CPU 和内存消耗大。例如,100 个节点需要 4950 条会话。
模式二:Route Reflector(路由反射器)
当集群规模较大时,推荐使用此模式来减少 BGP 会话数量。
工作原理:
从 A、B、C 中选择一个节点作为路由反射器(Route Reflector, RR),例如选择节点 A。
其他节点(B 和 C)只与这个路由反射器(A)建立 BGP 会话。
路由反射器(A)负责接收来自 B 和 C 的路由宣告,并将这些路由反射(Reflect) 给其他客户端。
对于 A、B、C 三个节点(假设 A 为 RR):
节点 B 与节点 A(RR)建立 BGP 会话。
节点 C 与节点 A(RR)建立 BGP 会话。
节点 A(RR)与节点 B 建立会话。
节点 A(RR)与节点 C 建立会话。
节点 B 和 C 之间不直接建立 BGP 会话。
总共只有 2 条 BGP 会话(B-A 和 C-A)。
路由宣告与反射过程:
- 节点 B 宣告:“10.44.2.0/24 在我这里,下一跳是 B_IP” → 发送给 RR (A)。
- 节点 C 宣告:“10.44.3.0/24 在我这里,下一跳是 C_IP” → 发送给 RR (A)。
- 路由反射器 A 收到 B 和 C 的路由。
- A 将 B 的路由反射给 C:“10.44.2.0/24 的下一跳是 B_IP”。
- A 将 C 的路由反射给 B:“10.44.3.0/24 的下一跳是 C_IP”。
- 同时,A 也会宣告自己的路由(如果 A 上也有 Pod 网段)给 B 和 C。
最终路由表:
节点 B:
10.44.2.0/24 → 直连
10.44.1.0/24 → 下一跳 A_IP
10.44.3.0/24 → 下一跳 C_IP
节点 C:
10.44.3.0/24 → 直连
10.44.1.0/24 → 下一跳 A_IP
10.44.2.0/24 → 下一跳 B_IP
节点 A (RR):
10.44.1.0/24 → 直连
10.44.2.0/24 → 下一跳 B_IP
10.44.3.0/24 → 下一跳 C_IP
优点:极大地减少了 BGP 会话数量(O(n)),适合大规模集群。
缺点:配置稍复杂,需要指定路由反射器;RR 成为单点,通常需要部署多个 RR 做高可用。
附加情况:与物理网络集成
除了节点间的 BGP,Calico 还可以配置节点与物理网络中的路由器建立 BGP 会话(eBGP 或 iBGP)。
例如,节点 A、B、C 都与 ToR(Top-of-Rack)交换机建立 BGP 会话。
每个节点向交换机宣告自己的 Pod 网段。
交换机将这些路由传播到整个数据中心,实现非 Kubernetes 设备也能直接访问 Pod IP。
总结
对于三个 Calico 节点 A、B、C 的 BGP 会话方式:
您可以根据集群规模和网络需求,在 Calico 的配置(如 BGPConfiguration 和 BGPPeer 自定义资源)中选择合适的模式。