3、多集群网络模型:Subnet、Globalnet、SuperCluster 原理与选择策略
在多集群镜像拉取加速场景中,网络模型的选择直接决定了跨集群流量的路径、地址冲突的可能性以及运维复杂度。Calico 在多集群互联中主要提供三种网络模型:Subnet(子网模型)、Globalnet(全局网络模型)和 SuperCluster(超级集群模型)。理解它们的原理与适用边界,是进行后续参数调优的前提。
3.1 三种模型的核心原理
3.1.1 Subnet 模型(子网模型)
Subnet 模型是最基础的多集群互联方式。每个集群保留独立的 Pod CIDR 和 Service CIDR,通过 Calico 的 IPPool 资源严格隔离地址空间。集群之间通过 BGP 或 IPIP/VXLAN 隧道交换路由,但 不进行地址转换。
- 地址域:每个集群独立分配,Pod IP 可能重叠。
- 流量路径:源 Pod → 源集群网关 → 隧道 → 目标集群网关 → 目标 Pod。
- 适用场景:集群间 Pod CIDR 完全无重叠,且网络策略要求保留源 IP。
3.1.2 Globalnet 模型(全局网络模型)
Globalnet 由 Submariner 项目推广,Calico 通过 GlobalNetworkSet 和 Globalnet 控制器实现。它为每个集群分配一个全局唯一的 Globalnet CIDR(通常为 /24 或 /16 段),并在跨集群通信时执行 1:1 SNAT/DNAT,将 Pod 原始 IP 映射为 Globalnet IP。
- 地址域:全局统一分配,消除地址重叠。
- 流量路径:源 Pod → Globalnet SNAT → 隧道 → 目标集群 Globalnet DNAT → 目标 Pod。
- 适用场景:集群间 Pod CIDR 存在重叠,需要全局唯一标识。
3.1.3 SuperCluster 模型(超级集群模型)
SuperCluster 是 Calico 企业版(Calico Cloud / Calico Enterprise)提供的抽象层。它将多个集群逻辑上合并为一个“超级集群”,使用统一的 SuperCluster CIDR(如 10.0.0.0/8),并在每个集群的节点上运行 supercluster-proxy 组件,实现跨集群的 L4 代理转发。
- 地址域:全局统一,但通过代理层解耦,不要求底层 Pod CIDR 一致。
- 流量路径:源 Pod → SuperCluster Service → 代理 → 目标集群 Pod。
- 适用场景:大规模多集群联邦,需要统一服务发现与流量治理。
3.2 三种模型对比表
| 维度 | Subnet | Globalnet | SuperCluster |
|---|---|---|---|
| 地址重叠容忍 | 否 | 是(通过 NAT) | 是(通过代理) |
| 跨集群延迟 | 低(纯路由) | 中(NAT 处理) | 高(代理转发) |
| 运维复杂度 | 低(BGP 自动) | 中(需配置 Globalnet CIDR) | 高(需部署代理组件) |
| 镜像拉取加速适配 | 需保证 CIDR 不重叠 | 适合重叠 CIDR 场景 | 适合大规模联邦拉取 |
| 源 IP 保留 | 是 | 否(被 NAT 替换) | 否(被代理替换) |
| Calico 版本支持 | 开源版 v3.0+ | 开源版 v3.8+(需 Submariner) | 企业版 v3.10+ |
3.3 选择策略:镜像拉取加速场景下的决策树
针对多集群镜像拉取加速这一核心目标,选择网络模型时应遵循以下决策逻辑:
- 检查 Pod CIDR 是否重叠:如果所有集群的 Pod CIDR 完全独立(如
10.1.0.0/16、10.2.0.0/16),优先选择 Subnet 模型,避免 NAT 开销。 - 如果 CIDR 重叠:评估是否需要保留源 IP。若不需要(镜像拉取通常只关心目标 registry),选择 Globalnet 模型,通过 NAT 解决地址冲突。
- 如果集群数量超过 10 个:考虑 SuperCluster 模型,利用代理层统一服务发现,减少路由表规模。
- 性能敏感场景:避免 SuperCluster 的代理路径,优先 Subnet 或 Globalnet。
3.4 网络模型架构图
下图展示了三种模型在跨集群镜像拉取场景下的流量路径对比:
3.5 配置示例:Globalnet 模型下的镜像拉取加速
假设集群 A 和集群 B 的 Pod CIDR 均为 10.244.0.0/16,registry 部署在集群 A 的 registry-svc 上。使用 Globalnet 模型时,需要为 registry 分配一个全局唯一的 Globalnet IP:
# 在集群 A 上创建 Globalnet 分配
apiVersion: submariner.io/v1
kind: Globalnet
metadata:
name: registry-globalnet
spec:
clusterID: cluster-a
globalCIDR: 242.0.0.0/24
podCIDR: 10.244.0.0/16
---
# 在集群 B 上配置拉取目标为 Globalnet IP
apiVersion: v1
kind: ConfigMap
metadata:
name: mirror-registry-config
namespace: kube-system
data:
registry-mirror: "242.0.0.10:5000"
3.6 选择策略总结
下表给出了针对不同集群规模和地址重叠情况的推荐模型:
| 集群数量 | Pod CIDR 重叠 | 推荐模型 | 镜像拉取加速适配说明 |
|---|---|---|---|
| 2-5 | 否 | Subnet | 直接路由,延迟最低,适合 registry 跨集群拉取 |
| 2-5 | 是 | Globalnet | NAT 解决地址冲突,registry 需配置 Globalnet IP |
| 6-10 | 是 | Globalnet | 统一地址空间,减少路由条目 |
| >10 | 是 | SuperCluster | 代理层统一服务发现,适合大规模联邦镜像拉取 |