本文档介绍如何使用ovs-vtep,VXLAN隧道端点模拟器(VXLAN Tunnel EndPoint,VTEP),其使用Open vSwitch进行数据转发。VTEPs是指在网络中处理VXLAN帧封装和去封装的实体。
要求
VTEP模拟器是一个Python脚本,它触发对相关工具的调用,如vtep-ctl
和 ovs-vsctl。只有在安装和启用了Open vSwitch守护进程(如ovsdb-server和ovs-vswitchd)时才有用。要执行此启用操作,请执行以下步骤:
- 按照OVS代码中的文档
/intro/install/general
描述的说明操作(还没有启动任何守护进程)。 - 按照OVS代码中的文档
/intro/install/debian'描述的说明进行操作,然后安装
openvswitch-vtep``软件包(如果在基于debian的机器上操作)。这将自动启动守护进程。
设计
在此过程结束时,你应该具有以下设置拓扑:
Architecture
+---------------------------------------------------+
| Host Machine |
| |
| |
| +---------+ +---------+ |
| | | | | |
| | VM1 | | VM2 | |
| | | | | |
| +----o----+ +----o----+ |
| | | |
| br0 +------o-----------o--------------------o--+ |
| p0 p1 br0 |
| |
| |
| +------+ +------+ |
+------------------------------| eth0 |---| eth1 |--+
+------+ +------+
10.1.1.1 10.2.2.1
MANAGEMENT | |
+-----------------o----+ |
|
DATA/TUNNEL |
+-----------------o---+
一些重要的点.
- 我们将使用Open vSwitch来创建"physical" 交换机:
br0
- 我们的 “physical” 交换机
br0
将拥有一个内部端口名字也为br0
以及两个 “physical” 端口, 命名为p0
和p1
. - 宿主机可有两个外部接口。我们将使用
eth0
来承载管理流量,eth1
承载隧道流量(也可以使用一个接口承载两种流量)。请注意他们在上图中的IP地址。你不必使用完全相同的IP地址。只需知道标注的IP地址将在以下步骤中使用。 - 你也可以连接两个物理机而不是上图中的虚拟机到交换机
br0
. 此种情况下:
- 确保在你的宿主机上有两个额外的物理端口
eth2
和eth3
. - 在本文的余下部分, 将
p0
替换为eth2
以及将p1
替换为eth3
.
- 除了将
p0
和p1
实现为物理接口之外,你还可以将它们作为独立的TAP设备或模拟的VM接口. - 创建和关联虚拟机不在本文档的讨论范围内,包含在图表中仅供参考。
开启
以下这些说明描述了如何使用以单个ovsdb-server实例运行,由其处理OVS和VTEP schema。如果按照"需求"一节的第二个步骤安装了Debian数据包,可以跳过步骤1-3。
- 创建初始OVS和VTEP schemas:
$ ovsdb-tool create /etc/openvswitch/ovs.db vswitchd/vswitch.ovsschema
$ ovsdb-tool create /etc/openvswitch/vtep.db vtep/vtep.ovsschema
- 启动ovsdb-server并让它处理两个数据库:
$ ovsdb-server --pidfile --detach --log-file \
--remote punix:/var/run/openvswitch/db.sock \
--remote=db:hardware_vtep,Global,managers \
/etc/openvswitch/ovs.db /etc/openvswitch/vtep.db
- 正常启动ovs-vswitchd:
$ ovs-vswitchd --log-file --detach --pidfile \
unix:/var/run/openvswitch/db.sock
- 在OVS中创建 “physical” 交换机,并添加端口:
$ ovs-vsctl add-br br0
$ ovs-vsctl add-port br0 p0
$ ovs-vsctl add-port br0 p1
- 在VTEP数据库中配置 “physical” 交换机:
$ vtep-ctl add-ps br0
$ vtep-ctl set Physical_Switch br0 tunnel_ips=10.2.2.1
- 开启VTEP模拟器. 如果你已经按照OVS文档
/intro/install/general
安装了组件, 在vtep
目录运行以下指令:
$ ./ovs-vtep --log-file=/var/log/openvswitch/ovs-vtep.log \
--pidfile=/var/run/openvswitch/ovs-vtep.pid \
--detach br0
如果在安装openvswitch-vtep软件包时执行了安装,你可在目录/usr/share/openvswitch/scripts
中找到ovs-vtep。
- 配置VTEP数据库管理器指向NVC:
$ vtep-ctl set-manager tcp:<CONTROLLER IP>:6640
其中 <CONTROLLER IP>
是你的控制器的IP地址,可通过宿主机的eth0端口访问.
模拟NVC
VTEP实现期望由网络虚拟化控制器(Network Virtualization
Controller,NVC)驱动。控制器(NVC),例如NSX。如果不存在,可以使用vtep-ctl模拟一个:
- 创建一个"logical" 交换机:
$ vtep-ctl add-ls ls0
- 绑定"logical" 交换机到一个端口:
$ vtep-ctl bind-ls br0 p0 0 ls0
$ vtep-ctl set Logical_Switch ls0 tunnel_key=33
- 控制未知目的地址流量由隧道发出.
为例处理二层广播、多播和未知单播流量、数据包可被发送到"physical"交换机引用的"logical"交换机的所有成员端口。以下的"unknown-dst"地址用于表示这些数据包。
对于复制数据包有着不同的模式。默认复制模式是将报文发送到服务节点,该节点可以是hypervisor、服务器或设备,并让服务节点处理复制到其它传输节点(hypervisors或其它VTEP physical 交换机)。此模式称为service node复制。
另外一种复制模式,称为source node复制,源节点发送报文到所有其它传输节点。Hypervisors始终负责在两种模式下为本地连接的虚拟机执行自己的复制。服务节点复制模式是默认模式。服务节点复制模式为因为它只需要发送数据包到一个传输节点,所以被认为是基本要求。以下配置用于服务节点复制模式,因为对于未知的"unknown-dst"地址,仅指定了一个传输节点目的:
$ vtep-ctl add-mcast-remote ls0 unknown-dst 10.2.2.2
- 可选的, 修改复制模式由默认的
service_node
到source_node
, 可在logical交换机级别完成:
$ vtep-ctl set-replication-mode ls0 source_node
- 控制单播目的地址的报文由一个不同的隧道发出:
$ vtep-ctl add-ucast-remote ls0 00:11:22:33:44:55 10.2.2.3