ovs/ovn 学习笔记

ovs/ovn 基础学习笔记

Posted by 敬方 on July 14, 2024

参考链接:

基础介绍

简介

OVS

Open vSwitch 是一款采用开源 Apache 2 许可证的多层软件交换机。我们的目标是实现一个生产质量交换机平台,支持标准管理接口,并开放转发功能以供编程扩展和控制。

Open vSwitch 非常适合用作虚拟机环境中的虚拟交换机。除了向虚拟网络层公开标准控制和可视性接口外,它还旨在支持跨多个物理服务器的分布。Open vSwitch 支持多种基于 Linux 的虚拟化技术,包括 KVM 和 VirtualBox。

大部分代码都是用独立于平台的 C 语言编写的,可以轻松移植到其他环境。Open vSwitch 的当前版本支持以下功能:

  • 具有中继和接入端口的标准 802.1Q VLAN 模型
  • 上游交换机上有或没有 LACP 的 NIC 绑定
  • NetFlow、sFlow(R) 和镜像可提高可视性
  • QoS(服务质量)配置以及监管
  • Geneve、GRE、VXLAN、STT、ERSPAN、GTP-U、SRv6、Bareudp 和 LISP 隧道
  • 802.1ag 连接故障管理
  • OpenFlow 1.0 及众多扩展
  • 具有 C 和 Python 绑定的事务配置数据库
  • 使用 Linux 内核模块实现高性能转发

Linux bridge 虽然快速可靠,但是缺乏灵活性。虚拟化网络(OVN)对于整体灵活性、逻辑抽象要求较高。bridge 缺乏对应手段。OVS也是基于此,提供了如下特性:

  1. 状态移动性:Open vSwitch 支持在实例之间配置和迁移慢速(配置)和快速网络状态。允许开发结构自动化系统
  2. 响应网络动态:Open vSwitch 支持支持远程触发器的网络状态数据库 (OVSDB)。因此,编排软件可以“监视”网络的各个方面,并在它们发生变化时做出响应。
  3. 逻辑标签状态维护:OpenvSwitch 支持标签指定和管理,可以正确有效的管理这些标签。指定相关标签维护
  4. 硬件集成:适配结合硬件集成技术,让ovs保持高效率

整体架构

OVS整体架构如下图所示:

openvswitch 主要组件如下:

  • ovs-vswitchd: 实现切换的守护进程,基于流的切换配套Linux 内核模块
  • ovsdb-server: 轻量级数据库服务,用于给ovs-vswitchd 查询相关配置
  • ovs-dpctl: 交换机内核模块配置工具,用于控制内核数据通道
  • ovs-vsctl: 查询和更新ovs-vswitchd 配置的用户控制程度
  • ovs-appctl: 一个向正在运行的Open vSwitch 守护进程发送命令的应用程序

辅助工具组件:

  • ovs-ofctl: 查询和控制OpenFlow 交换机和控制器
  • ovs-pki:创建和管理OpenFlow交换机公钥基础设施
  • ovs-testcontroller: 简单的OpenFlow 控制器(不适用生产)
  • tcpdump: tcpdump 补丁,使其能够解析OpenFlow消息

其核心数据流程如下所示:

核心数据流程

原理简介

OVS术语

  • TUN/TAP(虚拟网卡): 用户态应用程序上收发以太网帧/IP包。TAP:以太网帧,TUN:IP包
  • Bridge(网桥):表示一个虚拟的二层以太网交换机,一个主机可以创建多个网桥,并将端口接收到的数据报文转发和丢弃
  • Port(端口):交换机上的插口,用于桥接水晶接头。关键模式如下:
    • Normal: 直接将已有网卡添加到OVS,会自动生成网卡同名port
    • Internal:此模式下OVS会自动创建一个虚拟网卡(Interface)。此端口收到的所有数据报文均会转发到此网卡中。如:ovs-vsctl add-port br-int vnet0 -- set Interface vnet0 type=internal
    • Patch: 与veth pair功能相同,成对出现。一个端收到数据会被转发至另外一个Patch Port上。实现网线功能,常用于连接两个Bridge。将两个网桥合并为一个网桥
    • Tunnel: 隧道协议,通过对物理网络做的一层封装和扩展,解决跨二层网络的问题。
  • Interface(接口/网卡/TAP/TUN):OVS连接的网卡设备
  • Controller:OpenFlow 控制器,OVS 可以接受一个或者多个OpenFlow控制器的管理,主要用于下发流表、控制转发规则
  • Flow:OVS 数据转发核心功能,定义端口之间数据转发报文规则。

