Kubernetes 网络模式深入解析?

文章目录

Kubernetes 的网络模型有一个核心原则:所有 Pod 都可以不通过 NAT(网络地址转换)而直接互相通信。

为了实现这个"大平层"网络,CNI(容器网络接口)插件主要通过三种模式来实现。你提到的 Underlay 确实存在,它是与 Overlay 相对的概念。

以下是 Kubernetes 网络模式的通俗解构:


1. Overlay 模式(隧道模式)

形象比喻: 像是在现有的公路上(物理网)加盖了一层"封闭式高架桥"(逻辑网)。

  • 技术原理: 封包传输。Pod 发出的原始包会被包装在一个"宿主机包"里。当包到达目的地节点时,再拆掉外壳,取出原始包。常见的协议有 VxLANIPIP
  • Underlay 关系: 它对底层物理网络(Underlay)没有任何要求,只要节点之间 IP 能通,高架桥就能盖起来。
  • 优点: 兼容性极强,不受底层网络网段、交换机配置限制。
  • 缺点: 封包拆包消耗 CPU;包头变大导致有效载荷减少(MTU 问题);性能损耗约 5%~15%。
  • 主流插件: Flannel (VxLAN), Calico (IPIP/VxLAN)。

2. Routing 模式(路由模式)

形象比喻: 节点就是"邮局"。每个节点告诉邻居:"我这里负责 10.244.1.0 段的邮递,有这类信件请传给我。"

  • 技术原理: 纯路由转发。Pod 的原始包直接在物理网络上传输,不封包。通过在主机上配置静态路由或使用 BGP 协议 动态告诉交换机/其他节点如何到达 Pod IP。
  • Underlay 关系: 它是 Overlay 与 Underlay 之间的桥梁。它利用了 Underlay 的转发能力,但 Pod IP 通常还是独立的私有段。
  • 优点: 性能极高,几乎等同于物理网速。
  • 缺点:
    • Host-Gateway (静态): 要求所有节点必须在同一个二层网段(VLAN)。
    • BGP (动态): 需要底层物理交换机支持 BGP 协议并配合配置。
  • 主流插件: Calico (BGP), Flannel (Host-gw)。

3. Underlay 模式(物理直连模式)

形象比喻: Pod 不再是躲在宿主机后面的"小弟",它直接向物理网络申领"身份证"(IP),和宿主机在地位上是平等的。

  • 技术原理: 直接将 Pod 接入物理网。Pod 的 IP 地址就是物理网络段的一部分(比如和宿主机在同一个网段)。常见的技术有 MACVLANIPvlan 或直接对接云厂商的 VPC
  • 与 Underlay 的关系: 它是真正意义上的 Underlay 方案。Pod 完全依赖物理网络的交换机进行流量调度。
  • 优点: 性能最好,时延最低;外部网络可以直接访问 Pod IP(无需经过 NodePort)。
  • 缺点:
    • 极度消耗物理网络的 IP 资源。
    • 对物理网络环境高度依赖。
    • 网络策略(Security Policy)难以在 K8s 层面控制,通常要在交换机上做。
  • 主流插件: Multus, Macvlan, 云厂商专有 CNI (如阿里云 Terway, AWS VPC CNI)。

总结对比表:网络模式选型

特性 Overlay (隧道) Routing (路由/BGP) Underlay (直连)
性能 一般(有额外开销) 优异(接近线速) 极高(等同物理机)
底层网络要求 无要求,只要 IP 通 需二层互通或交换机支持 BGP 物理网 IP 充足,需交换机配合
跨网段支持 支持 取决于是否开启 BGP 取决于物理网络架构
配置复杂度 简单(一键安装) 中等(需配 BGP 或静态路由) 复杂(需网络组深度参与)
适用场景 跨云、跨网段、追求稳定兼容 大规模、高并发微服务 金融、低延迟通信、老旧系统接入

整合进清单的建议:

在你的"网络服务"清单中,关于 CNI 插件选型,你可以这样描述:

CNI 模式选型建议:

  1. 若追求部署简单、无视物理环境:Overlay (VxLAN/IPIP)
  2. 若追求高性能且节点在同一网段:Routing (Host-gw)
  3. 若具备 BGP 交换机权限且追求极致性能:Routing (BGP)
  4. 若 Pod 需直接暴露在物理网且有极低延迟需求:Underlay (MACVLAN/云专有CNI)

架构师提示: 调研时,重点问客户:"你们的交换机支持 BGP 协议吗?" 或者 "你们允许 Pod 直接占用物理内网 IP 吗?"。这两个问题的答案直接决定了你只能选 Overlay 还是可以尝试 Underlay/Routing。

相关推荐
lichenyang4534 小时前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4534 小时前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4534 小时前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事3 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson5 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生5 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美6 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵7 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程