3、Open vSwitch简介:OVS的架构、OVS核心组件、OVS与Linux Bridge的对比

好,咱们进入第三讲。前面两章我们把VXLAN的原理和报文结构聊透了,现在该聊聊实现VXLAN的核心工具——Open vSwitch了。

说实话,我第一次接触OVS是在一个数据中心项目里。当时客户要求做多租户隔离,传统的Linux Bridge根本搞不定,我折腾了两天,最后发现OVS才是正解。嗯,从那以后,我对OVS就特别上心。

3.1 OVS的整体架构

OVS的架构,说白了就是「控制面」和「数据面」分离的设计。你想想看,传统的交换机把控制和转发绑在一起,升级个功能得换硬件。OVS不一样,它把控制逻辑抽出来,转发面只管快速丢包。

我习惯把OVS的架构分成三层:

  • 管理层:包括ovs-vsctl、ovs-ofctl这些命令行工具,还有OpenFlow控制器。这一层负责下发策略、配置网桥。
  • 核心层:ovs-vswitchd守护进程,负责处理OpenFlow流表、学习MAC地址、处理VXLAN隧道封装。这是OVS的大脑。
  • 数据层:内核模块openvswitch.ko,负责快速转发。说白了,大部分数据包都在内核里处理,只有匹配不到流表的包才会上送到ovs-vswitchd。

这里有个关键点:OVS的数据面有两个模式——内核态和用户态(DPDK)。内核态适合通用场景,性能够用;用户态DPDK模式适合高性能场景,能跑到线速。我在项目中遇到过,如果对延迟要求极高,比如金融交易系统,必须上DPDK模式。

核心要点:OVS的架构设计让网络功能可以灵活扩展,同时保持转发性能。控制面与数据面分离,这是SDN思想的精髓。

3.2 OVS核心组件详解

3.2.1 ovs-vswitchd

这是OVS最核心的守护进程。它负责:

  • 管理OpenFlow流表
  • 处理VXLAN、GRE等隧道封装
  • 学习MAC地址(类似传统交换机的MAC学习)
  • 与OpenFlow控制器通信(比如OVN、OpenDaylight)

我举个例子,当你创建一个VXLAN隧道时,ovs-vswitchd会在内核里安装一条流表规则,告诉内核:「看到这个VNI的包,就给我封装成VXLAN发出去」。这个过程对用户是透明的。

我曾经踩过一个坑:ovs-vswitchd如果挂了,所有网络流量都会中断。因为内核里的流表虽然还在,但新的连接建立不了。所以生产环境一定要做高可用,比如用OVS的主动备份模式。

避坑指南:我曾经在生产环境遇到过ovs-vswitchd内存泄漏的问题。建议定期监控ovs-vswitchd的内存占用,超过1GB就要警惕了。可以用ps aux | grep ovs-vswitchd查看。

3.2.2 ovsdb-server

ovsdb-server是OVS的数据库服务。它存储了所有配置信息,包括:

  • 网桥配置(br-int、br-ex等)
  • 端口配置(VXLAN端口、VLAN端口)
  • QoS策略
  • 流表备份

你想想看,OVS的配置是持久化的。重启机器后,ovsdb-server会从磁盘加载配置,然后ovs-vswitchd根据配置重建网桥和流表。这个设计很聪明,避免了每次重启都要重新配置。

我个人习惯用ovs-vsctl show命令查看当前配置,这个命令就是从ovsdb-server里读取数据的。如果ovsdb-server挂了,ovs-vsctl命令会报错,但已经运行的网络不会受影响——因为ovs-vswitchd还在跑。

小技巧:备份OVS配置很简单,直接备份/etc/openvswitch/conf.db这个文件就行。恢复时用ovsdb-tool create命令重建数据库。

3.3 OVS与Linux Bridge的对比

很多新手会问:「Linux Bridge也能做二层交换,为什么还要用OVS?」这个问题问得好。我直接给你列个对比表:

特性 Linux Bridge Open vSwitch
二层交换 支持 支持
VLAN支持 支持(802.1Q) 支持(802.1Q + QinQ)
VXLAN隧道 需要额外配置 原生支持,性能更好
OpenFlow协议 不支持 原生支持
流表控制 基于MAC学习 基于流表,灵活可编程
QoS 简单限速 精细的流量控制
多租户隔离 需要手动配置 通过VNI自动隔离
性能 内核态,性能尚可 内核态+DPDK,性能更强

说白了,Linux Bridge适合简单的场景,比如给KVM虚拟机提供网络。但如果你要做VXLAN Overlay、多租户隔离、SDN控制器对接,OVS是唯一的选择。

我记得有一次帮朋友排查问题,他用Linux Bridge做VXLAN,结果隧道不通。我一看,他忘了配置VXLAN的VTEP IP。换成OVS后,一条命令搞定:ovs-vsctl add-port br-int vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=192.168.1.100。这就是差距。

总结一下

  • OVS的架构是控制面与数据面分离,核心组件是ovs-vswitchd和ovsdb-server
  • ovs-vswitchd负责流表处理和隧道封装,ovsdb-server负责配置持久化
  • OVS比Linux Bridge更适合VXLAN Overlay和SDN场景
  • 生产环境要注意ovs-vswitchd的高可用和内存监控

下一章,我们会动手搭建第一个OVS网桥,并创建VXLAN隧道。到时候你会看到,OVS的命令行操作其实非常直观。