OVN实战---《A Primer on OVN》翻译
overview
在本文中,我们将在三个host之间创建一个简单的二层overlay network。首先,我们来简单看一下,整个系统是怎么工作的。OVN基于分布式的control plane,其中各个组件分布在network的各个节点中。在OVN中包含了如下两种角色:
- OVN Central --- 现在该角色仅包含一个节点,该节点用于处理和cloud management platform等其他外部资源进行集成的API。并且在该节点中包含了OVN northbound database,用于存储追踪上层的逻辑结构,例如logical switches/port,以及OVN southbound database用于确定如何将ovn-northdb中的逻辑结构映射到物理世界中
- OVN Host -- 该角色存在于所有节点中,其中包含了virtual networking end points,例如虚拟机。OVN Host中包含一个"chassis controller",它往上和ovn-soutdb连接,因为其中包含了权威的物理网络信息,向下作为一个openflow controller和ovs连接。
The Lab
OVN实验由三个连接到同一个子网(10.127.0.0/25)的ubuntu 17.04 server组成。每台主机以及它们的IP地址如下所示:
- ubuntu1 10.127.0.2 --- 作为OVN Central
- ubuntu2 10.127.0.3 --- 作为OVN Host
- ubuntu3 10.127.0.4 --- 作为OVN Host
为了实验的简单起见,我们将通过创建ovs internal interfaces,并且将它们加入一个network namespace来模拟虚拟机负载。namespace会保证我们的OVN overlay network和lab network完全隔离。
Installing Open vSwitch
和原文自行编译安装ovs不同的是,为了简单起见,我们使用了ubuntu 17.04,它的源里面已经包含了ovs 2.6.1,因此我们直接用apt-get安装即可,具体指令如下:
sudo apt-get install openvswitch-common openvswitch-switch // OVN Central执行如下指令
sudo apt-get install ovn-common ovn-central ovn-host // OVN Host执行如下指令
sudo apt-get install ovn-common ovn-host
Creating the Integration Bridge
OVN会负责管理一个由ovs创建的bridge,所有希望加入OVN logical switch的设备都必须加入到该bridge中。尽管我们可以给该bridge取任意名字,但是一般我们都将它命名为"br-int"。首先我们要确认该bridge是否存在,如果有必要的话,对它进行创建。
在ubuntu2/ubuntu3执行如下命令
ovs-vsctl list-br
如果没有在输出中看到"br-int",那么我们必须手动创建该bridge。记住,该integration bridge必须存在在所有包含虚拟机的节点中。
ovs-vsctl add-br br-int -- set Bridge br-int fail-mode=secure
ovs-vsctl list-br
其中的"fail-mode=secure"是一个安全特性,它用于配置bridge,让它默认丢弃所有的流量。这非常重要,因为我们不想要integration bridge的租户能相互沟通,如果我们的flow因为一些原因被删除了或者我们在OVN controller启动前就将租户插入到了bridge中。
Connecting the Chassis Controllers to the Central Controller
接下来我们要做的是将ubuntu2/ubuntu3中的chassis controllers和ubuntu1中的central controller连接起来。
ubuntu2:
ovs-vsctl set open . external-ids:ovn-remote=tcp:10.127.0.2:6642
ovs-vsctl set open . external-ids:ovn-encap-type=geneve
ovs-vsctl set open . external-ids:ovn-encap-ip=10.127.0.3
ubuntu3:
ovs-vsctl set open . external-ids:ovn-remote=tcp:10.127.0.2:6642
ovs-vsctl set open . external-ids:ovn-encap-type=geneve
ovs-vsctl set open . external-ids:ovn-encap-ip=10.127.0.4
上述命令会触发每个节点上的OVN chassis controller和ubuntu1中的OVN Central host进行连接。并且我们指定了,我们的overlay network使用geneve协议来加密数据平面流量。
我们可以使用netstat命令来确定连接是否完成。在ubuntu3的输出应当如下所示:
root@ubuntu3:~# netstat -antp | grep 10.127.0.2
tcp 0 0 10.127.0.4:39256 10.127.0.2:6642 ESTABLISHED 3072/ovn-controller
Defining the Logical Network
下图展示了lab中创建的各个OVN逻辑组件
首先我们定义一个名为"ls1"的OVN logical switch以及和它相连的logical port。在ubuntu1执行如下命令:
# create the logical switch
ovn-nbctl ls-add ls1 # create logical port
ovn-nbctl lsp-add ls1 ls1-vm1
ovn-nbctl lsp-set-addresses ls1-vm1 02:ac:10:ff:00:11
ovn-nbctl lsp-set-port-security ls1-vm1 02:ac:10:ff:00:11 # create logical port
ovn-nbctl lsp-add ls1 ls1-vm2
ovn-nbctl lsp-set-addresses ls1-vm2 02:ac:10:ff:00:22
ovn-nbctl lsp-set-port-security ls1-vm2 02:ac:10:ff:00:22 ovn-nbctl show
在每一个命令集中我们都创建了一个命名唯一的logical port。通常这些logical port都会以UUID进行命名,从而确保唯一性,但是我们使用了对人类更加友好的命名方式。同时我们还定义了和每个logical port相关联的mac地址,而且我们还更近一步,利用port security对logical port进行了锁定(从而从该logical port只能使用我们提供的mac地址)。
Addint "Fake" Virtual Machines
接下来我们将创建用于连接到logical switch的"虚拟机"。如上文所述,我们将使用OVS internal ports和network namespace来模拟虚拟机,并且使用172.16.255.0/24来作为我们的logical switch的地址空间
ubuntu2:
ip netns add vm1
ovs-vsctl add-port br-int vm1 -- set interface vm1 type=internal
ip link set vm1 netns vm1
ip netns exec vm1 ip link set vm1 address 02:ac:10:ff:00:11
ip netns exec vm1 ip addr add 172.16.255.11/24 dev vm1
ip netns exec vm1 ip link set vm1 up
ovs-vsctl set Interface vm1 external_ids:iface-id=ls1-vm1 ip netns exec vm1 ip addr show
ubuntu3:
ip netns add vm2
ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal
ip link set vm2 netns vm2
ip netns exec vm2 ip link set vm2 address 02:ac:10:ff:00:22
ip netns exec vm2 ip addr add 172.16.255.22/24 dev vm2
ip netns exec vm2 ip link set vm2 up
ovs-vsctl set Interface vm2 external_ids:iface-id=ls1-vm2 ip netns exec vm2 ip addr show
如果你对namespace或者ovs不熟悉,那么上述命令可能显得有点让人疑惑。简单地说,我们创建了一个network namespace作为我们的fake VM,创建了一个internal OVS port,并将该port加入到namespace中,通过netns exec命令对其进行配置,包括IP,mac地址等,最后创建一个OVS interface,其中external_id设置为我们在OVN中定义的logical port的ID。这最后一步触发了OVS通知OVN,一个新的logical port已将上线了。OVN在接到通知后,会将指令传输给对应的节点的logical chassis controller,同时chassis controller会将network flows压入OVS。
需要注意的是,在这里我显式设置了这些interface的mac地址来和我们在OVN logical switch中的配置相匹配。这非常重要,因为如果mac地址不匹配的话,logical network将不能工作。事实上,我故意把工作流搞反了一点。其实你并不会去改变虚拟机的mac地址,而是将一个已经存在的,已知的mac存入OVN/OVS。而我这样做的目的是为了让mac/IP更加容易演示。
Verifying and Testing Connectivity
在ubuntu1中我们可以通过ovn-sbctl来确定logical network configuration。输出如下所示:
root@ubuntu1:~# ovn-sbctl show
Chassis "239f2c28-90ff-468f-a701-655585c630bf"
hostname: "ubuntu3"
Encap geneve
ip: "10.127.0.4"
options: {csum="true"}
Port_Binding "ls1-vm2"
Chassis "517d558e-158a-4cb2-8870-283e9d39685e"
hostname: "ubuntu2"
Encap geneve
ip: "10.127.0.3"
options: {csum="true"}
Port_Binding "ls1-vm1"
注意每个OVN Host相关联的port bindings。为了测试连接,我们在vm1这个namespace中启动一个ping命令。输出结果如下所示:
root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.22
PING 172.16.255.22 (172.16.255.22) 56(84) bytes of data.
64 bytes from 172.16.255.22: icmp_seq=1 ttl=64 time=1.60 ms
64 bytes from 172.16.255.22: icmp_seq=2 ttl=64 time=0.638 ms
64 bytes from 172.16.255.22: icmp_seq=3 ttl=64 time=0.344 ms
Adding a 3rd "VM" and Migrating It
接着我们加入第三个"虚拟机",并且模拟虚拟机在各个节点的迁移。首先,通过ovn-nbclt在ubuntu1中定义logical port
ovn-nbctl lsp-add ls1 ls1-vm3
ovn-nbctl lsp-set-addresses ls1-vm3 02:ac:10:ff:00:33
ovn-nbctl lsp-set-port-security ls1-vm3 02:ac:10:ff:00:33 ovn-nbctl show
接着,在ubuntu2上为该虚拟机创建interface
ip netns add vm3
ovs-vsctl add-port br-int vm3 -- set interface vm3 type=internal
ip link set vm3 netns vm3
ip netns exec vm3 ip link set vm3 address 02:ac:10:ff:00:33
ip netns exec vm3 ip addr add 172.16.255.33/24 dev vm3
ip netns exec vm3 ip link set vm3 up
ovs-vsctl set Interface vm3 external_ids:iface-id=ls1-vm3 ip netns exec vm3 ip addr show
测试vm3的连通性
root@ubuntu2:~# ip netns exec vm3 ping 172.16.255.22
PING 172.16.255.22 (172.16.255.22) 56(84) bytes of data.
64 bytes from 172.16.255.22: icmp_seq=1 ttl=64 time=2.04 ms
64 bytes from 172.16.255.22: icmp_seq=2 ttl=64 time=0.337 ms
64 bytes from 172.16.255.22: icmp_seq=3 ttl=64 time=0.536 ms
注意OVN southbound DB中的配置。我们可以看到ubuntu2由两个已经注册的port bindings
root@ubuntu1:~# ovn-sbctl show
Chassis "239f2c28-90ff-468f-a701-655585c630bf"
hostname: "ubuntu3"
Encap geneve
ip: "10.127.0.4"
options: {csum="true"}
Port_Binding "ls1-vm2"
Chassis "517d558e-158a-4cb2-8870-283e9d39685e"
hostname: "ubuntu2"
Encap geneve
ip: "10.127.0.3"
options: {csum="true"}
Port_Binding "ls1-vm3"
Port_Binding "ls1-vm1"
为了模拟vm3的迁移,我们先在ubuntu2中删除"vm3"这个namespace,并且将它的port从br-int上移除,最后在ubuntu3上重新进行创建。
ubuntu2:
ip netns del vm3
ovs-vsctl --if-exists --with-iface del-port br-int vm3
ovs-vsctl list-ports br-int
ubuntu3:
ip netns add vm3
ovs-vsctl add-port br-int vm3 -- set interface vm3 type=internal
ip link set vm3 netns vm3
ip netns exec vm3 ip link set vm3 address 02:ac:10:ff:00:33
ip netns exec vm3 ip addr add 172.16.255.33/24 dev vm3
ip netns exec vm3 ip link set vm3 up
ovs-vsctl set Interface vm3 external_ids:iface-id=ls1-vm3
测试连接:
root@ubuntu3:~# ip netns exec vm3 ping 172.16.255.11
PING 172.16.255.11 (172.16.255.11) 56(84) bytes of data.
64 bytes from 172.16.255.11: icmp_seq=1 ttl=64 time=1.44 ms
64 bytes from 172.16.255.11: icmp_seq=2 ttl=64 time=0.407 ms
64 bytes from 172.16.255.11: icmp_seq=3 ttl=64 time=0.395 ms
再一次,我们在ubuntu1中观察OVN southbound DB configuration。我们可以看到port binding已经发生了改变。
root@ubuntu1:~# ovn-sbctl show
Chassis "239f2c28-90ff-468f-a701-655585c630bf"
hostname: "ubuntu3"
Encap geneve
ip: "10.127.0.4"
options: {csum="true"}
Port_Binding "ls1-vm2"
Port_Binding "ls1-vm3"
Chassis "517d558e-158a-4cb2-8870-283e9d39685e"
hostname: "ubuntu2"
Encap geneve
ip: "10.127.0.3"
options: {csum="true"}
Port_Binding "ls1-vm1"
Cleaning Up
在退出前,我们先对环境进行清理
ubuntu1:
# delete the logical switch and its ports
ovn-nbctl ls-del ls1
ubuntu2:
# delete vm1
ip netns del vm1
ovs-vsctl --if-exists --with-iface del-port br-int vm1
ubuntu3:
# delete vm2 and vm3
ip netns del vm2
ovs-vsctl --if-exists --with-iface del-port br-int vm2 ip netns del vm3
ovs-vsctl --if-exists --with-iface del-port br-int vm3
Final Words
我们可以看到,使用OVN创建一个二层的overlay network是相对比较直接的。在下一篇文章中,我将通过介绍OVN logical router来讨论OVN 三层网络
OVN实战---《A Primer on OVN》翻译的更多相关文章
- OVN实战---《The OVN Load Balancer》翻译
Overview 基于前面几篇文章的基础之上,我们接下来将要探索OVN中的load balancingz这一特性.但是在开始之前,我们先来回顾一下上一个lab中创建好的拓扑结构. The lab ne ...
- OVN实战---《OVN and Containers》翻译
Overview 在本篇文章中,我们要讨论的是OVN和容器的集成.到本次实验中,我们将会创建一个包含有一对容器的“虚拟机”,这些容器会直接和OVN logical switch相连,并且可以供逻辑网络 ...
- OVN实战---《The OVN Gateway Router》翻译
Overview 在本文中我将在前文的基础上添加一个OVN gateway router.gateway router将使得lab network能访问我们的overlay network The l ...
- OVN实战---《An Introduction to OVN Routing》翻译
Overview 在前面一篇文章的基础上,现在我将通过OVN创建一个基础的三层网络.创建的最终结果将是一对logical switches通过一个logical router相连.另外,该路由器会通过 ...
- 《OVN Logical Flows and ovn-trace》翻译
在本篇文章中,我将解释什么是Logical Flow以及如何使用ovn-trace去更好地理解它们.同时,我也会用一些例子来解释,为什么使用Logical Flow这种抽象模型能让新特性的添加变得出乎 ...
- Spring in action(Spring实战) 第四版中文翻译
第一部分 Spring核心 Spring提供了非常多功能,可是全部这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包含: Spri ...
- 如何借助 OVN 来提高 OVS 在云计算环境中的性能
众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...
- ovs ovn 学习资料
0.A Primer on OVN http://blog.spinhirne.com/2016/09/a-primer-on-ovn.html 1.Open Virtual Networking W ...
- OVN架构
原文地址 OVN架构 1.简介 OVN,即Open Virtual Network,是一个支持虚拟网络抽象的系统. OVN补充了OVS的现有功能,增加了对虚拟网络抽象的原生(native)支持,比如虚 ...
随机推荐
- [iOS]delegate和protocol
转自:http://haoxiang.org/2011/08/ios-delegate-and-protocol/ 今天上班和同事讨论工程怎么组织的时候涉及到这个话题.iOS开发上对delegate使 ...
- 安全DNS
国内首家云安全DNS:(114DNS)114.114.114.114114.114.115.115 将 DNS 地址设为114.114.114.119 和 114.114.115.119 ,拦截钓鱼病 ...
- MapReduce实战(五)实现关联查询
需求: 利用MapReduce程序,实现SQL语句中的join关联查询. 订单数据表order: id date pid amount 1001 20150710 P0001 2 1002 20150 ...
- windows下GVIM的配置(vimrc)
学习python时想要在gvim中配置python的编译环境,网上找到一个比较好用的vimrc配置,保存下来以备下次有需要. set encoding=utf-8 set termencoding=u ...
- CVPR(IEEE Conference on Computer Vision and Pattern Recognition)
论文提交时间:11月份中旬左右会议时间:7月份左右 CVPR 2017: 网址:http://cvpr2017.thecvf.com/ 接受论文数:782
- 05 Java图形化界面设计——布局管理器之GridLayout(网格布局)
网格布局特点: l 使容器中的各组件呈M行×N列的网格状分布. l 网格每列宽度相同,等于容器的宽度除以网格的列数. l 网格每行高度相同,等于容器的高度除以网格的行数. l 各组件的排列方式 ...
- html herf onclick
html中a标签中的onclick和href的使用 onclick 链接的 onclick 事件被先执行,其次是 href 属性下的动作(页面跳转,或 javascript 伪链接): 假设链接中同时 ...
- ASP.NET动态增加HTML元素的方法实例小结
本文实例讲述了ASP.NET动态增加HTML元素的方法.分享给大家供大家参考,具体如下: 在使用asp.net进行web开发的时候页面中的<head></head>中的信息可以 ...
- 监视EF生成SQL的方法(log , SqlServerProfile)
大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们 无法控制sql的生成策略,所以必须不要让自 ...
- Request的属性和防止图片被盗链
Request.AppRelativeCurrentExecutionFilePath,获取当前执行请求相对于应用根目录的虚拟路径,以~开头,比如"~/default.ashx" ...