Kubernetes (K8S) 网络原理

Veth 对详解

虚拟以太网对(Virtual Ethernet Pair,简称 Veth 对)是 Linux 内核提供的一种特殊的网络设备,它总是成对出现,可以把它们想象成由一根虚拟网线连接的一对网卡。Veth 对是构建容器网络的基础,也是 Kubernetes 网络实现的关键组件。

Veth 对示意图

Veth 对的基本概念

Veth 对是 Linux 内核中的一种虚拟网络设备,具有以下特点:

Veth 对与物理网络设备的比较

特性 Veth 对 物理网络设备
创建方式 软件创建,成对出现 硬件设备,独立存在
数据传输 内核内存中直接传递 通过物理介质传输
性能 高性能,无物理传输延迟 受物理介质和距离限制
可靠性 不受物理因素影响 可能受物理损坏影响
灵活性 可动态创建和删除 物理安装,不易变更

Veth 对的工作原理

Veth 对的工作原理相对简单,但理解它对于掌握容器网络和 Kubernetes 网络至关重要:

基本数据流

  1. 当数据包从一端(veth0)进入时,它会被直接传送到另一端(veth1)
  2. 在传输过程中,数据包不会被修改(除非有特殊的 iptables 规则或 tc 策略)
  3. 从接收端(veth1)看,数据包就像是从外部网络接收到的一样
  4. 如果接收端(veth1)关闭或不存在,数据包会被丢弃
Veth 对数据流示意图

内核实现

从 Linux 内核实现的角度来看:

# 查看 Veth 设备的内核模块信息 modinfo veth # 查看系统中的 Veth 设备 ip link show type veth

Veth 对的应用场景

Veth 对在网络虚拟化和容器技术中有广泛的应用:

1. 连接网络命名空间

最常见的用途是连接不同的网络命名空间,使它们能够相互通信:

  • 一端放在主机网络命名空间,另一端放在容器网络命名空间
  • 两端分别放在不同的容器网络命名空间

这种方式是容器网络实现的基础,也是 Kubernetes Pod 网络的关键组件。

详细了解 Veth 对与网络命名空间

2. 连接到网桥

Veth 对常与 Linux 网桥(Bridge)结合使用:

  • 一端连接到容器网络命名空间
  • 另一端连接到主机上的网桥

这种方式使多个容器可以通过网桥相互通信,形成一个虚拟局域网。

详细了解 Veth 对与网桥

3. 与 OVS 集成

Veth 对可以与 Open vSwitch (OVS) 集成:

  • 一端连接到容器网络命名空间
  • 另一端连接到 OVS 网桥

这种方式提供了更强大的网络控制和管理能力,支持 SDN(软件定义网络)。

4. 容器网络实现

各种容器运行时和 CNI 插件使用 Veth 对实现容器网络:

  • Docker:默认的 bridge 网络使用 Veth 对连接容器和 docker0 网桥
  • Kubernetes CNI:大多数 CNI 插件(如 Flannel、Calico、Weave)使用 Veth 对连接 Pod 和节点网络
详细了解 Veth 对在 Kubernetes 中的应用

Veth 对的基本操作

下面介绍 Veth 对的基本操作命令,这些命令在理解和调试容器网络时非常有用:

创建 Veth 对

# 创建一对名为 veth0 和 veth1 的 Veth 设备 ip link add veth0 type veth peer name veth1 # 查看创建的 Veth 对 ip link show veth0 ip link show veth1

配置 Veth 对

# 为 Veth 设备配置 IP 地址 ip addr add 192.168.1.1/24 dev veth0 ip addr add 192.168.1.2/24 dev veth1 # 启用 Veth 设备 ip link set veth0 up ip link set veth1 up # 测试连通性 ping -c 3 192.168.1.2 -I veth0

将 Veth 对放入不同的网络命名空间

# 创建网络命名空间 ip netns add ns1 # 创建 Veth 对 ip link add veth0 type veth peer name veth1 # 将 veth1 放入 ns1 命名空间 ip link set veth1 netns ns1 # 配置 veth0(主机端) ip addr add 192.168.1.1/24 dev veth0 ip link set veth0 up # 配置 veth1(ns1 端) ip netns exec ns1 ip addr add 192.168.1.2/24 dev veth1 ip netns exec ns1 ip link set veth1 up ip netns exec ns1 ip link set lo up # 测试连通性 ping -c 3 192.168.1.2 -I veth0 ip netns exec ns1 ping -c 3 192.168.1.1

删除 Veth 对

# 删除 Veth 对(只需删除一端,另一端会自动删除) ip link delete veth0 # 验证删除 ip link show veth0 2>/dev/null || echo "veth0 已删除" ip link show veth1 2>/dev/null || echo "veth1 已删除"

更详细的 Veth 对创建和管理操作,请参考 Veth 对的创建与管理

