Kubernetes (K8S) 网络原理

Veth 对网桥网络拓扑

网桥网络拓扑是一种使用 Linux 网桥连接多个网络命名空间的网络结构。在这种拓扑中,所有命名空间都连接到同一个网桥,形成一个共享的二层网络。本页将详细介绍网桥拓扑的原理、实现方法和实际应用场景。

网桥拓扑示意图

Linux 网桥基础

Linux 网桥是一个虚拟的网络设备,它在软件层面模拟了物理网桥的功能。网桥工作在数据链路层(OSI 模型的第二层),主要负责转发数据帧。

网桥的工作原理

网桥的工作原理如下:

  1. 学习:网桥通过观察通过它的数据帧的源 MAC 地址,学习各个 MAC 地址位于哪个端口
  2. 转发:当网桥收到一个数据帧时,它会查找目标 MAC 地址对应的端口,并将数据帧转发到该端口
  3. 广播:如果网桥不知道目标 MAC 地址对应的端口,它会将数据帧广播到除源端口外的所有端口
  4. 过滤:如果源端口和目标端口相同,网桥会丢弃该数据帧,避免不必要的流量

网桥与交换机的区别

网桥和交换机的功能非常相似,都工作在数据链路层,负责转发数据帧。主要区别在于:

Linux 网桥的特点

Linux 网桥具有以下特点:

网桥拓扑原理

网桥拓扑是一种网络结构,其中所有节点都连接到一个中心网桥。在 Linux 网络命名空间的环境中,这意味着每个命名空间通过一对 Veth 设备连接到主机命名空间中的网桥。

网桥拓扑的特点

与其他拓扑的比较

与三角形拓扑和星型拓扑相比,网桥拓扑的配置最简单,但安全隔离较弱。与星型拓扑相比,网桥拓扑不需要在中心节点启用 IP 转发,因为网桥工作在数据链路层,直接转发数据帧。

特性 网桥拓扑 星型拓扑 三角形拓扑
连接数量 n n n(n-1)/2
配置复杂度 中等
扩展性
安全隔离 中等
广播域 共享 分离 分离

网桥拓扑在容器网络中的应用

网桥拓扑在容器网络中有多种应用场景:

Docker 默认网络模式

Docker 的默认网络模式就是使用网桥拓扑。Docker 创建一个名为 docker0 的网桥,所有容器都通过 Veth 对连接到这个网桥,形成一个共享的二层网络。

Kubernetes 的某些 CNI 插件

Kubernetes 的某些 CNI 插件,如 bridge 插件,也使用网桥拓扑来连接 Pod。每个节点上的 Pod 都连接到一个网桥,形成一个本地网络。

虚拟机网络

在虚拟化环境中,网桥拓扑常用于连接虚拟机。例如,libvirt 使用网桥来连接 KVM 虚拟机,使它们可以相互通信,也可以与外部网络通信。

测试环境

在测试环境中,网桥拓扑常用于模拟局域网环境。可以使用网桥连接多个网络命名空间,模拟多个主机在同一个局域网中的情况。

基本实验:创建网桥拓扑

在这个实验中,我们将使用 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

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

高级实验:网桥拓扑与外部网络连接

在基本的网桥拓扑中,命名空间只能相互通信,无法与外部网络通信。在这个高级实验中,我们将配置网桥与外部网络的连接,使命名空间可以访问外部网络。

实验目标

创建如下拓扑:

这个实验的详细步骤将在 网桥拓扑与外部网络连接 页面中介绍。

相关资源