Open vSwitch(OVS)
Open vSwitch(OVS)是一个开源的多层虚拟交换机,用于构建和管理软件定义网络(Software-Defined Networking,SDN)环境。它提供了一种灵活、可扩展的网络虚拟化解决方案,适用于数据中心、云计算和网络虚拟化等场景。
以下是 Open vSwitch 的一些特点和功能:
-
轻量级虚拟交换机:Open vSwitch 可以作为软件交换机运行在通用服务器上,实现虚拟网络的创建和管理。它支持虚拟机、容器和物理主机之间的通信,提供高性能的数据转发。
-
多层交换:Open vSwitch 支持二层以太网交换和三层 IP 路由功能。它可以在不同的网络层之间进行数据包转发和路由,支持 VLAN、VXLAN、GRE 等多种隧道协议。
-
高可用性和负载均衡:Open vSwitch 支持多主机间的交换机冗余和负载均衡,确保网络的高可用性和性能。
-
SDN 兼容性:Open vSwitch 可以与 SDN 控制器集成,实现网络的集中管理和控制。它支持 OpenFlow 协议,使得网络管理员可以通过控制器对网络流量进行灵活的编程和管理。
-
QoS(Quality of Service)支持:Open vSwitch 提供了 QoS 功能,可以对网络流量进行优先级和带宽控制,以确保关键应用的服务质量。
-
插件架构:Open vSwitch 提供了插件架构,允许用户通过插件来扩展和定制网络功能,满足特定的需求。
-
开源社区支持:Open vSwitch 是一个活跃的开源项目,拥有广泛的社区支持和开发者社区,持续推进其功能和性能的改进。
总体而言,Open vSwitch 提供了一种灵活、可扩展的虚拟交换机解决方案,适用于构建虚拟化环境和软件定义网络,提供了高级网络功能和集中管理的能力。
ovs交换机的角色
在SDN的架构下,ovs作为 SDN交换机,向上连接控制器,向下连接主机。并且Open vSwitch交换机是能够与真是物理交换机通信,相互交流数据。
ovs交换机的组成
-
**ovs-vswitchd:**ovs守护进程,实现基于流的交换,实现内核datapath upcall 处理以及ofproto 查表,同时是dpdk datapath处理程序。与ovsdb-server通信使用OVSDB协议,与内核模块使用netlink机制通信,与controller通信使用OpenFlow协议。
-
**ovsdb-server:**OVS轻量级的数据库服务器的服务程序,用于保存整个OVS的配置信息。数据库服务程序, 使用目前普遍认可的ovsdb 协议。
-
**ovs-vsctl:**网桥、接口等的创建、删除、设置、查询等。
-
**ovs-dpctl:**配置vswitch内核模块
-
**ovs-appctl:**发送命令消息到ovs-vswithchd, 查看不同模块状态
-
**ovs-ofctl:**下发流表信息。该命令可以配置其他openflow 交换机(采用openflow 协议)
-
datapath: Datapath把流的match和action结果缓存,避免后续同样的流继续upcall到用户空间进行流表匹配。
-
**ovs-db:**开放虚拟交换机数据库是一种轻量级的数据库,它是一个JSON文件,默认路径:/etc/openvswitch/conf.db;
可以通过命令ovsdb-client dump将数据库结构打印出来。OVSDB中包含一系列记录网桥、端口、QoS等网络配置信息的表,这些表均以JSON格式保存。
每一个ovs交换机中,数据库中存在的表如下:
数据包处理流程
1.ovs的datapath接收到从ovs连接的某个网络设备发来的数据包,从数据包中提取源/目的IP、源/目的MAC、端口等信息。
2.ovs在内核状态下查看流表结构(通过Hash),观察是否有缓存的信息可用于转发这个数据包。
3.假设数据包是这个网络设备发来的第一个数据包,在OVS内核中,将不会有相应的流表缓存信息存在,那么内核将不会知道如何处置这个数据包。所以内核将发送upcall给用户态。
4.ovs-vswitchd进程接收到upcall后,将检查数据库以查询数据包的目的端口是哪里,然后告诉内核应该将数据包转发到哪个端口,例如eth0。
5.内核执行用户此前设置的动作。即内核将数据包转发给端口eth0,进而数据被发送出去。
安装指定版本的ovs
准备工作
安装python
apt install python
安装python-pip
apt install python-pip
安装步骤:
-
到官网http://www.openvswitch.org/download/下载指定版本,可以看到这种安装的好处是你可以指定任何一种版本,不会被apt的安装方式限制了版本号。
wget https://www.openvswitch.org/releases/openvswitch-2.17.6.tar.gz
-
解压
tar -zxvf openvswitch-2.17.6.tar.gz
-
生成makefile文件
./configure
-
make 编译文件
make
-
make install 安装
make install
-
检查模块
make modules_install
-
载入模块,载入openvswitch的模块到内核中
/sbin/modprobe openvswitch /sbin/lsmod |grep openvswitch
-
启动
export PATH=$PATH:/usr/local/share/openvswitch/scripts ovs-ctl start
-
启动ovsdb-server服务
export PATH=$PATH:/usr/local/share/openvswitch/scripts ovs-ctl --no-ovs-vswitchd start
-
启动ovs-vswitchd服务
export PATH=$PATH:/usr/local/share/openvswitch/scripts ovs-ctl --no--ovsdb-server start
-
配置ovsdb的数据库
mkdir -p /usr/local/etc/openvswitch ovsdb-tool create /usr/local/etc/openvswitch/conf.db \ vswitchd/vswitch.ovsschema
-
配置ovsdb-server以使用上面创建的数据库,监听Unix域套接字
mkdir -p /usr/local/var/run/openvswitch ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \ --remote=db:Open_vSwitch,Open_vSwitch,manager_options \ --private-key=db:Open_vSwitch,SSL,private_key \ --certificate=db:Open_vSwitch,SSL,certificate \ --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \ --pidfile --detach --log-file
-
使用ovs-vsctl初始化数据库
启动主Open vSwitch守护进程
ovs-vsctl --no-wait init ovs-vswitchd --pidfile --detach --log-file
-
接下来就可以使用了,使用ovs-vsctl show命令,查看ovs的版本号。
root@node1:~# ovs-vsctl show 60760ff9-ed7f-463c-abc5-447309fea552 ovs_version: "2.17.6"
一次性执行完成的多行命令:
./configure
make
make install
make modules_install
/sbin/modprobe openvswitch
export PATH=$PATH:/usr/local/share/openvswitch/scripts
ovs-ctl start
export PATH=$PATH:/usr/local/share/openvswitch/scripts
ovs-ctl --no-ovs-vswitchd start
export PATH=$PATH:/usr/local/share/openvswitch/scripts
ovs-ctl --no--ovsdb-server start
mkdir -p /usr/local/etc/openvswitch
ovsdb-tool create /usr/local/etc/openvswitch/conf.db \
vswitchd/vswitch.ovsschema
mkdir -p /usr/local/var/run/openvswitch
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,Open_vSwitch,manager_options \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
--pidfile --detach --log-file
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach --log-file
ovs中的port
在Open vSwitch(OVS)中,“port"是指物理或逻辑网络设备的接口,用于连接虚拟交换机与外部网络或其他虚拟机。每个端口都有一个唯一的标识符,称为"port ID”。
在OVS中,有几种类型的端口:
-
物理端口(Physical Port):物理端口是连接OVS交换机和物理网络设备(如物理网卡)的接口。它们用于与外部网络进行通信,例如连接服务器到物理交换机或路由器的网口。
-
虚拟端口(Virtual Port):虚拟端口是连接OVS交换机和虚拟机的接口。它们用于将虚拟机连接到OVS交换机,以便进行虚拟机之间的通信或与外部网络的通信。
-
隧道端口(Tunnel Port):隧道端口是用于建立虚拟网络之间的隧道连接的接口。它们通过在底层网络上封装和解封装数据包,实现虚拟网络之间的通信。
-
内部端口(Internal Port):内部端口是用于连接OVS交换机内部组件的接口,如连接交换机的流表、控制器或其他模块的接口。
端口在OVS中起到了关键的作用,它们允许虚拟机、物理设备和其他网络组件之间的通信和互联。OVS可以配置和管理这些端口,以实现网络的灵活性、可扩展性和性能优化。
Open vSwitch使用
使用 Open vSwitch(OVS)可以实现网络虚拟化和软件定义网络(SDN),下面是 Open vSwitch 的一些基本使用方式和步骤:
-
安装 Open vSwitch:根据您的操作系统,使用适当的软件包管理工具(如apt、yum等)安装 Open vSwitch。
-
创建网桥:使用
ovs-vsctl
命令创建一个网桥,例如:sudo ovs-vsctl add-br ovsbr0
-
添加物理接口:将物理网络接口(例如eth0)添加到网桥中,例如:
sudo ovs-vsctl add-port ovsbr0 eth0
-
配置虚拟接口:使用
ovs-vsctl
命令创建和配置虚拟接口,例如:sudo ovs-vsctl add-port ovsbr0 veth0 -- set Interface veth0 type=internal
-
配置流量转发:根据需要,使用
ovs-ofctl
命令配置流量转发规则,例如:sudo ovs-ofctl add-flow ovsbr0 in_port=eth0,actions=output:veth0
上述命令表示从 eth0 接口接收的数据包将被转发到 veth0 接口。
-
配置虚拟网络:可以创建虚拟网络和子网,并将虚拟接口和虚拟机连接到这些网络中,以实现虚拟化环境的网络隔离和管理。
-
集成 SDN 控制器:如果需要使用 SDN 控制器管理网络,可以将 Open vSwitch 配置为与控制器集成,例如使用 OpenFlow 协议。
这只是 Open vSwitch 的基本用法示例,实际使用会根据具体的网络需求和环境而有所不同。您可以参考 Open vSwitch 的官方文档和相关资料,了解更多详细的使用方法和配置选项。
将物理网卡加入网桥ip失效问题解决
ovs-vsctl add-port my-br ens18
将物理网卡加入网桥后ssh连接失效,不能ssh,不能ping通。
解决步骤:
查看当前网卡ip地址
ifconfig
查看路由
route -n
创建网桥,绑定端口
ovs-vsctl add-br my-br
ovs-vsctl show
ovs-vsctl add-port my-br ens18
将网卡ens18的ip地址转移到网卡my-br上
ifconfig ens18 0 //不用漏了
ifconfig my-br xxx.xxx.xxx.xxx
ifconfig my-br up
查看路由
发现当前路由中没有发往外网的路由
route -n
添加新路由
ip route add/replace 0.0.0.0/0 via 172.17.0.1 dev my-br
测试生效
ping baidu.com
使用ovs-docker配置docker网络
ovs-docker: Performs integration of Open vSwitch with Docker.
usage: ovs-docker COMMAND
Commands:
add-port BRIDGE INTERFACE CONTAINER [--ipaddress="ADDRESS"]
[--gateway=GATEWAY] [--macaddress="MACADDRESS"]
[--mtu=MTU]
Adds INTERFACE inside CONTAINER and connects it as a port
in Open vSwitch BRIDGE. Optionally, sets ADDRESS on
INTERFACE. ADDRESS can include a '/' to represent network
prefix length. Optionally, sets a GATEWAY, MACADDRESS
and MTU. e.g.:
ovs-docker add-port br-int eth1 c474a0e2830e
--ipaddress=192.168.1.2/24 --gateway=192.168.1.1
--macaddress="a2:c3:0d:49:7f:f8" --mtu=1450
del-port BRIDGE INTERFACE CONTAINER
Deletes INTERFACE inside CONTAINER and removes its
connection to Open vSwitch BRIDGE. e.g.:
ovs-docker del-port br-int eth1 c474a0e2830e
del-ports BRIDGE CONTAINER
Removes all Open vSwitch interfaces from CONTAINER. e.g.:
ovs-docker del-ports br-int c474a0e2830e
set-vlan BRIDGE INTERFACE CONTAINER VLAN
Configures the INTERFACE of CONTAINER attached to BRIDGE
to become an access port of VLAN. e.g.:
ovs-docker set-vlan br-int eth1 c474a0e2830e 5
Options:
-h, --help display this help message.
添加interface:
ovs-docker add-port vmbr6001 eth0 centos4 --ipaddress=172.17.3.104/22 --gateway=172.17.0.1
获取与ovs数据库中与docker绑定的所有interface:
ovs-vsctl --data=bare --no-heading --columns=name find interface external_ids:container_id=centos3
设置vlan:
ovs-docker set-vlan vmbr6001 eth1-ovs centos3 5