HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于
  • 网络架构师学习手册

    • 网络架构师学习教程
    • 基础篇

      • 第1章 网络模型与数据流转
      • 第2章 以太网与二层通信
      • 第3章 IP路由与三层转发
      • 第4章 TCP与可靠传输
      • 第5章 应用层协议
    • Linux网络栈

      • 第6章 数据包接收路径
      • 第7章 多核网络优化
      • 第8章 Netfilter与防火墙
      • 第9章 流量控制与QoS
    • 虚拟网络

      • 第10章 Network Namespace基础
      • 第11章 Bridge与互联
      • 第12章 VXLAN与Overlay网络
      • 第13章 OVS与SDN
    • Kubernetes网络

      • 第14章 CNI模型与实现
      • 第15章 kube-proxy与Service实现
      • 第16章 CoreDNS与服务发现
      • 第17章 NetworkPolicy与安全隔离
      • 第18章 Calico网络深度解析
      • 第19章 Cilium与eBPF网络
    • 网络架构

      • 第20章 网络设备与拓扑设计
      • 第21章 网络容量规划与计算
      • 第22章 负载均衡架构设计
      • 第23章 高可用网络架构
      • 第24章 网络安全架构
    • 性能调优

      • 第25章 系统级网络调优
      • 第26章 故障排查方法论
      • 第27章 生产环境案例分析
    • 前沿技术

      • 第28章 eBPF深度实践
      • 第29章 ServiceMesh与边车代理
      • 第30章 网络技术趋势与未来展望
    • 附录

      • 附录A:命令速查手册
      • 附录B:排错决策树
      • 附录C:学习资源
      • 附录D:技能图谱

第13章 OVS与SDN

学习目标

  • 理解Open vSwitch(OVS)的架构和核心功能
  • 掌握OVS流表配置和OpenFlow协议
  • 了解SDN控制器的基本原理
  • 能够使用OVS构建软件定义网络

前置知识

  • 第11章:Linux Bridge与互联
  • 第12章:VXLAN与Overlay
  • 第8章:Netfilter与防火墙

13.1 Open vSwitch概述

13.1.1 什么是OVS

Open vSwitch(OVS)是一个生产级的开源虚拟交换机,专为虚拟化环境设计,支持标准的管理接口和协议。

核心特性:

  • 支持多种隧道协议(VXLAN、GRE、Geneve等)
  • 完整的OpenFlow支持
  • 分布式虚拟交换
  • 网络虚拟化平台
  • 高性能数据平面

13.1.2 OVS架构

┌─────────────────────────────────────────────────────────────┐
│                    OVS Architecture                        │
├─────────────────────────────────────────────────────────────┤
│  Management Interface (ovs-vsctl, ovs-ofctl)              │
├─────────────────────────────────────────────────────────────┤
│  OVSDB Server (ovsdb-server)                              │
├─────────────────────────────────────────────────────────────┤
│  OpenFlow Controller (ovs-ofctl)                          │
├─────────────────────────────────────────────────────────────┤
│  OVS Kernel Module (openvswitch.ko)                       │
├─────────────────────────────────────────────────────────────┤
│  DPDK Data Plane (可选)                                    │
└─────────────────────────────────────────────────────────────┘

13.1.3 OVS组件说明

1. ovs-vsctl:OVS数据库管理工具 2. ovs-ofctl:OpenFlow流表管理工具 3. ovsdb-server:OVS数据库服务器 4. ovs-vswitchd:OVS守护进程 5. openvswitch.ko:内核模块

13.2 OVS安装与配置

13.2.1 安装OVS

Ubuntu/Debian:

# 安装OVS
sudo apt update
sudo apt install openvswitch-switch openvswitch-common

# 启动服务
sudo systemctl start openvswitch-switch
sudo systemctl enable openvswitch-switch

CentOS/RHEL:

# 安装EPEL仓库
sudo yum install epel-release

# 安装OVS
sudo yum install openvswitch

# 启动服务
sudo systemctl start openvswitch
sudo systemctl enable openvswitch

从源码编译:

# 安装依赖
sudo apt install build-essential libssl-dev libcap-ng-dev

# 下载源码
git clone https://github.com/openvswitch/ovs.git
cd ovs

# 编译安装
./boot.sh
./configure --with-linux=/lib/modules/$(uname -r)/build
make
sudo make install

