Kubernetes (K8S) 网络原理

Veth 对高级网络拓扑

在前面的章节中,我们介绍了如何使用 Veth 对连接两个网络命名空间。本页将探讨更复杂的网络拓扑,包括多命名空间连接、星型拓扑、环形拓扑和混合拓扑,这些知识对于理解复杂容器网络环境至关重要。

Veth 对高级网络拓扑示意图

多命名空间网络拓扑

在实际的容器环境中,通常需要连接多个网络命名空间,形成各种复杂的网络拓扑。本节将介绍几种常见的多命名空间网络拓扑及其实现方法。

为什么需要复杂拓扑?

在实际应用中,复杂的网络拓扑可以满足各种需求:

接下来,我们将探讨几种常见的网络拓扑及其实现方法。

三命名空间连接

连接三个网络命名空间是构建复杂拓扑的基础。有几种方法可以实现这一点:

方法 1:直接连接(三角形拓扑)

在这种拓扑中,三个命名空间两两直接连接,形成一个三角形。

三角形拓扑示意图

这种拓扑的特点是:

  • 每个命名空间都可以直接与其他两个命名空间通信
  • 需要为每个命名空间创建两对 Veth 设备
  • 路由配置相对简单
  • 适合小规模网络

实现步骤将在下面的实验中详细介绍。

方法 2:中心辐射型(星型拓扑)

在这种拓扑中,一个中心命名空间连接到其他两个命名空间,形成星型结构。

星型拓扑示意图

这种拓扑的特点是:

  • 中心命名空间可以直接与其他命名空间通信
  • 非中心命名空间之间的通信需要经过中心命名空间
  • 中心命名空间需要启用 IP 转发
  • 适合集中管理的网络

实现步骤将在下面的实验中详细介绍。

方法 3:使用网桥

在这种拓扑中,使用 Linux 网桥连接多个命名空间。

网桥拓扑示意图

这种拓扑的特点是:

  • 所有命名空间都连接到同一个网桥
  • 网桥充当二层交换机,实现命名空间之间的通信
  • 配置简单,易于扩展
  • 适合大规模网络

实现步骤将在下面的实验中详细介绍。

实验:三角形拓扑

在这个实验中,我们将创建三个网络命名空间,并使用 Veth 对将它们两两连接,形成一个三角形拓扑。

实验目标

创建如下拓扑:

实验步骤

