叶绍琛,Unix/Linux/Android操作系统内核技术专家,大中华区前50位RHCA系统架构师,Oracle OCM认证数据库大师,曾任网易互娱云计算平台技术负责人,关注技术创新,关注云计算背景下的技术变革。
分类: 云计算
2014-07-01 02:07:46
一、OpenStack网络
1.1 什么是SDN软件定义网络
软件定义网络(Software Defined Network)就是在虚拟化的背景下,为了满足虚拟化环境下虚拟机对网络的需求,逐步发展起来的技术。网络虚拟化通常被称为SDN(software defined network)软件定义网络。
如下图,在某台物理服务器中,运行着4台虚拟机,为了将这4台虚拟机在逻辑上组成我们需要的网络架构,于是就虚拟成了2台交换机,组成图中的网络架构。
1.2 虚拟网络的挑战
1.2.1 跟踪设备移动状态。
网络端节点实体(比如虚拟机)的网络状态需要简单确定,不同主机之间可相互迁移节点状体。这些状态包括传统“软状态”,比如数据链路层学习表、三层路由转发状态、路由策略状态、访问控制列表、服务质量策略、配置监控及结构化自动化系统等。简单来讲,就是每个虚拟机移动时,其所带虚拟接口策略如何主动随之漂移。
1.2.2 维护虚拟化逻辑标记。
分布式虚拟交换机通常通过增加或管理虚拟机网络数据,来维护虚拟网络或逻辑区域上下文,这是容易理解的简单方式,问题是正确和高效管理这些虚拟化标记非常困难。增加网络标记,就增加新一层网络信息,从另一方面间又增加了网络复杂度。为简化管理和提高效率,常常需要优化虚拟机标记存储方式,包括保存虚拟化地址或重新映射、配置、修改和迁移标志。
1.2.3 集成操作系统和硬件。
把虚拟数据转发路径设计成“卸载”模式,数据包处理由硬件芯片完成,以独立软件或硬件芯片方式实现灵活控制,增加虚拟化网络性能。独立软件开发商还可以使用接口增强虚拟边界网络功能,减少硬件交付到应用交付的负面影响,从而简化、加速和减轻可扩展云的网络管理。
二、Open vSwitch项目
2.1什么是Open vSwitch
OpenvSwitch简称OVS,正如其官网()所述,OVS是一个高质量、多层的虚拟交换软件。它的目的是通过编程扩展支持大规模网络自动化,同时还支持标准的管理接口和协议。
随着虚拟化应用普及,需要部署更多虚拟化软交换交换机,而费用昂贵的闭源虚拟交换机让用户不堪重负,多层虚拟化软件交换机Open vSwitch由Nicira Networks开发,主要实现代码为可移植的C代码。它遵循Apache 2.0开源代码版权协议,可用于生产环境,支持跨物理服务器分布式管理、扩展编程、大规模网络自动化和标准化接口,实现了和大多数商业闭源交换机功能类似的软件交换机。
OVS官方的定位是要做一个产品级质量的多层虚拟交换机,通过支持可编程扩展来实现大规模的网络自动化。设计目标是方便管理和配置虚拟机网络,检测多物理主机在动态虚拟环境中的流量情况。针对这一目标,OVS具备很强的灵活性。可以在管理程序中作为软件switch运行,也可以直接部署到硬件设备上作为控制层。
2.2 Open vSwitch相关组件
ovs-vswitchd: 功能:实现switch的daemon功能,包括一个支持流交换的Linux内核模块,实现了交换功能。 ovsdb-vswtich: 功能:openvswitch的数据库,给ovs-vswitchd提供运行配置信息,即保存了ovs-vswitchd的配置信息,例如vlan、port等信息。 ovs-brcompatd: 功能:让ovs-swtich替换Linux bridge,包括获取bridge ioctls的内核模块。 ovs-dpctl: 功能:用来配置switch的内核模块。 ovs-vsctl: 功能:查询和更新ovs-vswitchd的配置,即用于修改或查询ovsdb-vswitch的信息。 ovs-appctl: 功能:发送命令消息,运行相关daemon。 ovs-pki: 功能:OpenFlow公钥管理框架。 ovs-bugtool: 功能:管理openvswitch的bug信息。
2.3 术语和逻辑概念
在Openvswitch的使用中,为了能全面地理解Openvswitch的内部原理,我们需要对其中的术语和概念有所了解。
Bridge:即网桥,在Openvswitch中每个虚拟交换机(vswitch)都可以认为是一个网桥,因为Openvswitch在底层的通信是借助了网桥模块来实现的,同时我们通过brctl也能查看到ovs所创建的网桥设备。
Datapath:即数据通路,在Openvswitch中每个Bridge我们都可以理解为Datapath,也就是说Datapath就是虚拟交换机。
如上图,每个Datapath项中我们都能看到存在几个Port项,它们其实就是虚拟交换机(datapath)上的端口。如上br-tun项中,port2就与远端的端口建立了gre隧道。
Flowtable:即数据流表,根据之前对OpenFlow的介绍,我们已经了解了Openvswitch中利用openflow协议在实现虚拟交换机,而数据流表就是提供给Bridge/Datapath做数据操作的指令。
Port:即端口,这里的端口是指虚拟交换机逻辑上的接口,我们可以通过ovs-vsctl命令查看各个网桥(即虚拟交换机)上的接入的端口。
Patch:即连线,我们可以理解为传统交换机的Trunk,在这里就是网络节点和运算节点间ovs虚拟交换的联结。
下图为网络节点的br-int(用于VM的虚拟交换)。
下图为运算节点上的br-int,我们可以看到其中一个端口(vport)是和网络节点的br-int交换进行联结的。它们的类型为“type:patch”,这样的联结就是Patch。
Tun/Tap:它们是Linux/Unix系统中的虚拟网络设备,TAP等同于以太网设备,操作L2层数据链路层的数据帧;TUN则是模拟L3网络层的设备,操作网络层的IP数据包。
在OVS中,其GRE隧道模式在底层的实现是由TUN支持的,而TAP设备则是用来分隔openvswitch中不同的subnet。
如下图,网络节点上两个TAP设备接入在br-int虚拟交换机中。
我们可以看到两个TAP设备的IP地址是在Openvswitch中创建的2个subnet网络的网关地址。
Vnet:即虚拟机的虚拟网卡,在运算节点上可以看到OVS对于vnet的管理和传统的网桥模式不同,根据对设备物理地址的判断,应该是OVS采用了相应的tunneling技术,具体不详。
2.4 OVS内部结构分析
下面开始分析Openvswitch的内部结构,在Openvswitch的逻辑层面上存在一个Controller控制器,它是负责管理所有虚拟交换机的中心,而虚拟交换机在OVS也叫datapath(数据通路),它会将收集到的数据或事件传送给控制器,例如一些端口的接入等。
Datapath实现路由转发等高级特性是通过Flow Table(数据流表)来实现的。在OVS中,数据流标是根据OpenFlow的协议标准来实现的,由控制中心统一运算生成各个虚拟交换设备的Flow Table,并分发到各个Datapath中。
下图是系统层面的逻辑图。
其中datapath是处于系统的核心层(kernel space),我们可以将datapath理解为一个网桥(linux bridge)。处于用户态(user space)的主要是openvswitch client、openflow client、ofproto library、netdev等等。
如上图中,ofproto即openflow protocol的缩写,它是一个openflow的库,OVS的客户端(如ovs-vswitchd、ovs-openflowd)就是通过调用这个库来操作OVS的控制中心。
netdev则是设备抽象的API,它是由linux内核提供的,通过netdev这个API,可以直接与内核层的网络设备通信,同时Flow table也处在内核层中,这样当datapath依照flow table的规则处理数据流时就可以直接将操作传送给内核层的网络设备进行操作,这样的传输性能是十分强悍的。
2.5 OVS内部通信
下面我们分析一下Openvswitch在工作中的通信过程。
传统的交换机(包括linux bridge网桥)中转发二层的数据包时,都是通过查找CAM表(二层交换机地址表)找到目的MAC对应的端口再进行转发。
在openvswitch的实现中,由于其采用了openflow的规范标准,所以会先查找数据包是否有对应的流记录,如果有则根据该条流记录的action部分,对数据包进行操作,例如转发到某端口。
如下图中,一个虚拟交换机在openvswitch中就是一个datapath,当数据包通过物理路径进入到OVS网络节点,OVS会分析包的关键信息并和各个datapath的数据流表进行匹配,若有对应的条目则根据action来处理数据包;但是若没有已存在的条目,则说明这个
2.6 ovs-vsctl使用指南
vos-vsctl命令格式: usage: ovs-vsctl [OPTIONS] COMMAND [ARG...] 常见的OPTIONS有以下组成: --db=DATABASE :指定连接的数据库,默认是unix:/var/run/openvswitch/db.sock --no-wait: 在使用时不等待ovs-vswitchd的重新配置 --retry:不断尝试连接远端服务器 --t,-timeout=SECS: 等待ovs-vswitchd的超时时间 --dry-run: 尝试运行修修改的配置但是不提交到ovsdb-vswitch数据库 --oneline:将打印出的命令一行一行的显示 -h,--help: 显示帮助信息 -V,--version:显示版本信息
常用的COMMAND有以下几类:
OpenvSwitch的维护命令: init:初始化ovsdb-vswitch数据库 show:查看数据信息 emer-reset: 重新设置openvswitch的状态 OpenvSwitch对桥设备操作相关的命令: add-br BRIDGE :添加一个桥设备 add-br BRIDGE PARENT VLAN:在PARENT中创建一个桥,并做vlan标记 del-br BRIDGE: 删除一个桥设备 list-br: 查看创建的桥设备 br-exists BRIDGE: 判断新创建的桥是否已经存在 br-to-vlan BRIDGE: 列出桥设备的所有的valn br-to-parent BRIDGE: 列出当前桥的上一个桥设备 br-set-external-id BRIDGE KEY VALUE: 给桥添加额外的属性,方式为 key vllue格式 br-set-external-id BRIDGE KEY:撤销桥设备额外的信息 br-get-external-id BRIDGE KEY:列出桥设备额外的信息 br-get-external-id BRIDGE :以key-value格式列出桥设备的额外信息 OpenvSwitch对端口的操作命令: list-ports BRIDGE: 列出指定桥设备上的端口 add-ports BRIDGE PORT :添加一个端口到桥设备,此端口可以事先不存在 add-bond BRIDGE PORT IFACE...: 对桥设备做多端口绑定 del-port [BRIDGE] PORT: 删除一个端口或者删除一个指定桥设备上的端口 port-to-br PORT:列出端口所在的桥设备 OpenvSwitch对接口操作的命令: list-ifaces BRIDGE: 列出桥设备上的所有接口 iface-to-br IFACE: 列出接口所在的桥设备 OpenvSwitch的控制命令: get-contorller BRIDGE: 获取桥设备的控制器 del-contorller BRIDGE: 删除桥设备的控制器 set-contorller BRIDGE TARGET...:给桥设备设置一个控制器 get-fail-mode BRIDGE: 显示桥设备错误的模式 del-fail-mode BRIDGE: 删除桥设备错误的模式 set-fail-mode BRIDGE MODE: 设置桥设备失败的模式为MODE OpenvSwitch管理相关的命令: get-manager: 列出openvswitch的管理者 del-manager:删除openvswitch的管理者 set-manager TARGET....:设置管理者列表为TARGET OpenvSwitch安全相关的命令: get-ssl:获取ssl的配置信息 del-ssl: 删除ssl的配置信息 set-ssl PRIV-KEY CERT CA-CERT: 配置ssl OpenvSwitch交换相关的命令: emer-rest: 重新设置未知交换机的状态 OpenvSwitch数据库操作相关命令: listTBL [REC]: 列出TBL的资源记录信息(ovs-vsctl list port ) findTBL CONDITION....:查找相关的资源记录信息 getTBL REC COL[:KEY]:获取TBL的信息 setTBL REC COL[:KEY]=VALUE:设定TBL的额外属性(ovs-vsctl set Port br1 tag=2) addTBL REC COL [KEY=]VALUE:添加一个[key=]value到TBL remove TBL REC COL [KEY=]VALUE:删除TBL中的一个key值(ovs-vsctlremove Port br1 tag 2) clearTBL REC COL: 清除指定TBL的资源记录信息 create TBL COL [:KEY]=VALUE:在TBL中创建一个资源记录信息 destroy TBL REC:销毁一个TBL的REC wait-until TBL REC [COL[:KEY]=VALUE]:等待TBL资源记录配置完成 常用的ARG参数: 连接主数据库的方法: tcp:IP:PORT: 指定连接远端数据库使用tcp协议,以及远端主数据库的ip地址跟端口 ssl:IP:PORT: 指定连接远端数据库使用ssl协议,以及远端主数据库的ip地址跟端口 unix:FILE:使用socket套接字连接主数据库 备用数据库的连接方法: ptcp:IP:PORT: 指定连接远端数据库使用tcp协议,以及远端备用数据库的ip地址跟端口 pssl:IP:PORT: 指定连接远端数据库使用ssl协议,以及远端备用数据库的ip地址跟端口 punix:FILE:使用socket套接字连接备用数据库 PKI配置: -p,--private-key=FILE: 指定私有秘钥的位置 -c,--certificate=FILE:指定证书的位置 -C,ca-cert=FILE:指定对端证书的