13.2.2 基本配置

# 查看OVS版本
ovs-vsctl --version

# 查看OVS状态
sudo systemctl status openvswitch-switch

# 查看OVS数据库
ovs-vsctl show

13.3 OVS基础操作

13.3.1 网桥管理

# 创建网桥
sudo ovs-vsctl add-br br0

# 查看网桥
ovs-vsctl list-br

# 删除网桥
sudo ovs-vsctl del-br br0

# 查看网桥详细信息
ovs-vsctl show br0

13.3.2 端口管理

# 添加端口到网桥
sudo ovs-vsctl add-port br0 eth0

# 查看端口
ovs-vsctl list-ports br0

# 查看端口详细信息
ovs-vsctl list interface eth0

# 删除端口
sudo ovs-vsctl del-port br0 eth0

13.3.3 VLAN配置

# 创建VLAN端口
sudo ovs-vsctl add-port br0 vlan100 tag=100

# 配置VLAN
sudo ovs-vsctl set port vlan100 tag=100

# 查看VLAN配置
ovs-vsctl list port vlan100

13.4 OpenFlow流表

13.4.1 流表基础

OpenFlow流表是OVS的核心,用于控制数据包的转发行为。

流表结构:

  • Match Fields:匹配条件
  • Priority:优先级
  • Actions:执行动作
  • Counters:统计信息
  • Timeouts:超时设置

13.4.2 流表操作

# 查看流表
sudo ovs-ofctl dump-flows br0

# 添加流表规则
sudo ovs-ofctl add-flow br0 "in_port=1,actions=output:2"

# 删除流表规则
sudo ovs-ofctl del-flows br0 "in_port=1"

# 清空流表
sudo ovs-ofctl del-flows br0

13.4.3 常用流表规则

1. 基本转发

# 从端口1转发到端口2
sudo ovs-ofctl add-flow br0 "in_port=1,actions=output:2"

# 从端口1转发到所有端口
sudo ovs-ofctl add-flow br0 "in_port=1,actions=flood"

2. VLAN处理

# 添加VLAN标签
sudo ovs-ofctl add-flow br0 "in_port=1,actions=mod_vlan_vid:100,output:2"

# 移除VLAN标签
sudo ovs-ofctl add-flow br0 "in_port=1,dl_vlan=100,actions=strip_vlan,output:2"

3. 负载均衡

# 基于源IP的负载均衡
sudo ovs-ofctl add-flow br0 "in_port=1,ip,nw_src=192.168.1.0/24,actions=output:2"
sudo ovs-ofctl add-flow br0 "in_port=1,ip,nw_src=192.168.2.0/24,actions=output:3"

13.5 实验:构建OVS网络

13.5.1 实验环境

网络拓扑:

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   Host-1    │    │   Host-2    │    │   Host-3    │
│ 192.168.1.1 │    │ 192.168.1.2 │    │ 192.168.1.3 │
│    eth0     │    │    eth0     │    │    eth0     │
└──────┬──────┘    └──────┬──────┘    └──────┬──────┘
       │                  │                  │
       └──────────────────┼──────────────────┘
                          │
                   ┌─────────────┐
                   │    OVS      │
                   │    br0      │
                   └─────────────┘

13.5.2 实验步骤

步骤1:创建OVS网桥

# 创建网桥
sudo ovs-vsctl add-br br0

# 添加物理接口
sudo ovs-vsctl add-port br0 eth0

# 配置网桥IP
sudo ip addr add 192.168.1.10/24 dev br0
sudo ip link set br0 up

# 查看配置
ovs-vsctl show

步骤2:配置流表规则

# 查看当前流表
sudo ovs-ofctl dump-flows br0

# 添加基本转发规则
sudo ovs-ofctl add-flow br0 "in_port=1,actions=output:2"
sudo ovs-ofctl add-flow br0 "in_port=2,actions=output:1"

# 查看流表
sudo ovs-ofctl dump-flows br0

步骤3:测试连通性

# 在Host-1上ping Host-2
ping 192.168.1.2

# 抓包观察
sudo tcpdump -i br0 -n

# 查看流表统计
sudo ovs-ofctl dump-flows br0

13.5.3 高级实验:VXLAN over OVS

步骤1:创建VXLAN端口

