2、Open vSwitch 初探:OVS架构、核心组件与安装部署

好,咱们正式开始动手之前,得先把OVS的底裤看明白。说白了,你连它长什么样、由哪些零件组成都不知道,后面配置隧道网络肯定会踩坑。我刚开始接触OVS时,也犯过这种错误——上来就敲命令,结果出了问题连日志都不知道去哪看。

2.1 OVS的整体架构

OVS不是一个大而全的二进制文件。它由几个独立进程组成,各司其职。你想想看,一个交换机要管理数据转发、又要处理配置、还要跟控制器通信,全塞在一起肯定乱套。

核心架构分三层:

  • 用户空间:负责控制面,包括配置管理、协议处理
  • 内核空间:负责数据面,做快速转发
  • 管理工具:我们敲的 ovs-vsctlovs-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。我曾经手贱删过这个文件,结果所有配置全丢了……嗯,从那以后我养成了定期备份的习惯。

警告:千万不要手动编辑conf.db文件!一定要通过ovs-vsctl操作,否则数据库结构可能损坏。

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,看到网桥创建成功,心里还挺美。

小提示:包管理安装后,OVS服务会自动启动。如果没启动,手动执行 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装好,后面咱们再聊隧道配置。记住:基础不牢,地动山摇。架构搞明白了,后面遇到问题才知道从哪入手。