前言

在Kubernetes集群中,Pod是最小的部署单元,而Pod之间的网络通信是K8s网络模型的核心。理解Pod网络原理不仅有助于日常故障排查,还能让我们更好地设计分布式应用。本文将深入浅出地介绍Kubernetes Pod网络的工作原理,重点关注veth pair的作用,并通过流程图展示同一节点和不同节点Pod的通信过程。

一、Kubernetes Pod组网原理与veth pair

Kubernetes网络模型

Kubernetes对网络有三个基本要求:

  1. 每个Pod拥有唯一的IP地址
  2. 所有Pod可以不经过NAT直接通信
  3. 节点上的代理可以与节点内所有Pod通信

这些要求通过CNI(Container Network Interface)插件实现,如Calico、Flannel等。

veth pair:Pod网络的"虚拟网线"

veth pair(虚拟以太网设备对)是Linux网络虚拟化的核心组件,也是Pod网络通信的基础。它由两个虚拟网络设备组成,就像一根网线的两端:

  • 一端放在Pod的网络命名空间内(通常命名为eth0)
  • 另一端留在宿主机的根命名空间

关键特性:

  • 双向通信:数据从一端进入,必然从另一端出来
  • 跨命名空间连接:实现容器与宿主机网络的连通
  • 零拷贝技术:数据在内核中转发,性能较高

当CNI插件创建Pod时,它会:

  1. 创建网络命名空间(Pod的独立网络环境)
  2. 创建veth pair
  3. 将一端移动到Pod命名空间,命名为eth0
  4. 为eth0分配IP地址
  5. 配置路由规则

二、同一节点Pod通信流程

同一节点上的Pod通信通过网桥实现,过程高效且延迟低。

网络组件

  • Pod A:IP 10.244.1.10,veth pair一端为eth0
  • Pod B:IP 10.244.1.11,veth pair一端为eth0
  • 网桥:cni0,IP 10.244.1.1(作为网关)
  • veth pair:vethA(连接Pod A)和vethB(连接Pod B)都连接到cni0

路由信息

每个Pod内的路由表包含:

10.244.1.0/24 dev eth0 proto kernel scope link src 10.244.1.10
default via 10.244.1.1 dev eth0

详细过程

  1. 应用层请求:Pod A中的应用尝试访问10.244.1.11
  2. 路由判断:根据Pod A的路由表,目标IP在同一子网,直接通过eth0发送
  3. ARP解析:如需解析MAC地址,发送ARP请求
  4. 网桥交换:数据帧到达网桥cni0,进行二层交换
  5. 端口转发:网桥根据MAC表将数据转发到vethB
  6. 数据送达:通过veth pair到达Pod B的eth0

整个过程在**数据链路层(二层)**完成,不经过网络层路由,效率极高。

三、不同节点Pod通信流程

跨节点通信需要数据包离开源节点,通过物理网络到达目标节点。主要采用Overlay网络三层路由方案。

网络组件

  • Node 1:IP 192.168.50.10,Pod A(10.244.1.10)
  • Node 2:IP 192.168.50.20,Pod C(10.244.2.10)
  • Overlay隧道:如Flannel VXLAN或Calico IPIP

路由信息

Node 1路由表:

10.244.1.0/24 dev cni0 proto kernel scope link src 10.244.1.1
10.244.2.0/24 via 192.168.50.20 dev eth0  # 指向Node 2

详细过程(以Flannel VXLAN为例)

  1. 源节点发送

    • Pod A发送数据到Pod C(10.244.2.10)
    • 数据通过veth pair到达网桥cni0
    • 根据Node1路由表,目标网络10.244.2.0/24的网关是Node2(192.168.50.20)
  2. 隧道封装

    • Flanneld截获数据包
    • 进行VXLAN封装:添加VXLAN头、UDP头、外层IP头(192.168.50.10→192.168.50.20)
  3. 物理传输

    • 封装后的包通过物理网络发送到Node2
  4. 目标节点处理

    • Node2收到包,内核识别为VXLAN包
    • 拆解外层头部,还原原始Pod-to-Pod数据包
    • 数据包提交到本地cni0网桥
    • 通过veth pair送达Pod C

替代方案:BGP路由(Calico)

在不使用Overlay的情况下,Calico等插件通过BGP协议交换路由信息:

  • 每个节点学习到所有Pod网段的路由
  • 数据包直接通过物理网络路由,无需封装
  • 性能更好,但需要网络设备支持

总结

Kubernetes通过网络命名空间和veth pair实现了Pod网络隔离与连通。同一节点Pod通信通过网桥进行高效二层交换,跨节点通信则通过Overlay隧道或BGP路由实现。理解这些底层机制,有助于我们更好地设计云原生应用和排查网络问题。

无论采用哪种方案,veth pair都是Pod网络连接的基础组件,它像一根无形的网线,连接着Pod与整个K8s集群网络。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