# 创建VXLAN端口
sudo ovs-vsctl add-port br0 vxlan0 \
    -- set interface vxlan0 type=vxlan \
    options:remote_ip=192.168.1.20 \
    options:key=100

# 查看端口配置
ovs-vsctl list interface vxlan0

步骤2:配置VXLAN流表

# 添加VXLAN流表规则
sudo ovs-ofctl add-flow br0 "in_port=1,actions=output:vxlan0"
sudo ovs-ofctl add-flow br0 "in_port=vxlan0,actions=output:1"

# 查看流表
sudo ovs-ofctl dump-flows br0

13.6 SDN控制器集成

13.6.1 连接SDN控制器

# 连接到OpenDaylight控制器
sudo ovs-vsctl set-controller br0 tcp:192.168.1.100:6633

# 查看控制器连接状态
ovs-vsctl get-controller br0

# 断开控制器
sudo ovs-vsctl del-controller br0

13.6.2 使用Mininet测试

安装Mininet:

# 安装Mininet
sudo apt install mininet

# 创建简单拓扑
sudo mn --topo single,3 --switch ovsk --controller remote

Mininet命令:

# 查看拓扑
mininet> net

# 测试连通性
mininet> pingall

# 查看流表
mininet> dpctl dump-flows

# 退出
mininet> exit

13.7 OVS性能优化

13.7.1 内核模块优化

# 查看OVS内核模块
lsmod | grep openvswitch

# 调整内核参数
echo 'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
sysctl -p

13.7.2 DPDK加速

安装DPDK:

# 安装DPDK依赖
sudo apt install libnuma-dev libpcap-dev

# 下载DPDK
wget https://fast.dpdk.org/rel/dpdk-20.11.1.tar.xz
tar xf dpdk-20.11.1.tar.xz
cd dpdk-20.11.1

# 编译DPDK
make config T=x86_64-native-linux-gcc
make -j$(nproc)

配置OVS with DPDK:

# 编译OVS with DPDK
cd ovs
./boot.sh
./configure --with-dpdk=/path/to/dpdk
make
sudo make install

# 配置DPDK端口
sudo ovs-vsctl add-port br0 dpdk0 \
    -- set interface dpdk0 type=dpdk \
    options:dpdk-devargs=0000:01:00.0

13.8 故障排查

13.8.1 常见问题诊断

问题1:OVS服务启动失败

# 查看服务状态
sudo systemctl status openvswitch-switch

# 查看日志
sudo journalctl -u openvswitch-switch

# 检查内核模块
lsmod | grep openvswitch

问题2:流表不生效

# 检查流表语法
sudo ovs-ofctl add-flow br0 "in_port=1,actions=output:2" --dry-run

# 查看流表统计
sudo ovs-ofctl dump-flows br0

# 检查端口状态
ovs-vsctl list interface

问题3:性能问题

# 查看端口统计
ovs-vsctl list interface eth0

# 查看流表统计
sudo ovs-ofctl dump-flows br0

# 检查CPU使用率
top -p $(pgrep ovs-vswitchd)

13.8.2 调试工具

# 启用详细日志
sudo ovs-vsctl set-manager ptcp:6640

# 使用ovs-appctl调试
sudo ovs-appctl ofproto/trace br0 in_port=1,dl_src=00:11:22:33:44:55

# 查看OVS数据库
ovsdb-client dump

13.9 排错清单

13.9.1 OVS配置检查

  • [ ] OVS服务是否正常运行
  • [ ] 网桥是否创建成功
  • [ ] 端口是否添加到网桥
  • [ ] 流表规则是否正确
  • [ ] 控制器连接是否正常

13.9.2 网络连通性检查

  • [ ] 物理网络是否正常
  • [ ] IP地址配置是否正确
  • [ ] 路由表是否正确
  • [ ] 防火墙是否阻止流量
  • [ ] VLAN配置是否正确

13.9.3 性能问题检查

  • [ ] CPU使用率是否过高
  • [ ] 内存使用是否正常
  • [ ] 网络缓冲区是否足够
  • [ ] DPDK是否配置正确
  • [ ] 流表数量是否过多

13.10 延伸阅读

  • Open vSwitch Documentation
  • OpenFlow Specification
  • Mininet Tutorial
  • OpenDaylight Project

下一章:第14章 CNI模型

返回目录:README

Prev
第12章 VXLAN与Overlay网络