2、Open vSwitch 初探:OVS架构、核心组件与安装部署
好,咱们正式开始动手之前,得先把OVS的底裤看明白。说白了,你连它长什么样、由哪些零件组成都不知道,后面配置隧道网络肯定会踩坑。我刚开始接触OVS时,也犯过这种错误——上来就敲命令,结果出了问题连日志都不知道去哪看。
2.1 OVS的整体架构
OVS不是一个大而全的二进制文件。它由几个独立进程组成,各司其职。你想想看,一个交换机要管理数据转发、又要处理配置、还要跟控制器通信,全塞在一起肯定乱套。
核心架构分三层:
- 用户空间:负责控制面,包括配置管理、协议处理
- 内核空间:负责数据面,做快速转发
- 管理工具:我们敲的
ovs-vsctl、ovs-ofctl这些命令行
嗯,这里要注意:数据包真正经过的路径,大部分时间都在内核模块里完成,用户空间只处理控制信令。这样设计,性能才有保障。
2.2 核心组件详解
2.2.1 ovs-vswitchd
这是OVS的主守护进程。它运行在用户空间,负责:
- 加载OpenFlow流表
- 处理LLDP、STP等协议
- 与控制器建立连接(比如OVN、OpenDaylight)
- 把流表下发到内核模块
我个人习惯,排查问题时第一件事就是看 ovs-vswitchd 的日志。它默认输出到 /var/log/openvswitch/ovs-vswitchd.log。有一次我配置GRE隧道死活不通,最后发现是ovs-vswitchd进程挂了,重启就好了——这种低级错误,说出来都丢人。
2.2.2 ovsdb-server
这个进程管理OVS的配置数据库。OVS把所有的配置信息(网桥、端口、隧道、QoS等)都存到一个JSON格式的数据库中。你敲的 ovs-vsctl add-br br0,其实就是往这个数据库里写了一条记录。
数据库文件默认在 /etc/openvswitch/conf.db。我曾经手贱删过这个文件,结果所有配置全丢了……嗯,从那以后我养成了定期备份的习惯。
2.2.3 内核模块(datapath)
这是OVS性能的关键。数据包从网卡进来后,先经过内核模块的快速路径。如果匹配到流表,直接转发;如果没匹配到,才上送到用户空间的ovs-vswitchd处理。
说白了,这就是一个「能快则快,不能快再慢」的设计哲学。我在生产环境见过,某些场景下内核模块能处理90%以上的流量,用户空间只处理异常情况。
2.2.4 管理工具
| 命令 | 用途 | 我常用的场景 |
|---|---|---|
| ovs-vsctl | 管理网桥、端口、隧道 | 创建/删除网桥,配置GRE隧道 |
| ovs-ofctl | 管理OpenFlow流表 | 查看流表、手动添加转发规则 |
| ovs-appctl | 与ovs-vswitchd交互 | 查看连接状态、调试信息 |
| ovs-dpctl | 管理内核datapath | 查看内核流表缓存 |
2.3 安装部署
安装OVS有两种主流方式:源码编译和包管理。我个人建议:学习阶段用包管理,生产环境用源码。为什么?包管理省事,但版本可能滞后;源码编译可以定制优化选项。
2.3.1 包管理安装(以Ubuntu为例)
# 更新包索引
sudo apt update
# 安装OVS
sudo apt install openvswitch-switch openvswitch-common
# 检查服务状态
sudo systemctl status ovs-vswitchd
sudo systemctl status ovsdb-server
# 查看版本
ovs-vsctl --version
装完以后,你就能用 ovs-vsctl 了。我记得第一次装完,迫不及待敲了个 ovs-vsctl add-br test,看到网桥创建成功,心里还挺美。
sudo systemctl start ovs-vswitchd。
2.3.2 源码编译安装
源码安装适合需要定制化或使用最新特性的场景。步骤如下:
# 1. 安装依赖
sudo apt install build-essential autoconf automake libtool \
libssl-dev libcap-ng-dev python3 python3-pip
# 2. 下载源码(以2.17版本为例)
wget https://www.openvswitch.org/releases/openvswitch-2.17.0.tar.gz
tar -xzf openvswitch-2.17.0.tar.gz
cd openvswitch-2.17.0
# 3. 配置、编译、安装
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc
make -j$(nproc)
sudo make install
# 4. 初始化数据库
sudo ovsdb-tool create /etc/openvswitch/conf.db \
/usr/share/openvswitch/vswitch.ovsschema
# 5. 启动服务
sudo ovsdb-server --remote=punix:/var/run/openvswitch/db.sock \
--pidfile --detach
sudo ovs-vswitchd --pidfile --detach
这里有个坑:编译时如果报错缺少某个库,别慌,看错误信息装对应的 -dev 包就行。我曾经在CentOS上编译,缺了 libunbound,折腾了半小时才搞定。
2.4 验证安装
装完以后,跑几个命令验证一下:
# 查看OVS版本
ovs-vsctl --version
# 创建一个测试网桥
ovs-vsctl add-br br-test
# 查看网桥列表
ovs-vsctl list-br
# 删除测试网桥
ovs-vsctl del-br br-test
如果这些命令都能正常执行,恭喜你,OVS已经跑起来了。接下来我们就可以开始配置GRE和Geneve隧道了。
嗯,这一章的内容就到这里。你先把OVS装好,后面咱们再聊隧道配置。记住:基础不牢,地动山摇。架构搞明白了,后面遇到问题才知道从哪入手。