Table of Contents
Open vSwitch Documentation
https://docs.openvswitch.org/en/latest/
文档的组织方式
Open vSwitch文档分为多个部分:
第一步
Open vSwitch(OVS)入门?从这里开始。
深潜
Open vSwitch项目
了解有关Open vSwitch项目以及如何做出贡献的更多信息:
什么是开放式vSwitch?
https://docs.openvswitch.org/en/latest/intro/what-is-ovs/
概述
Open vSwitch是根据开源Apache 2许可获得许可的多层软件交换机。我们的目标是实现一个生产质量交换平台,该平台支持标准管理界面,并开放转发功能以进行程序扩展和控制。
Open vSwitch非常适合在VM环境中用作虚拟交换机。除了向虚拟网络层公开标准控制和可见性接口之外,它还旨在支持跨多个物理服务器的分发。Open vSwitch支持多种基于Linux的虚拟化技术,包括Xen / XenServer,KVM和VirtualBox。
大部分代码是用与平台无关的C编写的,可以轻松移植到其他环境。当前版本的Open vSwitch支持以下功能:
- 具有中继和访问端口的标准802.1Q VLAN模型
- NIC绑定在上游交换机上有无LACP
- NetFlow,sFlow(R)和镜像可提高可见性
- QoS(服务质量)配置以及策略
- Geneve,GRE,VXLAN,STT和LISP隧道
- 802.1ag连接故障管理
- OpenFlow 1.0以及众多扩展
- 具有C和Python绑定的事务配置数据库
- 使用Linux内核模块的高性能转发
随附的Linux内核模块支持Linux 3.10及更高版本。
Open vSwitch也可以完全在用户空间中运行,而无需内核模块的帮助。这种用户空间实现应该比基于内核的交换机更容易移植。用户空间中的OVS可以访问Linux或DPDK设备。注意具有用户空间数据路径和非DPDK设备的Open vSwitch被认为是实验性的,并且会带来性能上的损失。
这是什么
此发行版的主要组件是:
- ovs-vswitchd,一个实现切换的守护程序,以及一个用于基于流的切换的配套Linux内核模块。
- ovsdb-server,轻型数据库服务器,ovs-vswitchd查询以获取其配置。
- ovs-dpctl,用于配置交换机内核模块的工具。
- 用于为Citrix XenServer和Red Hat Enterprise Linux构建RPM的脚本和规范。XenServer RPM允许将Open vSwitch安装在Citrix XenServer主机上,以替代其交换机,并具有其他功能。
- ovs-vsctl,用于查询和更新ovs-vswitchd的配置的实用程序。
- ovs-appctl,一个将命令发送到正在运行的Open vSwitch守护程序的实用程序。
Open vSwitch还提供了一些工具:
- ovs-ofctl,用于查询和控制OpenFlow交换机和控制器的实用程序。
- ovs-pki,一个用于创建和管理OpenFlow交换机的公共密钥基础结构的实用程序。
- ovs-testcontroller,一个简单的OpenFlow控制器,可能对测试有用(尽管不适用于生产)。
- tcpdump的补丁程序,使它能够解析OpenFlow消息。
为什么要使用Open vSwitch?
https://docs.openvswitch.org/en/latest/intro/why-ovs/
虚拟机管理程序需要能够在虚拟机之间以及与外部世界之间桥接流量。在基于Linux的虚拟机管理程序上,这通常意味着使用内置的L2交换机(Linux桥接器),它既快速又可靠。因此,合理地问为什么使用Open vSwitch。
答案是Open vSwitch针对多服务器虚拟化部署,而以前的堆栈不太适合这种环境。这些环境通常具有以下特点:高度动态的端点,逻辑抽象的维护,以及(有时)与专用交换硬件集成或分流到专用交换硬件。
以下特性和设计注意事项可帮助Open vSwitch满足上述要求。
流动性
与网络实体(例如虚拟机)相关联的所有网络状态应易于识别,并可在不同主机之间迁移。这可能包括传统的“软状态”(例如L2学习表中的条目),L3转发状态,策略路由状态,ACL,QoS策略,监视配置(例如NetFlow,IPFIX,sFlow)等。
Open vSwitch支持在实例之间配置和迁移慢速(配置)和快速网络状态。例如,如果VM在终端主机之间迁移,则不仅可以迁移关联的配置(SPAN规则,ACL,QoS),还可以迁移任何活动的网络状态(例如,可能难以重构的现有状态)。此外,Open vSwitch状态由实际数据模型输入并支持,从而可以开发结构化自动化系统。
应对网络动态
虚拟环境通常具有高变化率的特征。VM来来去去,VM随时间向前和向后移动,更改逻辑网络环境,等等。
Open vSwitch支持许多功能,这些功能允许网络控制系统随着环境的变化做出响应和适应。这包括简单的记帐和可见性支持,例如NetFlow,IPFIX和sFlow。但是也许更有用,Open vSwitch支持支持远程触发器的网络状态数据库(OVSDB)。因此,一个编排软件可以“监视”网络的各个方面,并在它们发生更改时做出响应。如今,这已被大量使用,例如,用于响应和跟踪VM迁移。
Open vSwitch还支持OpenFlow作为导出远程访问以控制流量的方法。这样做有多种用途,包括通过检查发现或链接状态流量(例如LLDP,CDP,OSPF等)进行全球网络发现。
硬件集成
Open vSwitch的转发路径(内核中的数据路径)设计为可以将数据包处理“分流”到硬件芯片组,无论是安装在传统的硬件交换机机箱还是终端主机NIC中。这样,Open vSwitch控制路径就可以控制纯软件实现或硬件开关。
正在进行许多将Open vSwitch移植到硬件芯片组的工作。这些包括多个商业硅芯片组(Broadcom和Marvell),以及许多特定于供应商的平台。文档中的“端口”部分讨论了如何进行这样的端口。
硬件集成的优势不仅在于虚拟化环境中的性能。如果物理交换机还公开了Open vSwitch控件抽象,则可以使用相同的自动网络控制机制来管理裸机环境和虚拟主机环境。
总结
与以前的虚拟机管理程序网络堆栈相比,Open vSwitch在许多方面都针对设计空间的不同点,着重于在基于Linux的大规模虚拟化环境中对自动化和动态网络控制的需求。
Open vSwitch的目标是使内核代码尽可能小(对于性能而言是必需的),并在适用时重用现有子系统(例如Open vSwitch使用现有QoS堆栈)。从Linux 3.3开始,Open vSwitch已包含在内核中,并且在大多数流行的发行版中都提供了用户空间实用程序的包装。
OVS教程
https://docs.openvswitch.org/en/latest/tutorials/faucet/
Open vSwitch额外特性
https://docs.openvswitch.org/en/latest/tutorials/ovs-advanced/
Open vSwitch与DPDK
https://docs.openvswitch.org/en/latest/intro/install/dpdk/
安装DPDK
$ cd /usr/src/
$ wget https://fast.dpdk.org/rel/dpdk-19.11.2.tar.xz
$ tar xf dpdk-19.11.2.tar.xz
$ export DPDK_DIR=/usr/src/dpdk-stable-19.11.2
$ cd $DPDK_DIR
$ export DPDK_TARGET=x86_64-native-linuxapp-gcc
$ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
$ make install T=$DPDK_TARGET DESTDIR=install
$ export LD_LIBRARY_PATH=$DPDK_DIR/x86_64-native-linuxapp-gcc/lib
安装OVS
$ ./configure --with-dpdk=$DPDK_BUILD
$ ./configure --with-dpdk=$DPDK_BUILD CFLAGS="-Ofast -msse4.2 -mpopcnt"
$ checking binutils avx512 assembler checks passing... yes
大页内存设置
$ echo 'vm.nr_hugepages=2048' > /etc/sysctl.d/hugepages.conf
$ sysctl -w vm.nr_hugepages=N # where N = No. of 2M huge pages
$ grep HugePages_ /proc/meminfo
$ mount -t hugetlbfs none /dev/hugepages``
Setup DPDK devices using VFIO
$ dmesg | grep -e DMAR -e IOMMU
If VT-d is not enabled in the BIOS, enable it now.
To ensure VT-d is enabled in the kernel, run:
$ cat /proc/cmdline | grep iommu=pt
$ cat /proc/cmdline | grep intel_iommu=on
《ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)》
If VT-d is not enabled in the kernel, enable it now.
Once VT-d is correctly configured, load the required modules and bind the NIC to the VFIO driver:
$ modprobe vfio-pci
$ /usr/bin/chmod a+x /dev/vfio
$ /usr/bin/chmod 0666 /dev/vfio/*
$ $DPDK_DIR/usertools/dpdk-devbind.py --bind=vfio-pci eth1
$ $DPDK_DIR/usertools/dpdk-devbind.py --status
Setup OVS
应按照Linux,FreeBSD和NetBSD上的Open vSwitch中的说明启动Open vSwitch,但ovs-vswitchd除外,后者需要进行一些特殊配置才能启用DPDK功能。可以通过表的other_config
列将DPDK配置参数传递给ovs-vswitchd Open_vSwitch
。至少dpdk-init
必须将选项设置为true
或try
。例如:
$ export PATH=$PATH:/usr/local/share/openvswitch/scripts
$ export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
$ ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
$ ovs-ctl --no-ovsdb-server --db-sock="$DB_SOCK" start
还有许多其他配置选项,下面列出了其中最重要的选项。将为所有未明确设置的值提供默认值。
dpdk-init
指定OVS是否应初始化并支持DPDK端口。该字段可以是true
或try
。值true
将导致ovs-vswitchd进程在初始化失败时中止。值try
将表示即使EAL初始化失败,ovs-vswitchd进程也应继续运行。dpdk-lcore-mask
指定应在其上产生dpdk lcore线程的CPU内核,并期望使用十六进制字符串(例如'0x123')。dpdk-socket-mem
逗号分隔的内存列表,用于从特定套接字上的大页面中进行预分配。如果未指定,则默认情况下将为每个numa节点设置1024 MB。dpdk-hugepage-dir
挂载ugeltlbfs的目录vhost-sock-dir
设置虚拟主机用户Unix套接字文件路径的选项。
如果分配超过一个GB的大页面,则可以配置任何给定NUMA节点使用的内存量。例如,要将NUMA节点0中的1GB和0GB用于所有其他NUMA节点,请运行:
$ ovs-vsctl --no-wait set Open_vSwitch . \
other_config:dpdk-socket-mem="1024,0"
or
$ ovs-vsctl --no-wait set Open_vSwitch . \
other_config:dpdk-socket-mem="1024"
Using Open vSwitch with DPDK
https://docs.openvswitch.org/en/latest/howto/dpdk/