# 步骤 1:创建三个网络命名空间 sudo ip netns add ns1 sudo ip netns add ns2 sudo ip netns add ns3 # 验证创建结果 ip netns list
# 步骤 2:创建三对 Veth 设备 # ns1 和 ns2 之间的 Veth 对 sudo ip link add veth1-1 type veth peer name veth1-2 # ns2 和 ns3 之间的 Veth 对 sudo ip link add veth2-2 type veth peer name veth2-3 # ns3 和 ns1 之间的 Veth 对 sudo ip link add veth3-3 type veth peer name veth3-1 # 验证创建结果 ip link show type veth
# 步骤 3:将 Veth 设备分配到相应的网络命名空间 # ns1 的设备 sudo ip link set veth1-1 netns ns1 sudo ip link set veth3-1 netns ns1 # ns2 的设备 sudo ip link set veth1-2 netns ns2 sudo ip link set veth2-2 netns ns2 # ns3 的设备 sudo ip link set veth2-3 netns ns3 sudo ip link set veth3-3 netns ns3 # 验证分配结果 sudo ip netns exec ns1 ip link show sudo ip netns exec ns2 ip link show sudo ip netns exec ns3 ip link show
# 步骤 4:配置 IP 地址 # ns1 的设备 sudo ip netns exec ns1 ip addr add 10.0.1.1/24 dev veth1-1 sudo ip netns exec ns1 ip addr add 10.0.3.1/24 dev veth3-1 sudo ip netns exec ns1 ip link set veth1-1 up sudo ip netns exec ns1 ip link set veth3-1 up sudo ip netns exec ns1 ip link set lo up # ns2 的设备 sudo ip netns exec ns2 ip addr add 10.0.1.2/24 dev veth1-2 sudo ip netns exec ns2 ip addr add 10.0.2.2/24 dev veth2-2 sudo ip netns exec ns2 ip link set veth1-2 up sudo ip netns exec ns2 ip link set veth2-2 up sudo ip netns exec ns2 ip link set lo up # ns3 的设备 sudo ip netns exec ns3 ip addr add 10.0.2.3/24 dev veth2-3 sudo ip netns exec ns3 ip addr add 10.0.3.3/24 dev veth3-3 sudo ip netns exec ns3 ip link set veth2-3 up sudo ip netns exec ns3 ip link set veth3-3 up sudo ip netns exec ns3 ip link set lo up # 验证配置 sudo ip netns exec ns1 ip addr sudo ip netns exec ns2 ip addr sudo ip netns exec ns3 ip addr
# 步骤 5:配置路由 # ns1 的路由 sudo ip netns exec ns1 ip route add 10.0.2.0/24 via 10.0.1.2 # ns2 的路由 sudo ip netns exec ns2 ip route add 10.0.3.0/24 via 10.0.2.3 # ns3 的路由 sudo ip netns exec ns3 ip route add 10.0.1.0/24 via 10.0.3.1 # 验证路由配置 sudo ip netns exec ns1 ip route sudo ip netns exec ns2 ip route sudo ip netns exec ns3 ip route
# 步骤 6:测试连通性 # 从 ns1 测试 sudo ip netns exec ns1 ping -c 3 10.0.1.2 # 直接连接到 ns2 sudo ip netns exec ns1 ping -c 3 10.0.3.3 # 直接连接到 ns3 sudo ip netns exec ns1 ping -c 3 10.0.2.3 # 通过 ns2 连接到 ns3 # 从 ns2 测试 sudo ip netns exec ns2 ping -c 3 10.0.1.1 # 直接连接到 ns1 sudo ip netns exec ns2 ping -c 3 10.0.2.3 # 直接连接到 ns3 sudo ip netns exec ns2 ping -c 3 10.0.3.3 # 通过 ns3 连接到 ns3 # 从 ns3 测试 sudo ip netns exec ns3 ping -c 3 10.0.2.2 # 直接连接到 ns2 sudo ip netns exec ns3 ping -c 3 10.0.3.1 # 直接连接到 ns1 sudo ip netns exec ns3 ping -c 3 10.0.1.1 # 通过 ns1 连接到 ns1
# 步骤 7:清理实验环境 sudo ip netns delete ns1 sudo ip netns delete ns2 sudo ip netns delete ns3 # 验证清理结果 ip netns list

通过这个实验,我们成功创建了一个三角形拓扑,使三个网络命名空间可以相互通信。这种拓扑适用于小规模网络,但随着命名空间数量的增加,配置复杂度会迅速增加。

实验:星型拓扑

在这个实验中,我们将创建一个中心命名空间和三个边缘命名空间,形成星型拓扑。中心命名空间将负责转发边缘命名空间之间的通信。

实验目标

创建如下拓扑:

实验步骤

