1651 字
8 分钟
云场景下的动态路由
在云计算和容器环境中,路由协议主要解决虚拟网络与物理网络、跨节点/主机通信、服务暴露等问题。 动态路由的使用显著增强了灵活性和自动化程度。
1. OpenStack Neutron 中的动态路由:
场景 1:路由连接外部网络
- 问题: 虚拟机(VM)需要访问外部网络(如 Internet 或物理数据中心网络)。
- 传统方式: 在提供虚拟路由器服务的节点(Network Node)上配置静态路由或默认路由。
- 动态路由场景:
- 原理: Neutron 允许配置支持 OSPF 或 BGP 的虚拟路由器(通过 ML2/OVN 或其他 L3 Plugin 如 DRaaS)。虚拟路由器与物理路由器/ToR (Top of Rack) 交换路由。
- 应用: Neutron 虚拟路由器动态向物理网络通告 VM 所在的 Tenant 网络路由(通常是聚合路由)。物理网络也可以向虚拟路由器通告特定路由(如连接其他区域的内部网络或外部出口)。
- 优势: 自动化网络扩展(新增租户网络自动被通告),无需管理员在物理设备上手动配置静态路由。支持 VRF Lite 或其他多租户隔离场景时尤为方便。
场景 2:分布式虚拟路由器
- 问题: 集中式网络节点可能成为带宽和性能瓶颈。东西向流量(同一个租户的不同 VM 位于不同计算节点)需要先绕行网络节点。
- 原理:OpenStack DVR 将路由功能下放到计算节点。这些节点上的本地路由服务需要一种方式来通告直连在它们上面的 VM 的路由。
- 动态路由场景:
- 在 DVR 中,计算节点的本地路由服务可以运行 OSPF 或 BGP,并与物理网络或 SDN 控制器对等,宣告其上 VM 的 /32 主机路由。
- 当 VM 迁移时,路由更新随之发生,实现无缝迁移。
- 优势: 消除集中式网络节点瓶颈,提高东西向流量性能。
场景 3:高可用虚拟 IP
- 问题:OpenStack Octavia(LBaaS)的后端健康检查切换如何通知网络?
- 动态路由场景:
- 原理: Octavia 的 amphora(负载均衡器实例)或其管理器可以运行 BGP,动态向物理网络或网关宣告/撤销该 VIP 的 /32 路由。例如使用 BGP + ECMP 实现负载均衡和多活。
- 当某个 amphora 宕机,它撤销 VIP 路由,流量由其他健康实例宣告的路由引导。
- 优势: 实现基于路由的快速故障切换(通常在秒级),无需依赖 VRRP 的 MAC 切换(受广播域限制且慢)。
2. Kubernetes 中的动态路由
场景 1:Pod 跨节点通信
- 问题:Pod 分布在多个 Kubernetes 工作节点上,每个节点运行一个 Pod 网络(覆盖网络或主机路由)。需要一种方式使节点知道哪些 Pod IP 在哪些其他节点上。
- 静态方式: 一些 CNI 插件(如 Flannel host-gw)依赖在节点上静态配置路由,指向其他节点的 Pod 网段。节点多时管理困难。
- 动态路由场景(Calico - BGP 模式):
- 原理:Calico-node(每个节点代理)运行一个轻量级 BGP Daemon(Bird/Frrouting)。节点之间(或通过 ToR 交换机作为 Route Reflector)建立 iBGP/eBGP 对等体关系。
- 每个节点通告其本地 Pod 网段(或更精确的路由)给邻居。节点学习到其他节点的 Pod 路由后,直接通过节点 IP 进行三层转发。
- Calico 的 IPPool CIDR 被分片到各个节点通告。
- 优势: 自动化 Pod 网络可达性,集群规模扩展性好,故障恢复快(BGP 收敛)。不需要封装隧道开销(对比 VXLAN)。
- 插件支持: Calico (Native BGP),Cilium (可选 BGP),kube-router。
场景 2:服务暴露(LoadBalancer/Ingress)
- 问题: 希望外部访问 Service 的 VIP (LoadBalancer Service 的 externalIP 或 Ingress)。
- 传统方式: 依赖云厂商的专有 LB 或配置 NodePort(通过工作节点 IP 访问)。
- 动态路由场景:
- MetalLB (Layer 2 / BGP 模式):
- 原理 (BGP 模式):MetalLB 控制器监控 Kubernetes API,发现有
LoadBalancerService 创建时,分配一个 VIP。MetalLB Speaker Pod(运行于节点)使用 BGP 向物理路由器(ToR 或边界)宣告该 VIP 的 /32 路由(Next-Hop 设为宣告节点 IP 或 ECMP 到一组节点)。 - 物理网络会将目标为 VIP 的流量路由到宣告节点。MetalLB 通过 ARP/NDP 或 kube-proxy 规则最终将流量负载均衡到后端 Service Pods。
- BGP 高级特性: 可结合 BGP 的
LOCAL_PREF,MED,Community等属性进行流量控制。
- 原理 (BGP 模式):MetalLB 控制器监控 Kubernetes API,发现有
- 云控制器集成: 云厂商的 CCM 通常使用其云平台的 API 配置外部 LB,但在内部可能广泛使用 BGP 来实现负载均衡器和边界网关之间的路由。
- MetalLB (Layer 2 / BGP 模式):
- 优势: 在 Bare Metal K8s 或边缘环境中实现 LoadBalancer Service 类型功能;在混合云中集成更灵活。
场景 3:多集群互联 / 服务网格
- 问题: 多个 K8s 集群需要互相访问对方的 Pod 或 Service。
- 动态路由场景:
- 原理: 在每个集群边缘部署支持 BGP 的设备(如路由器、专用虚拟机、SDN 网关、或 K8s 节点运行 BGP)。使用 eBGP/iBGP 在集群之间交换路由。
- 例如,Cluster A 通过 BGP 向 Cluster B 宣告其 Pod 或 Service CIDR(可能经过聚合)。
- 使用 BGP Policy 控制哪些路由可通告/接收,并应用 NAT/防火墙策略。
- 优势: 比在每个集群中都配置全量静态路由更灵活、易于扩展和管理。
3. 总结
- IGP (OSPF/IS-IS):
- 场景:OpenStack DVR 节点间路由通告、较小规模 K8s 集群内节点路由(Calico 也支持 OSPF 但不如 BGP 主流)、OpenStack 内部管理网络的路由。
- 侧重: 区域内拓扑驱动、快速收敛。
- EGP (BGP):
- 场景:Kubernetes 中的主力动态路由协议!广泛用于 Calico/Cilium/kube-router 的 Pod 跨节点通信 (iBGP/eBGP),MetalLB 暴露 LB Service, 多集群互联 (eBGP/iBGP),以及 Calico 与物理网络集成 。OpenStack 的 Neutron L3 动态路由 (租户网络出口),Octavia VIP 高可用和负载均衡,OpenStack 多站点互联 (eBGP),DVR 的路由通告 。
- 侧重:大规模扩展性,基于策略的精细化控制 (路由策略是关键优势), 跨自治系统互联 (包括物理到虚拟、虚拟到虚拟、跨云)。