网络术语

  • VLAN:VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。 每个VLAN是一个广播域,VLAN内的主机间可以直接通信,而VLAN间则不能直接互通。这样,广播报文就被限制在一个VLAN内。详见:vlan解析
  • VXLAN: VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),是对传统VLAN协议的一种扩展。VXLAN的特点是将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输。详见:vxlan解析
  • 访问链接(access link):指的是“只属于一个VLAN,且仅向该VLAN转发数据帧”的端口。一般用于链接计算机端口。
  • 汇聚链接(trunk link):指的是能够转发多个不同VLAN的通信的端口。汇聚链路上流通的数据帧,都被附加了用于识别分属于哪个VLAN的特殊信息。一般用于交换机与交换机之间的相关接口。
  • VLAN汇聚方式:通过汇聚链路时附加的 VLAN 识别信息,这个VLAN 识别信息有 IEEE 802.1Q、Cisco 产品独有的”ISL(Inter Switch Link)”

安装

源码安装

# 1. 获取代码
git clone https://github.com/openvswitch/ovs.git


# 2. 切换到最新版本
cd ovs
git checkout v2.17.0
# 3. 安装依赖
# gun make/ gcc 4.6+/libssl/libcap-ng/python3.6+/unbound libaray
yum install wget git gcc autoconf automake libtool make pkg-config uuid kernel-devel-$(uname -r) -y
# 4. 开启内核支持 开启NET_CLS_BASIC/NET_SCH_INGRESS/NET_ACT_POLICE/NET_CLS_POLICE 
# 5. 设置启动项
./boot.sh
# 6. 生成配置 开启ovs内核/编译到内核目录下
./configure --with-linux=/lib/modules/`uname -r`/build
# 7. 编译&安装
make -j `nproc` && make install
# 安装内核模块,执行该步骤后,会使编译生成的openvswitch.ko等内核模块拷贝到/lib/modules/$(uname -r)/extra/目录下
make modules_install
cat > /etc/depmod.d/openvswitch.conf << EOF
override openvswitch * extra
override vport-* * extra
EOF

# 加载ovs
depmod -a
cp debian/openvswitch-switch.init /etc/init.d/openvswitch-switch
/etc/init.d/openvswitch-switch force-reload-kmod
# 8. 配置环境变量
export PATH=$PATH:/usr/local/share/openvswitch/scripts:/usr/local/bin
# 9. 开启ovs
ovs-ctl start
# 10. 显示当前ovs配置
ovs-vsctl show 
# abe86eeb-3aa8-4260-9243-cb87747e2485
#     ovs_version: "2.17.11"

docker安装

DPDK 安装

常用命令

# 创建bridge --会默认生成一个同名端口
ovs-vsctl add-br br0
# 删除bridge
ovs-vsctl del-br br0
# 展示bridge
ovs-vsctl list-br
# 将eth0 插入 br0 -- 添加一个网口/插入网线
ovs-vsctl add-port br0 eth0
# 将eth0 设置tag 标志
ovs-vsctl set port eth0 tag=1 #vlan id
# 将eth0 从网口删除 -- 拔出网线
ovs-vsctl del-port br0 eth0
# 展示当前br0端口
ovs-vsctl list-ports br0
# 展示所有的交换机
ovs-vsctl show
# 展示网卡连接的所有网桥
ovs-vsctl port-to-br eth0
# 查询OVS所有的Interface与Port
ovs-vsctl list(Interface|Port) 
ovs-vsctl list Port ens37
# 添加一个端口--非网卡
# 注意这里会报错
ovs-vsctl add-port br0 ens37


性能优化

ovs+dpdk

ovs offload

使用坑点

交换机环路问题

ovs 作为虚拟交换机,容易引发二层环路。需要开启stp特性。详见:ovs的生成树协议(STP)实验;OVS功能特性

# 开启交换机br-int的STP
ovs-vsctl set bridge br-int stp_enable=true
# 查看交换机是否正确的开启了STP协议
ovs-vsctl get bridge br-int stp_enable
# 查看mac表
ovs-appctl fdb/show br-int
# 查看端口配置
ovs-vsctl list port br-int brint-eth1 
# 查看网桥配置
ovs-vsctl list bridge br-int

OpenFlow详解

参考链接: