如何打通跨主机容器网络?

不同物理机上的容器通过网络插件(如Flannel、Calico)实现互联,通常采用Overlay网络技术(如VXLAN)构建虚拟网络层,封装容器原始数据包在物理网络传输,实现跨主机容器间透明通信。

理解不同物理机上容器的网络连接:打通容器世界的“跨主机通信”

如何打通跨主机容器网络?

在容器化技术(如 Docker, Kubernetes)日益普及的今天,一个核心挑战应运而生:如何让部署在不同物理服务器(或虚拟机)上的容器,能够像在同一个主机上一样,高效、安全、可靠地相互通信? 这不仅仅是连通性本身的问题,更涉及到性能、隔离性、可扩展性和管理复杂度,本文将深入探讨实现这种“跨主机容器网络”的主流方案及其原理。

为什么需要跨主机容器网络?

  1. 规模扩展: 单个物理机的资源(CPU、内存)有限,当应用规模扩大时,容器必然需要分布到多台主机上运行。
  2. 高可用: 将同一服务的容器副本部署在不同主机上,可以避免单点故障。
  3. 资源优化: 根据工作负载特性(如计算密集型、内存密集型、I/O密集型),将容器调度到最合适的主机上。
  4. 混合部署: 应用的不同组件(如Web前端、API服务、数据库)可能因策略或资源需求部署在不同主机集群。

核心挑战:跨越物理边界

在同一台主机上,容器可以通过 Linux 内核提供的网络命名空间(Network Namespace)和虚拟网络设备(如 veth pairbridge)实现隔离和通信,操作系统内核负责转发数据包,当容器位于不同主机时,数据包必须离开源主机的网络栈,经过物理网络(通常是数据中心网络或云网络),最终到达目标主机并进入目标容器的网络命名空间,这带来了几个关键问题:

  1. IP 地址分配与冲突: 如何为分布在多台主机上的容器分配唯一的、可路由的 IP 地址,避免冲突?
  2. 路由: 当容器 A(主机1)想访问容器 B(主机2)时,主机1如何知道该把数据包发送到哪个物理主机(主机2)?
  3. 封装与性能: 容器网络通常使用私有 IP 地址段(如 244.0.0/16),这些地址在物理网络中是不可路由的,如何封装容器数据包,使其能在物理网络上传输?封装/解封装操作会带来多少性能开销?
  4. 网络策略: 如何实施跨主机的容器间访问控制(防火墙规则)?
  5. Overlay 管理: 如何维护跨主机容器网络的状态(如路由表、隧道端点)?

主流解决方案:Overlay vs Underlay

解决跨主机容器网络连接主要有两大类思路:Overlay Network(覆盖网络)Underlay Network(底层网络)

Overlay Network(覆盖网络)

这是目前最流行、实现最成熟的方案,尤其在 Kubernetes 生态中被广泛采用(通过 CNI 插件),其核心思想是:在物理网络之上构建一个逻辑的、虚拟的“二层”或“三层”网络。 容器数据包被封装在物理网络可传输的协议(如 VXLAN, IP-in-IP, Geneve)中传输。

如何打通跨主机容器网络?

工作原理:

  1. 分配唯一 IP: 一个中心化的组件(如 Kubernetes 的 kube-controller-manager 配合 CNI IPAM 插件)或分布式协议(如 Flannel 的 etcd)负责为集群中所有主机上的容器分配唯一的、属于一个大子网(如 244.0.0/16)的 IP 地址,每个主机通常被分配一个更小的子网(如 244.1.0/24)。
  2. 封装(Encapsulation):
    • 当容器 A(IP: 244.1.2, 主机1)发送数据包给容器 B(IP: 244.2.3, 主机2)时,数据包首先到达主机1上的容器网络虚拟网桥或路由表。
    • 主机1的路由规则(由 CNI 插件设置)知道目标 IP 244.2.3 属于主机2(IP 假设为 168.100.101)。
    • 关键步骤: 主机1的网络驱动(CNI 插件实现)将原始的容器数据包(源:244.1.2, 目标:244.2.3 作为载荷(Payload)封装在一个新的外层数据包中,外层数据包的源 IP 是主机1 的物理 IP (168.100.100),目标 IP 是主机2 的物理 IP (168.100.101),封装协议决定了外层头部的格式(如 VXLAN 头 + UDP 头 + IP 头)。
  3. 物理网络传输: 这个外层数据包通过主机1的物理网卡发出,经过物理网络(交换机、路由器)路由到主机2,物理网络设备只看到外层 IP 地址 (168.100.100 -> 192.168.100.101),对内部的容器 IP 地址完全透明。
  4. 解封装(Decapsulation): 主机2收到外层数据包后,其网络驱动(CNI 插件)识别出这是一个封装包(根据目标端口或协议类型),剥离外层头部,还原出原始的容器数据包(源:244.1.2, 目标:244.2.3)。
  5. 本地交付: 主机2根据其本地的容器网络路由规则,将解封装后的原始数据包通过虚拟网桥或路由转发到目标容器 B 的网络命名空间中。

主流 Overlay 技术:

  • VXLAN (Virtual Extensible LAN): 最常用的封装协议,使用 UDP 端口(默认 8472)传输,提供大容量的虚拟网络标识(24位 VNI),性能较好,被多数 CNI 插件支持(Flannel VXLAN 模式, Calico VXLAN 模式, Weave, Cilium VXLAN 等)。
  • IP-in-IP (IP Encapsulation within IP): 更简单的封装,直接将容器 IP 包封装在另一个 IP 包中,开销略低于 VXLAN,但功能相对简单(如缺少类似 VNI 的隔离标识),Calico 常用此模式(尤其在非云环境)。
  • Geneve (Generic Network Virtualization Encapsulation): 设计上比 VXLAN 更灵活、可扩展,支持可变的选项(TLVs),是较新的标准,被一些高级 CNI 插件(如 Cilium)支持。
  • Flannel: 较早流行的简单 Overlay 方案,支持多种后端(VXLAN, host-gw, UDP),UDP 模式性能较差,不推荐生产使用。
  • Weave Net: 提供自己的 Overlay 实现,使用自定义协议或 VXLAN,支持加密和简单的 DNS。
  • Calico: 虽然以高性能 Underlay 闻名,但也提供 VXLAN 或 IPIP 模式的 Overlay 选项,通常用于需要 NetworkPolicy 但物理网络不支持 BGP 的场景。
  • Cilium: 基于 eBPF 的高性能网络和安全方案,支持 VXLAN 和 Geneve Overlay,提供强大的网络策略、负载均衡和可观测性。

Overlay 优缺点:

  • 优点:
    • 与底层解耦: 最大优势!几乎可以在任何 IP 网络上运行(公有云、私有云、裸金属),对物理网络配置(VLAN, IP 分配)要求极低。
    • 灵活的网络模型: 可以轻松实现容器间“二层互通”(感觉像在同一个交换机下)或更精细的三层路由。
    • 易于部署和管理 (CNI): Kubernetes 的 CNI 标准使得插件的集成和更换相对容易。
    • 网络策略支持: 许多 Overlay CNI 插件(Calico, Cilium)提供强大的 NetworkPolicy 实现。
  • 缺点:
    • 性能开销: 封装/解封装操作消耗 CPU 资源,增加数据包大小(MTU 问题),增加传输延迟,VXLAN/IPIP 的开销通常在 5-20% 左右(取决于硬件和流量模式),Geneve 可能略高。
    • 可观测性挑战: 物理网络设备看不到容器 IP 的流量,排障需要深入到主机层面和 Overlay 隧道。
    • MTU 问题: 封装增大了数据包,容易导致分片,影响性能,需要仔细调整主机和容器的 MTU。
    • 复杂性: Overlay 网络本身是一个额外的虚拟层,增加了系统复杂性。

Underlay Network(底层网络)

Underlay 方案的目标是:让容器网络直接利用物理网络的能力,容器 IP 地址在物理网络中直接可达(可路由)。 容器数据包无需封装,直接以原始形态在物理网络上传输。

工作原理:

  1. 分配可路由 IP: 容器被分配物理网络(或一个与之直接连通的路由域)中的真实、可路由的 IP 地址,这些地址通常来自物理网络的 DHCP 或 IPAM 系统,或者是一个专门分配给容器使用的子网。
  2. 主机作为路由器: 物理主机被配置为一个路由器(或利用其已有的路由功能)。
  3. 路由通告:
    • 关键步骤: 主机需要向物理网络(通常是其连接的上游路由器)通告它上面运行的容器所使用的 IP 地址段(网段),主机1通告“我有 244.1.0/24”,主机2通告“我有 244.2.0/24”。
    • 通告协议通常使用标准的动态路由协议,最常用的是 BGP (Border Gateway Protocol),主机上运行一个轻量级的 BGP 客户端(如 Bird, FRR)。
  4. 物理网络路由学习: 物理网络中的路由器通过 BGP 学习到这些路由信息:要访问 244.1.0/24,下一跳是主机1的物理 IP;要访问 244.2.0/24,下一跳是主机2的物理 IP,路由器将这些信息加入其路由表。
  5. 直接路由:
    • 当容器 A (244.1.2) 访问容器 B (244.2.3) 时,数据包离开容器 A。
    • 主机1的路由表(可能由 CNI 插件设置)知道目标 244.2.3 不属于本机子网,将其转发到默认网关(或根据更精确的路由)。
    • 默认网关(物理路由器)查表,知道 244.2.0/24 的下一跳是主机2 (168.100.101),于是将数据包(未封装,源 IP 244.1.2, 目标 IP 244.2.3) 发送给主机2。
    • 主机2收到数据包,发现目标 IP 244.2.3 属于其管理的容器子网,通过本地虚拟网络设备(网桥或路由)将数据包转发给容器 B。

主流 Underlay 技术:

  • Calico (BGP 模式): Underlay 方案的标杆,利用 BGP 在主机和物理路由器(或 Route Reflector)之间交换容器路由信息,性能极高(接近物理网络性能),提供强大的 NetworkPolicy。
  • Cilium (BGP 模式): 同样支持通过 eBPF 实现高效的 Underlay 路由,并集成 BGP 通告。
  • Kube-router: 一个专注于提供网络服务的 CNI 插件,核心功能是利用 BGP 实现 Underlay 网络。
  • MetalLB (BGP 模式): 虽然主要解决 LoadBalancer 服务类型问题,但其 BGP 模式本质上是将 Service 的 External IP 通告到物理网络,也属于一种 Underlay 应用。
  • SR-IOV (Single Root I/O Virtualization): 一种硬件辅助方案,通过物理网卡的虚拟功能 (VF) 直接分配给容器,提供接近物理网卡的性能和超低延迟,它更像一种网络接口直通方式,但常与 Underlay 路由结合使用。
  • MACVLAN/IPVLAN: Linux 内核驱动,允许在物理网卡上创建多个虚拟接口(拥有独立 MAC/IP),可直接绑定给容器,需要物理网络支持对应的 MAC/IP 配置(如配置交换机端口为 Trunk/Hybrid 模式并允许对应 VLAN 或所有 VLAN),管理复杂度较高。

Underlay 优缺点:

如何打通跨主机容器网络?

  • 优点:
    • 极致性能: 无封装开销!网络延迟最低,吞吐量最高,CPU 消耗最小,性能接近物理网络本身。
    • 简化可观测性: 容器 IP 直接在物理网络上可见,网络管理员可以使用熟悉的工具(sniffer, NetFlow, 路由器CLI)进行监控和排障。
    • 无 MTU 问题: 数据包无需额外头部,MTU 就是物理网络的 MTU(通常是 1500),避免了分片问题。
    • 利用网络硬件特性: 可以直接利用物理交换机和路由器的 ACL、QoS 等高级功能(如果策略需要)。
  • 缺点:
    • 强依赖底层网络: 最大劣势!要求物理网络支持动态路由协议(BGP 最常见),并且需要网络管理员协作配置(如 BGP Peer、Route Reflector、IP 地址规划),在公有云环境中,底层网络通常不可控,实施 Underlay (BGP) 可能困难或不被支持。
    • IP 地址消耗: 容器消耗的是物理网络(或专门子网)中的真实 IP 地址,地址规划需要更谨慎,可能面临 IPv4 地址耗尽问题。
    • 灵活性受限: 容器网络的拓扑和地址分配受限于物理网络的设计。
    • 部署复杂度: 配置 BGP 和对物理网络的要求增加了初始部署和管理的复杂度。

Host Gateway (主机网关) – 一种特殊的“轻量级”方案

Host Gateway 可以看作一种非常简单的 Underlay 方案,但它不依赖 BGP 等动态路由协议。

工作原理:

  1. 分配唯一 IP: 类似 Overlay,每个主机分配一个容器子网(如 244.1.0/24)。
  2. 静态路由:
    • 关键步骤: 管理员需要手动每一台主机上配置静态路由规则,规则内容是:目标网段是其他主机的容器子网(如 244.2.0/24),下一跳(网关)是该目标主机自身的物理 IP 地址 (168.100.101)。
    • 同样,也需要在物理网络的核心路由器上配置指向各个主机物理 IP 的静态路由,汇总所有容器子网(或配置动态路由汇总)。
  3. 直接路由: 数据包在主机间传输时不封装,主机1根据静态路由,将目标为 244.2.3 的数据包(源 244.1.2)直接发给主机2的物理 IP (168.100.101),主机2收到后,根据本地路由转给容器 B。

优缺点:

  • 优点: 实现简单,无封装开销(性能接近 Underlay/BGP)。
  • 缺点: 扩展性极差!每增加或减少一台主机,都需要手动更新所有其他主机核心路由器上的静态路由,只适用于极小规模、稳定的集群(<= 10 台主机),Flannel 的 host-gw 后端就是这种模式。

如何选择?没有银弹!

选择哪种方案取决于具体的环境、需求和优先级:

  1. 环境限制:
    • 公有云/不可控网络: Overlay (VXLAN/IPIP) 通常是唯一或最实际的选择(如 Flannel VXLAN, Calico IPIP/VXLAN),公有云的底层网络通常不支持租户运行 BGP。
    • 私有云/裸金属/可控网络: 如果网络团队支持配置 BGP,Underlay (Calico BGP, Cilium BGP) 能提供最佳性能和可观测性,如果网络简单且规模很小,Host Gateway 也可考虑(但慎用)。
  2. 性能要求:
    • 对延迟和吞吐量要求极致(如 HPC, 金融交易):优先考虑 Underlay (BGP)SR-IOV
    • 要求Underlay (BGP)Host Gateway (小规模)。
    • 要求中等:成熟的 Overlay (VXLAN/IPIP) 通常能满足大多数应用需求,性能损失在可接受范围,Geneve 灵活性高但开销可能略大。
  3. 网络策略需求: 如果需要 Kubernetes NetworkPolicy 进行精细的 Pod 间访问控制,选择支持该功能的 CNI 插件至关重要。CalicoCilium 在这方面是领导者,无论工作在 Overlay 还是 Underlay 模式。
  4. 运维复杂度:
    • 追求简单、快速部署、云原生友好Overlay CNI 插件(Flannel VXLAN, Calico VXLAN/IPIP, Weave)通常开箱即用。
    • 有能力管理 BGP 和网络设备Underlay (BGP) 在性能和可观测性上的回报值得投入。
  5. 规模:
    • 大规模集群: Underlay (BGP) 或基于 VXLAN/GeneveOverlay 扩展性更好,BGP 本身设计用于大规模网络,Host Gateway 完全不适用。
    • 中小规模: 所有方案都可行,根据其他因素选择。

打通不同物理机上的容器网络是现代容器平台(尤其是 Kubernetes)的基石。Overlay Network 通过封装技术(VXLAN/IPIP

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/20753.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月12日 08:02
下一篇 2025年6月12日 08:08

相关推荐

  • 如何创建物理虚拟机?

    安装虚拟化软件(如VMware ESXi、Hyper-V、KVM),在物理服务器上划分资源(CPU、内存、存储),创建新虚拟机并配置硬件参数,挂载操作系统安装镜像,启动虚拟机完成系统安装即可。

    2025年6月13日
    100
  • 如何快速查询台式机的物理地址?

    要查询台式机的物理地址(MAC地址),在Windows系统中可打开命令提示符,输入“ipconfig /all”,在“以太网适配器”或“无线局域网适配器”中找到“物理地址”,Mac系统需进入“系统设置”→“网络”→“高级”→“硬件”查看,Linux用户可在终端输入“ifconfig”或“ip link”获取。

    2025年5月29日
    400
  • Kali物理机安装选哪个版本最推荐?

    Kali Linux官网提供多种版本:推荐首选64位标准安装镜像,适合大多数现代电脑,老旧硬件考虑32位或轻量级Light镜像,网络安装镜像最小但需联网完成后续安装,选版前务必核对硬件兼容性,特别是无线网卡等驱动支持。

    2025年6月4日
    400
  • 虚拟机添加物理硬盘详细教程

    关闭虚拟机后,在虚拟机软件设置中添加物理硬盘(需选择整块磁盘或特定分区),启动虚拟机后,在操作系统中初始化、分区并格式化新添加的物理硬盘即可使用。

    2025年6月10日
    100
  • 物理机和虚拟机区别是什么

    物理机指实际的计算机硬件设备,虚拟机(VM)是通过软件在物理机上模拟出的多台独立运行的虚拟计算机系统。

    2025年6月14日
    300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN