Kubernetes (K8S) 网络原理

Veth 对星型网络拓扑高级实验

星型网络拓扑的基础上,本页将介绍更高级的星型拓扑实验,包括负载均衡、高可用性、流量监控等功能。这些高级功能在实际的容器网络环境中非常有用,可以帮助我们构建更健壮、更高效的网络架构。

星型拓扑示意图

实验 1:双中心节点的高可用星型拓扑

在基本的星型拓扑中,中心节点是单点故障。如果中心节点出现故障,整个网络将无法正常工作。在这个实验中,我们将创建一个具有两个中心节点的星型拓扑,以提高可用性。

实验目标

创建如下拓扑:

实验步骤

# 步骤 1:创建五个网络命名空间 sudo ip netns add ns1 # 中心命名空间 1 sudo ip netns add ns2 # 中心命名空间 2 sudo ip netns add ns3 # 边缘命名空间 1 sudo ip netns add ns4 # 边缘命名空间 2 sudo ip netns add ns5 # 边缘命名空间 3 # 验证创建结果 ip netns list
# 步骤 2:创建 Veth 对 # 中心命名空间之间的连接 sudo ip link add veth1-2 type veth peer name veth2-1 # ns1 到边缘命名空间的连接 sudo ip link add veth1-3 type veth peer name veth3-1 sudo ip link add veth1-4 type veth peer name veth4-1 sudo ip link add veth1-5 type veth peer name veth5-1 # ns2 到边缘命名空间的连接 sudo ip link add veth2-3 type veth peer name veth3-2 sudo ip link add veth2-4 type veth peer name veth4-2 sudo ip link add veth2-5 type veth peer name veth5-2 # 验证创建结果 ip link show type veth
# 步骤 3:将 Veth 设备分配到相应的网络命名空间 # ns1 的设备 sudo ip link set veth1-2 netns ns1 sudo ip link set veth1-3 netns ns1 sudo ip link set veth1-4 netns ns1 sudo ip link set veth1-5 netns ns1 # ns2 的设备 sudo ip link set veth2-1 netns ns2 sudo ip link set veth2-3 netns ns2 sudo ip link set veth2-4 netns ns2 sudo ip link set veth2-5 netns ns2 # ns3 的设备 sudo ip link set veth3-1 netns ns3 sudo ip link set veth3-2 netns ns3 # ns4 的设备 sudo ip link set veth4-1 netns ns4 sudo ip link set veth4-2 netns ns4 # ns5 的设备 sudo ip link set veth5-1 netns ns5 sudo ip link set veth5-2 netns ns5 # 验证分配结果 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 sudo ip netns exec ns5 ip link show
# 步骤 4:配置 IP 地址 # ns1 的设备 sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth1-2 # 连接到 ns2 sudo ip netns exec ns1 ip addr add 10.0.1.1/24 dev veth1-3 # 连接到 ns3 sudo ip netns exec ns1 ip addr add 10.0.2.1/24 dev veth1-4 # 连接到 ns4 sudo ip netns exec ns1 ip addr add 10.0.3.1/24 dev veth1-5 # 连接到 ns5 sudo ip netns exec ns1 ip link set veth1-2 up sudo ip netns exec ns1 ip link set veth1-3 up sudo ip netns exec ns1 ip link set veth1-4 up sudo ip netns exec ns1 ip link set veth1-5 up sudo ip netns exec ns1 ip link set lo up # ns2 的设备 sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth2-1 # 连接到 ns1 sudo ip netns exec ns2 ip addr add 10.0.1.2/24 dev veth2-3 # 连接到 ns3 sudo ip netns exec ns2 ip addr add 10.0.2.2/24 dev veth2-4 # 连接到 ns4 sudo ip netns exec ns2 ip addr add 10.0.3.2/24 dev veth2-5 # 连接到 ns5 sudo ip netns exec ns2 ip link set veth2-1 up sudo ip netns exec ns2 ip link set veth2-3 up sudo ip netns exec ns2 ip link set veth2-4 up sudo ip netns exec ns2 ip link set veth2-5 up sudo ip netns exec ns2 ip link set lo up # ns3 的设备 sudo ip netns exec ns3 ip addr add 10.0.1.3/24 dev veth3-1 # 连接到 ns1 sudo ip netns exec ns3 ip addr add 10.0.1.13/24 dev veth3-2 # 连接到 ns2 sudo ip netns exec ns3 ip link set veth3-1 up sudo ip netns exec ns3 ip link set veth3-2 up sudo ip netns exec ns3 ip link set lo up # ns4 的设备 sudo ip netns exec ns4 ip addr add 10.0.2.4/24 dev veth4-1 # 连接到 ns1 sudo ip netns exec ns4 ip addr add 10.0.2.14/24 dev veth4-2 # 连接到 ns2 sudo ip netns exec ns4 ip link set veth4-1 up sudo ip netns exec ns4 ip link set veth4-2 up sudo ip netns exec ns4 ip link set lo up # ns5 的设备 sudo ip netns exec ns5 ip addr add 10.0.3.5/24 dev veth5-1 # 连接到 ns1 sudo ip netns exec ns5 ip addr add 10.0.3.15/24 dev veth5-2 # 连接到 ns2 sudo ip netns exec ns5 ip link set veth5-1 up sudo ip netns exec ns5 ip link set veth5-2 up sudo ip netns exec ns5 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 sudo ip netns exec ns5 ip addr
# 步骤 5:在中心命名空间启用 IP 转发 sudo ip netns exec ns1 sysctl -w net.ipv4.ip_forward=1 sudo ip netns exec ns2 sysctl -w net.ipv4.ip_forward=1 # 验证 IP 转发是否启用 sudo ip netns exec ns1 sysctl net.ipv4.ip_forward sudo ip netns exec ns2 sysctl net.ipv4.ip_forward
# 步骤 6:配置路由 # ns1 的路由 sudo ip netns exec ns1 ip route add 10.0.1.13/32 via 10.0.0.2 # 通过 ns2 到达 ns3 的第二个接口 sudo ip netns exec ns1 ip route add 10.0.2.14/32 via 10.0.0.2 # 通过 ns2 到达 ns4 的第二个接口 sudo ip netns exec ns1 ip route add 10.0.3.15/32 via 10.0.0.2 # 通过 ns2 到达 ns5 的第二个接口 # ns2 的路由 sudo ip netns exec ns2 ip route add 10.0.1.3/32 via 10.0.0.1 # 通过 ns1 到达 ns3 的第一个接口 sudo ip netns exec ns2 ip route add 10.0.2.4/32 via 10.0.0.1 # 通过 ns1 到达 ns4 的第一个接口 sudo ip netns exec ns2 ip route add 10.0.3.5/32 via 10.0.0.1 # 通过 ns1 到达 ns5 的第一个接口 # ns3 的路由(主路由通过 ns1,备份路由通过 ns2) sudo ip netns exec ns3 ip route add 10.0.2.0/24 via 10.0.1.1 metric 100 # 主路由 sudo ip netns exec ns3 ip route add 10.0.2.0/24 via 10.0.1.2 metric 200 # 备份路由 sudo ip netns exec ns3 ip route add 10.0.3.0/24 via 10.0.1.1 metric 100 # 主路由 sudo ip netns exec ns3 ip route add 10.0.3.0/24 via 10.0.1.2 metric 200 # 备份路由 # ns4 的路由 sudo ip netns exec ns4 ip route add 10.0.1.0/24 via 10.0.2.1 metric 100 # 主路由 sudo ip netns exec ns4 ip route add 10.0.1.0/24 via 10.0.2.2 metric 200 # 备份路由 sudo ip netns exec ns4 ip route add 10.0.3.0/24 via 10.0.2.1 metric 100 # 主路由 sudo ip netns exec ns4 ip route add 10.0.3.0/24 via 10.0.2.2 metric 200 # 备份路由 # ns5 的路由 sudo ip netns exec ns5 ip route add 10.0.1.0/24 via 10.0.3.1 metric 100 # 主路由 sudo ip netns exec ns5 ip route add 10.0.1.0/24 via 10.0.3.2 metric 200 # 备份路由 sudo ip netns exec ns5 ip route add 10.0.2.0/24 via 10.0.3.1 metric 100 # 主路由 sudo ip netns exec ns5 ip route add 10.0.2.0/24 via 10.0.3.2 metric 200 # 备份路由 # 验证路由配置 sudo ip netns exec ns3 ip route sudo ip netns exec ns4 ip route sudo ip netns exec ns5 ip route
# 步骤 7:测试连通性 # 从 ns3 测试 sudo ip netns exec ns3 ping -c 3 10.0.1.1 # 连接到 ns1 sudo ip netns exec ns3 ping -c 3 10.0.1.2 # 连接到 ns2 sudo ip netns exec ns3 ping -c 3 10.0.2.4 # 通过 ns1 连接到 ns4 sudo ip netns exec ns3 ping -c 3 10.0.3.5 # 通过 ns1 连接到 ns5 # 从 ns4 测试 sudo ip netns exec ns4 ping -c 3 10.0.2.1 # 连接到 ns1 sudo ip netns exec ns4 ping -c 3 10.0.2.2 # 连接到 ns2 sudo ip netns exec ns4 ping -c 3 10.0.1.3 # 通过 ns1 连接到 ns3 sudo ip netns exec ns4 ping -c 3 10.0.3.5 # 通过 ns1 连接到 ns5 # 从 ns5 测试 sudo ip netns exec ns5 ping -c 3 10.0.3.1 # 连接到 ns1 sudo ip netns exec ns5 ping -c 3 10.0.3.2 # 连接到 ns2 sudo ip netns exec ns5 ping -c 3 10.0.1.3 # 通过 ns1 连接到 ns3 sudo ip netns exec ns5 ping -c 3 10.0.2.4 # 通过 ns1 连接到 ns4
# 步骤 8:模拟中心节点 ns1 故障 # 关闭 ns1 的所有接口 sudo ip netns exec ns1 ip link set veth1-2 down sudo ip netns exec ns1 ip link set veth1-3 down sudo ip netns exec ns1 ip link set veth1-4 down sudo ip netns exec ns1 ip link set veth1-5 down # 测试故障转移 sudo ip netns exec ns3 ping -c 3 10.0.2.4 # 现在应该通过 ns2 连接到 ns4 sudo ip netns exec ns3 ping -c 3 10.0.3.5 # 现在应该通过 ns2 连接到 ns5 sudo ip netns exec ns4 ping -c 3 10.0.1.3 # 现在应该通过 ns2 连接到 ns3 sudo ip netns exec ns4 ping -c 3 10.0.3.5 # 现在应该通过 ns2 连接到 ns5 sudo ip netns exec ns5 ping -c 3 10.0.1.3 # 现在应该通过 ns2 连接到 ns3 sudo ip netns exec ns5 ping -c 3 10.0.2.4 # 现在应该通过 ns2 连接到 ns4 # 查看路由变化 sudo ip netns exec ns3 ip route sudo ip netns exec ns4 ip route sudo ip netns exec ns5 ip route
# 步骤 9:恢复 ns1 sudo ip netns exec ns1 ip link set veth1-2 up sudo ip netns exec ns1 ip link set veth1-3 up sudo ip netns exec ns1 ip link set veth1-4 up sudo ip netns exec ns1 ip link set veth1-5 up # 测试路由是否恢复 sudo ip netns exec ns3 ping -c 3 10.0.2.4 # 应该再次通过 ns1 连接到 ns4 sudo ip netns exec ns3 ping -c 3 10.0.3.5 # 应该再次通过 ns1 连接到 ns5 # 查看路由变化 sudo ip netns exec ns3 ip route
# 步骤 10:清理实验环境 sudo ip netns delete ns1 sudo ip netns delete ns2 sudo ip netns delete ns3 sudo ip netns delete ns4 sudo ip netns delete ns5 # 验证清理结果 ip netns list

通过这个实验,我们创建了一个具有两个中心节点的高可用星型拓扑。当主中心节点出现故障时,边缘节点可以自动切换到备份中心节点,保证网络的连通性。

实验 2:使用 ECMP 实现负载均衡

在这个实验中,我们将使用等价多路径 (ECMP) 路由来实现星型拓扑中的负载均衡。ECMP 允许流量通过多个等价路径传输,从而分散负载并提高网络吞吐量。

实验目标

创建如下拓扑:

这个实验的详细步骤将在 星型拓扑负载均衡 页面中介绍。

实验 3:使用 iptables 实现流量监控

在这个实验中,我们将在星型拓扑的中心节点上使用 iptables 实现流量监控。这对于了解网络流量模式、排查网络问题和实现网络安全策略非常有用。

实验目标

创建如下拓扑:

这个实验的详细步骤将在 星型拓扑流量监控 页面中介绍。

实验 4:使用 tc 实现流量控制

在这个实验中,我们将在星型拓扑中使用流量控制 (tc) 工具实现带宽限制、延迟模拟和丢包模拟。这对于测试应用在不同网络条件下的性能非常有用。

实验目标

创建如下拓扑:

这个实验的详细步骤将在 星型拓扑流量控制 页面中介绍。

相关资源