开始吧
因为要为公司云产品做OVS类型虚拟化网络方案参考了Openstack和OVN的实现做了些笔记,之前虽然做过OVS的网络方案,但都是在骨干网上,相对逻辑比较简单。OVS方案在业界普遍使用,也有很多较为成熟的开源方案,如Openstack和OVN。
Openstack倒是整理了一份更为细致和准确的调研文档,但是网上资料太多没必要贴出来,后面会把流表设计相关内容放出来,还有一篇流表设计通用方案。
OVN的基本功能、架构、流表设计也做了些记录,这里贴出来供复习使用。
OVN 简介
OVN (Open Virtual Network) 是OVS提供的原生虚拟化网络方案,旨在解决传统SDN架构(比如Neutron DVR)的性能问题。
OVN是OVS的控制平面的一种结构实现,早期版本ovn就是放在ovs的代码里的,后面才分开的,但编译ovn是也必须指定ovs的源码目录,可见OVN实际上是OVS的亲儿子。
其主要功能包括
- L2/L3虚拟网络以及逻辑交换机(logical switch)
- L2/L3/L4 ACL
- IPv4/IPv6分布式L3路由
- ARP and IPv6 Neighbor Discovery suppression for known IP-MAC bindings
- Native support for NAT and load balancing using OVS connection tracking
- Native fully distributed support for DHCP
- Works with any OVS datapath (such as the default Linux kernel datapath, DPDK, or Hyper-V) that supports all required features (namely Geneve tunnels and OVS connection tracking)
- Supports L3 gateways from logical to physical networks
- Supports software-based L2 gateways
- Supports TOR (Top of Rack) based L2 gateways that implement the hardware_vtep schema
- Can provide networking for both VMs and containers running inside of those VMs, without a second layer of overlay networking
OVN架构
OVN由以下组件构成:
- northbound database:存储逻辑交换机、路由器、ACL、端口等的信息,目前基于ovsdb-server,未来可能会支持etcd v3
- ovn-northd: 集中式控制器,负责把northbound database数据分发到各个ovn-controller
- ovn-controller: 运行在每台机器上的本地SDN控制器
- southbound database:基于ovsdb-server(未来可能会支持etcd v3),包含三类数据
- 物理网络数据,比如VM的IP地址和隧道封装格式
- 逻辑网络数据,比如报文转发方式
-
物理网络和逻辑网络的绑定关系
补充说明
- Data Path:OVN的实现简单有效,都是基于OVS原生的功能特性来做的(由于OVN的实现不依赖于内核特性,这些功能在OVS+DPDK上也完全支持),比如
- security policies 基于 OVS+conntrack 实现
- 分布式L3路由基于OVS flow实现
- Logical Flows:逻辑流表,会由ovn-northd分发给每台机器的ovn-controller,然后ovn-controller再把它们转换为物理流表;
- 后面经常会用到 ovn-nbctl 和 ovn-sbctl 命令,是分别查看 Northbound DB 和 Southbound DB 数据,ovs-vsctl 用来查看本地ovs db的数据,着三个命令依次会越来越抽象。
如果实现OVS的虚拟交换机方案,有两个难点:
- 一是控制面设计,如果将网络业务逻辑转化为物理网络拓扑和转发逻辑,以及如何控制可能的大量的ovs虚拟交换机和流表;
- 二是数据面流表设计,好的流表设计可以有效减少流表数量,很好的扩展功能,方便维护和排障。
通过学习OVN可以:
- 参考其各项功能的流表设计;
- 参考其控制面设计,ovn控制面使用ovsdb协议,只有在计算节点上才会使用openflow协议,避免了openflow协议的性能问题;
使用OVN的问题记录:
- OVN实现比较复杂,后期学习和维护成本较高,不支持插件,自研需求需要修改源代码;
- 不支持跨主机的underlay方案,如vlan,但kube-ovn都已经支持;
- 对一些网络服务的管理,如LB(OVN自带最基本的三四层LB)、动态路由协议、动态DHCP等,未集成在系统内,需要额外实现;
- OVN的方案和我司目前使用Linux Bridge的方案差别较大,直接使用在软件上改动较大。