Veth 对的性能特性

Veth 对作为一种虚拟网络设备,具有一些独特的性能特性:

性能优势

性能限制

性能测试

# 在两个网络命名空间之间使用 iperf3 测试 Veth 对性能 # 创建网络命名空间和 Veth 对 ip netns add ns1 ip netns add ns2 ip link add veth1 type veth peer name veth2 ip link set veth1 netns ns1 ip link set veth2 netns ns2 ip netns exec ns1 ip addr add 192.168.1.1/24 dev veth1 ip netns exec ns2 ip addr add 192.168.1.2/24 dev veth2 ip netns exec ns1 ip link set veth1 up ip netns exec ns1 ip link set lo up ip netns exec ns2 ip link set veth2 up ip netns exec ns2 ip link set lo up # 在 ns2 中启动 iperf3 服务器 ip netns exec ns2 iperf3 -s & # 在 ns1 中运行 iperf3 客户端 ip netns exec ns1 iperf3 -c 192.168.1.2 -t 5 # 清理 kill $(pgrep -f "iperf3 -s") ip netns delete ns1 ip netns delete ns2

Veth 对与其他虚拟网络技术的比较

Veth 对是众多虚拟网络技术中的一种,了解它与其他技术的区别有助于选择合适的网络解决方案:

Veth vs TUN/TAP
Veth vs MACVLAN
Veth vs IPVLAN
Veth vs 隧道技术

Veth 对与 TUN/TAP

TUN(网络隧道)和 TAP(网络分接)设备是另一种常见的虚拟网络设备:

特性 Veth 对 TUN/TAP
工作层次 二层(以太网) TUN:三层(IP)
TAP:二层(以太网)
主要用途 连接网络命名空间 连接用户空间程序和内核网络栈
数据流向 一端到另一端 内核网络栈与用户空间程序之间
典型应用 容器网络、网桥连接 VPN、虚拟机网络

TUN/TAP 设备主要用于将网络数据包从内核传递到用户空间程序(如 OpenVPN、QEMU),而 Veth 对主要用于连接不同的网络命名空间。

Veth 对与 MACVLAN

MACVLAN 允许在单个物理网络接口上创建多个具有不同 MAC 地址的虚拟网络接口:

特性 Veth 对 MACVLAN
工作原理 成对虚拟设备,点对点连接 基于 MAC 地址的虚拟子接口
与物理网络关系 需要额外配置(如网桥、路由)才能连接物理网络 直接连接到物理网络
IP 地址分配 需要手动配置或通过 DHCP 可以从物理网络直接获取 IP(如通过 DHCP)
性能 有额外的处理开销 接近物理网卡性能
隔离性 完全隔离,需要显式配置连接 默认情况下可以直接通信

MACVLAN 适合需要直接连接到物理网络的场景,而 Veth 对更适合需要灵活网络拓扑和隔离控制的场景。

Veth 对与 IPVLAN

IPVLAN 类似于 MACVLAN,但所有虚拟接口共享相同的 MAC 地址:

特性 Veth 对 IPVLAN
MAC 地址 每个接口有独立的 MAC 地址 所有接口共享父接口的 MAC 地址
工作模式 点对点连接 L2(类似交换机)或 L3(类似路由器)模式
资源消耗 每对消耗两个网络设备资源 比 MACVLAN 更节省资源(无需维护多个 MAC 表项)
适用环境 需要灵活网络拓扑的环境 MAC 地址数量受限或需要节省资源的环境

IPVLAN 在 MAC 地址资源受限的环境中有优势,而 Veth 对在需要完全隔离和灵活连接的场景中更适用。

Veth 对与隧道技术

隧道技术(如 VXLAN、GRE、IPsec)用于在现有网络上创建虚拟网络:

特性 Veth 对 隧道技术(VXLAN、GRE等)
工作范围 单机内部 可跨多台物理机器
封装开销 无封装开销 有封装/解封装开销
网络隔离 命名空间级别隔离 可实现跨主机的网络隔离
适用场景 单机容器网络 跨主机容器/虚拟机网络
性能 高性能,低延迟 有一定性能开销

Veth 对适用于单机内部网络连接,而隧道技术适用于跨主机的网络连接。在 Kubernetes 中,通常结合使用 Veth 对(节点内通信)和隧道技术(节点间通信)。

总结

Veth 对是 Linux 网络虚拟化的基础组件,也是容器网络和 Kubernetes 网络的核心技术之一。本文介绍了 Veth 对的基本概念、工作原理、应用场景和基本操作,为深入理解容器网络奠定了基础。

要深入了解 Veth 对的各个方面,请参考以下页面:

进一步学习

如果你想深入了解 Linux 网络虚拟化和容器网络,以下资源可能对你有帮助:

相关资源

继续阅读:Veth 对的创建与管理