# 步骤 1:创建四个网络命名空间 sudo ip netns add ns1 # 中心命名空间 sudo ip netns add ns2 # 边缘命名空间 sudo ip netns add ns3 # 边缘命名空间 sudo ip netns add ns4 # 边缘命名空间 # 验证创建结果 ip netns list
# 步骤 2:创建三对 Veth 设备 # ns1 和 ns2 之间的 Veth 对 sudo ip link add veth1-1 type veth peer name veth1-2 # ns1 和 ns3 之间的 Veth 对 sudo ip link add veth2-1 type veth peer name veth2-3 # ns1 和 ns4 之间的 Veth 对 sudo ip link add veth3-1 type veth peer name veth3-4 # 验证创建结果 ip link show type veth
# 步骤 3:将 Veth 设备分配到相应的网络命名空间 # ns1 的设备(中心命名空间) sudo ip link set veth1-1 netns ns1 sudo ip link set veth2-1 netns ns1 sudo ip link set veth3-1 netns ns1 # ns2 的设备 sudo ip link set veth1-2 netns ns2 # ns3 的设备 sudo ip link set veth2-3 netns ns3 # ns4 的设备 sudo ip link set veth3-4 netns ns4 # 验证分配结果 sudo ip netns exec ns1 ip link show sudo ip netns exec ns2 ip link show sudo ip netns exec ns3 ip link show sudo ip netns exec ns4 ip link show
# 步骤 4:配置 IP 地址 # ns1 的设备(中心命名空间) sudo ip netns exec ns1 ip addr add 10.0.1.1/24 dev veth1-1 sudo ip netns exec ns1 ip addr add 10.0.2.1/24 dev veth2-1 sudo ip netns exec ns1 ip addr add 10.0.3.1/24 dev veth3-1 sudo ip netns exec ns1 ip link set veth1-1 up sudo ip netns exec ns1 ip link set veth2-1 up sudo ip netns exec ns1 ip link set veth3-1 up sudo ip netns exec ns1 ip link set lo up # ns2 的设备 sudo ip netns exec ns2 ip addr add 10.0.1.2/24 dev veth1-2 sudo ip netns exec ns2 ip link set veth1-2 up sudo ip netns exec ns2 ip link set lo up # ns3 的设备 sudo ip netns exec ns3 ip addr add 10.0.2.3/24 dev veth2-3 sudo ip netns exec ns3 ip link set veth2-3 up sudo ip netns exec ns3 ip link set lo up # ns4 的设备 sudo ip netns exec ns4 ip addr add 10.0.3.4/24 dev veth3-4 sudo ip netns exec ns4 ip link set veth3-4 up sudo ip netns exec ns4 ip link set lo up # 验证配置 sudo ip netns exec ns1 ip addr sudo ip netns exec ns2 ip addr sudo ip netns exec ns3 ip addr sudo ip netns exec ns4 ip addr
# 步骤 5:在中心命名空间启用 IP 转发 sudo ip netns exec ns1 sysctl -w net.ipv4.ip_forward=1 # 验证 IP 转发是否启用 sudo ip netns exec ns1 sysctl net.ipv4.ip_forward
# 步骤 6:配置路由 # ns2 的路由(通过中心命名空间到达其他边缘命名空间) sudo ip netns exec ns2 ip route add 10.0.2.0/24 via 10.0.1.1 sudo ip netns exec ns2 ip route add 10.0.3.0/24 via 10.0.1.1 # ns3 的路由 sudo ip netns exec ns3 ip route add 10.0.1.0/24 via 10.0.2.1 sudo ip netns exec ns3 ip route add 10.0.3.0/24 via 10.0.2.1 # ns4 的路由 sudo ip netns exec ns4 ip route add 10.0.1.0/24 via 10.0.3.1 sudo ip netns exec ns4 ip route add 10.0.2.0/24 via 10.0.3.1 # 验证路由配置 sudo ip netns exec ns2 ip route sudo ip netns exec ns3 ip route sudo ip netns exec ns4 ip route
# 步骤 7:测试连通性 # 从 ns2 测试 sudo ip netns exec ns2 ping -c 3 10.0.1.1 # 直接连接到中心 ns1 sudo ip netns exec ns2 ping -c 3 10.0.2.3 # 通过中心 ns1 连接到 ns3 sudo ip netns exec ns2 ping -c 3 10.0.3.4 # 通过中心 ns1 连接到 ns4 # 从 ns3 测试 sudo ip netns exec ns3 ping -c 3 10.0.2.1 # 直接连接到中心 ns1 sudo ip netns exec ns3 ping -c 3 10.0.1.2 # 通过中心 ns1 连接到 ns2 sudo ip netns exec ns3 ping -c 3 10.0.3.4 # 通过中心 ns1 连接到 ns4 # 从 ns4 测试 sudo ip netns exec ns4 ping -c 3 10.0.3.1 # 直接连接到中心 ns1 sudo ip netns exec ns4 ping -c 3 10.0.1.2 # 通过中心 ns1 连接到 ns2 sudo ip netns exec ns4 ping -c 3 10.0.2.3 # 通过中心 ns1 连接到 ns3
# 步骤 8:使用 traceroute 查看数据包路径 # 安装 traceroute(如果尚未安装) sudo apt-get update sudo apt-get install -y traceroute # 从 ns2 到 ns3 的路径 sudo ip netns exec ns2 traceroute 10.0.2.3 # 从 ns3 到 ns4 的路径 sudo ip netns exec ns3 traceroute 10.0.3.4 # 从 ns4 到 ns2 的路径 sudo ip netns exec ns4 traceroute 10.0.1.2
# 步骤 9:清理实验环境 sudo ip netns delete ns1 sudo ip netns delete ns2 sudo ip netns delete ns3 sudo ip netns delete ns4 # 验证清理结果 ip netns list

通过这个实验,我们成功创建了一个星型拓扑,中心命名空间 ns1 负责转发边缘命名空间之间的通信。这种拓扑适用于集中管理的网络,但中心节点可能成为性能瓶颈。

实验:网桥拓扑

在这个实验中,我们将使用 Linux 网桥连接多个网络命名空间,形成一个共享的二层网络。

实验目标

创建如下拓扑:

实验步骤

# 步骤 1:创建三个网络命名空间 sudo ip netns add ns1 sudo ip netns add ns2 sudo ip netns add ns3 # 验证创建结果 ip netns list
# 步骤 2:创建网桥 sudo ip link add br0 type bridge sudo ip link set br0 up # 为网桥分配 IP 地址(可选,用作命名空间的网关) sudo ip addr add 192.168.100.1/24 dev br0 # 验证网桥创建 ip link show br0 ip addr show br0
# 步骤 3:创建三对 Veth 设备 # ns1 的 Veth 对 sudo ip link add veth0-br type veth peer name veth0-ns # ns2 的 Veth 对 sudo ip link add veth1-br type veth peer name veth1-ns # ns3 的 Veth 对 sudo ip link add veth2-br type veth peer name veth2-ns # 验证创建结果 ip link show type veth
# 步骤 4:将 Veth 设备分配到相应的网络命名空间 # ns1 的设备 sudo ip link set veth0-ns netns ns1 # ns2 的设备 sudo ip link set veth1-ns netns ns2 # ns3 的设备 sudo ip link set veth2-ns netns ns3 # 验证分配结果 sudo ip netns exec ns1 ip link show sudo ip netns exec ns2 ip link show sudo ip netns exec ns3 ip link show
# 步骤 5:将 Veth 设备连接到网桥 sudo ip link set veth0-br master br0 sudo ip link set veth1-br master br0 sudo ip link set veth2-br master br0 # 启用网桥端的 Veth 设备 sudo ip link set veth0-br up sudo ip link set veth1-br up sudo ip link set veth2-br up # 验证网桥连接 bridge link show
# 步骤 6:配置命名空间中的 Veth 设备 # ns1 的设备 sudo ip netns exec ns1 ip addr add 192.168.100.11/24 dev veth0-ns sudo ip netns exec ns1 ip link set veth0-ns up sudo ip netns exec ns1 ip link set lo up sudo ip netns exec ns1 ip route add default via 192.168.100.1 # ns2 的设备 sudo ip netns exec ns2 ip addr add 192.168.100.12/24 dev veth1-ns sudo ip netns exec ns2 ip link set veth1-ns up sudo ip netns exec ns2 ip link set lo up sudo ip netns exec ns2 ip route add default via 192.168.100.1 # ns3 的设备 sudo ip netns exec ns3 ip addr add 192.168.100.13/24 dev veth2-ns sudo ip netns exec ns3 ip link set veth2-ns up sudo ip netns exec ns3 ip link set lo up sudo ip netns exec ns3 ip route add default via 192.168.100.1 # 验证配置 sudo ip netns exec ns1 ip addr sudo ip netns exec ns2 ip addr sudo ip netns exec ns3 ip addr
# 步骤 7:启用 IP 转发(如果需要与外部网络通信) sudo sysctl -w net.ipv4.ip_forward=1 # 验证 IP 转发是否启用 sysctl net.ipv4.ip_forward
# 步骤 8:测试连通性 # 从 ns1 测试 sudo ip netns exec ns1 ping -c 3 192.168.100.1 # 网桥 sudo ip netns exec ns1 ping -c 3 192.168.100.12 # ns2 sudo ip netns exec ns1 ping -c 3 192.168.100.13 # ns3 # 从 ns2 测试 sudo ip netns exec ns2 ping -c 3 192.168.100.1 # 网桥 sudo ip netns exec ns2 ping -c 3 192.168.100.11 # ns1 sudo ip netns exec ns2 ping -c 3 192.168.100.13 # ns3 # 从 ns3 测试 sudo ip netns exec ns3 ping -c 3 192.168.100.1 # 网桥 sudo ip netns exec ns3 ping -c 3 192.168.100.11 # ns1 sudo ip netns exec ns3 ping -c 3 192.168.100.12 # ns2
# 步骤 9:清理实验环境 sudo ip link delete br0 # 删除网桥会自动删除连接到它的设备 sudo ip netns delete ns1 sudo ip netns delete ns2 sudo ip netns delete ns3 # 验证清理结果 ip netns list bridge link show

