第13章 OVS与SDN
学习目标
- 理解Open vSwitch(OVS)的架构和核心功能
- 掌握OVS流表配置和OpenFlow协议
- 了解SDN控制器的基本原理
- 能够使用OVS构建软件定义网络
前置知识
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 延伸阅读
下一章:第14章 CNI模型
返回目录:README