通过这个实验,我们成功创建了一个网桥拓扑,使所有命名空间都在同一个二层网络中。这种拓扑适用于模拟局域网环境,配置简单,易于扩展。

环形拓扑

环形拓扑是另一种常见的网络拓扑,每个命名空间都与环中的相邻两个命名空间直接连接,形成一个闭环。

环形拓扑示意图

环形拓扑的特点是:

环形拓扑实现

以四个命名空间为例,实现环形拓扑的基本步骤如下:

  1. 创建四个网络命名空间:ns1、ns2、ns3、ns4
  2. 创建四对 Veth 设备,每对连接环中相邻的两个命名空间
  3. 为每个 Veth 设备配置 IP 地址
  4. 配置路由,使每个命名空间都可以通过最短路径访问其他命名空间

环形拓扑的一个重要优势是提供了冗余路径。如果环中的一个连接出现故障,数据包仍然可以通过另一个方向到达目的地。这种冗余性使环形拓扑在需要高可用性的网络中非常有用。

详细的环形拓扑实验将在后续更新中添加。

混合拓扑

在实际应用中,我们通常会结合多种拓扑类型,创建满足特定需求的混合拓扑。

混合拓扑示意图

混合拓扑可能包括:

混合拓扑的优势:

混合拓扑的设计需要考虑:

详细的混合拓扑实验将在后续更新中添加。

拓扑性能比较

不同的网络拓扑在性能、可靠性、复杂度等方面各有优劣。下面是一个简要的比较:

拓扑类型 优点 缺点 适用场景
三角形拓扑
  • 直接连接,延迟低
  • 路由简单
  • 无单点故障
  • 连接数量呈指数增长
  • 扩展性差
  • 配置复杂
小规模网络,需要低延迟的场景
星型拓扑
  • 配置简单
  • 易于扩展
  • 集中管理
  • 中心节点是单点故障
  • 中心节点可能成为性能瓶颈
  • 非中心节点间通信需要额外跳转
集中管理的网络,客户端-服务器模型
网桥拓扑
  • 配置最简单
  • 扩展性好
  • 所有节点在同一广播域
  • 广播风暴风险
  • 网桥是单点故障
  • 安全隔离较弱
局域网环境,需要简单配置的场景
环形拓扑
  • 提供冗余路径
  • 连接数量适中
  • 无中心节点瓶颈
  • 路由配置复杂
  • 单个链路故障影响整个环
  • 延迟可能较高
需要冗余路径的中等规模网络
混合拓扑
  • 高度灵活
  • 可以针对需求优化
  • 可以结合各种拓扑的优点
  • 配置最复杂
  • 故障排除困难
  • 管理开销大
复杂网络环境,有多种通信需求的场景

在选择网络拓扑时,需要根据具体需求权衡各种因素,包括性能、可靠性、可扩展性、管理复杂度等。

实际应用场景

不同的网络拓扑适用于不同的实际应用场景:

三角形拓扑

适用场景:

星型拓扑

适用场景:

网桥拓扑

适用场景:

环形拓扑

适用场景:

混合拓扑

适用场景:

在 Kubernetes 中,容器网络接口 (CNI) 插件通常使用混合拓扑来实现 Pod 之间的通信。例如,Calico 使用 BGP 路由协议在节点之间建立网格拓扑,而 Flannel 可以使用 VXLAN 或主机网关模式,形成不同类型的拓扑。

相关资源

继续阅读:Veth 对高级路由配置