热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

OpenStackQuantum(Grizzly)quantumagent(OVS)工作流介绍

继上一篇《Quantum(Grizzly)L3agent工作流》,本篇介绍采用OVS(gre)实现的quantumagent工作流,系统环境参见上一篇博客。因为agent主要的工作是操作vSwitch,所以本篇的命令居多,关于OpenvSwitch的命令使用,请参考官网。以下是我的环境中的虚拟机和网

继上一篇《Quantum(Grizzly) L3 agent工作流》,本篇介绍采用OVS(gre)实现的quantum agent工作流,系统环境参见上一篇博客。

因为agent主要的工作是操作vSwitch,所以本篇的命令居多,关于OpenvSwitch的命令使用,请参考官网。

以下是我的环境中的虚拟机和网络信息,这要关注一下port的id,因为后面的命令都是基于port的信息来做的。
root@openstack:~# nova list

+--------------------------------------+--------+--------+-------------------------------------+
| ID                                   |Name   | Status | Networks                            |
+--------------------------------------+--------+--------+-------------------------------------+
| 50ab650a-289c-4b84-b9f6-9e6c93516a4b | cirros | ACTIVE | demo_net1=10.1.1.13,182.168.61.250 |
+--------------------------------------+--------+--------+-------------------------------------+
root@openstack:~# quantum net-list
+--------------------------------------+---------------+------------------------------------------------------+
| id                                   |name          | subnets                                              |
+--------------------------------------+---------------+------------------------------------------------------+
| c4d8b48b-6ff7-43b6-a203-8f1192a16f07 | demo_net1     | 1e18074b-2ad1-4306-a4f7-c39e6762295610.1.1.0/24     |
| e7bb2f41-4f2a-4dbf-a701-7630cfd72de5 | external_net1 |3d6037f5-74e9-4f9f-9c07-3cd8b7b69a46 182.168.61.0/24 |
+--------------------------------------+---------------+------------------------------------------------------+
root@openstack:~# quantum port-list
+--------------------------------------+------+-------------------+---------------------------------------------------------------------------------------+
| id                                   |name | mac_address       | fixed_ips                                                                            |
+--------------------------------------+------+-------------------+---------------------------------------------------------------------------------------+
| 0e2dfa90-d3c8-4938-b35f-e85ed71d0270 |     | fa:16:3e:2a:6e:1c | {"subnet_id":"1e18074b-2ad1-4306-a4f7-c39e67622956", "ip_address":"10.1.1.1"}       |
| 1e6720f1-8c3f-46c5-8313-72b0753037f8 |     | fa:16:3e:30:de:88 | {"subnet_id":"3d6037f5-74e9-4f9f-9c07-3cd8b7b69a46", "ip_address":"182.168.61.249"} |
| 3f1f785c-7015-46c4-95ba-9efd6cd323d0 |     | fa:16:3e:b6:fc:21 | {"subnet_id":"1e18074b-2ad1-4306-a4f7-c39e67622956", "ip_address":"10.1.1.12"}      |
| 45772766-6c9e-431c-9c04-0365d91b6ae4 |     | fa:16:3e:73:a2:59 | {"subnet_id":"3d6037f5-74e9-4f9f-9c07-3cd8b7b69a46", "ip_address":"182.168.61.250"} |
| 99f91280-a060-442e-90b0-d8324e50efc8 |     | fa:16:3e:02:dd:79 | {"subnet_id":"1e18074b-2ad1-4306-a4f7-c39e67622956", "ip_address":"10.1.1.13"}      |
+--------------------------------------+------+-------------------+---------------------------------------------------------------------------------------+
root@openstack:~# quantum router-list
+--------------------------------------+--------------+--------------------------------------------------------+
| id                                   |name         | external_gateway_info                                  |
+--------------------------------------+--------------+--------------------------------------------------------+
| 0a23bd10-932e-435a-a673-0e508f0d56b9 | demo_router1 |{"network_id": "e7bb2f41-4f2a-4dbf-a701-7630cfd72de5"} |
+--------------------------------------+--------------+--------------------------------------------------------+

与agent工作相关的两个vSwitch分别是br-int和br-tun,所以初始化主要是围绕这两个设备进行。

先删除br-int上的patch-tun端口,同时删除所有的flow:

ovs-vsctl --timeout=2 -- --if-exists del-port br-int patch-tun
ovs-ofctl del-flows br-int
ovs-ofctl add-flow br-int hard_timeout=0,idle_timeout=0,priority=1,actiOns=normal
然后是对br-tun的处理以及关联br-int和br-tun:
ovs-vsctl --timeout=2 -- --if-exists del-br br-tun
ovs-vsctl --timeout=2 add-br br-tun
ovs-vsctl --timeout=2 add-port br-int patch-tun
ovs-vsctl --timeout=2 set Interface patch-tun type=patch
ovs-vsctl --timeout=2 set Interface patch-tun options:peer=patch-int
root@openstack:~# ovs-vsctl --timeout=2 get Interface patch-tun ofport
6
ovs-vsctl --timeout=2 add-port br-tun patch-int
ovs-vsctl --timeout=2 set Interface patch-int type=patch
ovs-vsctl --timeout=2 set Interface patch-int options:peer=patch-tun
root@openstack:~# ovs-vsctl --timeout=2 get Interface patch-int ofport
1
ovs-ofctl del-flows br-tun
ovs-ofctl add-flow br-tun hard_timeout=0,idle_timeout=0,priority=1,actiOns=drop
3.1. tunnel同步

因为我采用的是gre模式,所以在循环任务执行前,会向plugin注册本机tunnel,同时会收到plugin推送来的系统中所有tunnel的信息,对每一个tunnel(本地tunnel除外)有如下操作(因为我的系统中只有一个节点,所以不涉及下面的命令,这里列出是为了说明gre类型agent的机制):

ovs-vsctl --timeout=2 add-port br-tun 
ovs-vsctl --timeout=2 set Interface  type=gre
ovs-vsctl --timeout=2 set Interface  options:remote_ip=
ovs-vsctl --timeout=2 set Interface  options:in_key=flow
ovs-vsctl --timeout=2 set Interface  options:out_key=flow
这样,系统中的不同节点之间就能通过gre通道互通。 3.2. 获取br-int上的设备

循环任务开始,对于刚启动的agent来说,需要处理br-int上的每一个端口,所以需要先列出br-int上的端口,以下是我的环境中的命令及输出:
root@openstack:~# ovs-vsctl --timeout=2 list-ports br-int
patch-tun
qr-0e2dfa90-d3
qvo99f91280-a0
tap3f1f785c-70
上面的patch-tun是agent初始化时在br-int上创建;qr-0e2dfa90-d3是虚拟机的网关设备;qvo99f91280-a0是与虚拟机网卡相连的设备;tap3f1f785c-70是dhcp设备;

查询每一个设备的信息:

root@openstack:~# ovs-vsctl --timeout=2 get Interface patch-tun external_ids
{}
root@openstack:~# ovs-vsctl --timeout=2 get Interface qr-0e2dfa90-d3 external_ids
{attached-mac="fa:16:3e:2a:6e:1c",iface-id="0e2dfa90-d3c8-4938-b35f-e85ed71d0270", iface-status=active}
root@openstack:~# ovs-vsctl --timeout=2 get Interface qvo99f91280-a0 external_ids
{attached-mac="fa:16:3e:02:dd:79",iface-id="99f91280-a060-442e-90b0-d8324e50efc8", iface-status=active,vm-uuid="50ab650a-289c-4b84-b9f6-9e6c93516a4b"}
root@openstack:~# ovs-vsctl --timeout=2 get Interface tap3f1f785c-70 external_ids
{attached-mac="fa:16:3e:b6:fc:21",iface-id="3f1f785c-7015-46c4-95ba-9efd6cd323d0", iface-status=active}
注意,上面iface-id中记录了设备对应的port的id。 3.3. 设置安全组规则

本篇博客暂不关注安全组,如对安全组有兴趣,请继续关注我后续的博客,故此步略去。

3.4. 循环处理port

1. 对每一个port循环(由上述iface-id得到port-id),这里先处理第一个port,即port-id=3f1f785c-7015-46c4-95ba-9efd6cd323d0,查询该设备在br-int上的属性:
root@openstack:~# ovs-vsctl --timeout=2 -- --columns=external_ids,name,ofport find Interface external_ids:iface-id="3f1f785c-7015-46c4-95ba-9efd6cd323d0"
external_ids        :{attached-mac="fa:16:3e:b6:fc:21",iface-id="3f1f785c-7015-46c4-95ba-9efd6cd323d0", iface-status=active}
name                : "tap3f1f785c-70"
ofport              : 2

2. 对于port所属的network,需要做下面的操作(若已处理过该network,忽略此步):

ovs-ofctl add-flow br-tun hard_timeout=0,idle_timeout=0,priority=4,in_port=1,dl_vlan=1,actiOns=set_tunnel:2,normal
解释:
in_port:patch-int端口的ofport号,参见上面的命令输出
dl_vlan:系统分配的内部vlan号,用以识别不同的逻辑network
set_tunnel:2:这里的2指plugin分配的tunnel号
ovs-ofctl add-flow br-tun hard_timeout=0,idle_timeout=0,priority=3,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00,tun_id=2,actiOns=mod_vlan_vid:1,output:1
其中的2,1,1分别是plugin分配的tunnel号、系统分配的内部vlan号、patch-int端口的ofport号
3. 对port的设备执行下面命令
ovs-ofctl add-flow br-tun hard_timeout=0,idle_timeout=0,priority=3,dl_dst=fa:16:3e:b6:fc:21,tun_id=2,actiOns=mod_vlan_vid:1,normal
ovs-vsctl --timeout=2 set Port tap3f1f785c-70 tag=1
解释:
tag=1:系统分配的内部vlan号

ovs-ofctl del-flows br-int in_port=2
解释:
in_port=2:tap3f1f785c-70的ofport号

4. 循环执行上述的步骤1和步骤2,处理其他port

root@openstack:~# ovs-vsctl --timeout=2 -- --columns=external_ids,name,ofport find Interface external_ids:iface-id="99f91280-a060-442e-90b0-d8324e50efc8"
external_ids        :{attached-mac="fa:16:3e:02:dd:79", iface-id="99f91280-a060-442e-90b0-d8324e50efc8",iface-status=active, vm-uuid="50ab650a-289c-4b84-b9f6-9e6c93516a4b"}
name                :"qvo99f91280-a0"
ofport              : 5
ovs-ofctl add-flow br-tun hard_timeout=0,idle_timeout=0,priority=3,dl_dst=fa:16:3e:02:dd:79,tun_id=2,actiOns=mod_vlan_vid:1,normal
ovs-vsctl --timeout=2 set Port qvo99f91280-a0 tag=1
ovs-ofctl del-flows br-int in_port=5
root@openstack:~# ovs-vsctl --timeout=2 -- --columns=external_ids,name,ofport find Interface external_ids:iface-id="0e2dfa90-d3c8-4938-b35f-e85ed71d0270"
external_ids        :{attached-mac="fa:16:3e:2a:6e:1c",iface-id="0e2dfa90-d3c8-4938-b35f-e85ed71d0270", iface-status=active}
name                :"qr-0e2dfa90-d3"
ofport              : 1
ovs-ofctl add-flow br-tun hard_timeout=0,idle_timeout=0,priority=3,dl_dst=fa:16:3e:2a:6e:1c,tun_id=2,actiOns=mod_vlan_vid:1,normal
ovs-vsctl --timeout=2 set Port qr-0e2dfa90-d3 tag=1
ovs-ofctl del-flows br-int in_port=1

上面的命令是使用ovs gre模式的命令,而如果使用ovs vlan模式,命令类似,只是操作的不再是br-tun,而是每一个network对应的物理br,下面的几张图应该能清晰的说明问题。

逻辑模型:

物理节点上quantum agent的实现:


推荐阅读
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 本文讨论了前端工程化的准备工作,主要包括性能优化、安全防护和监控等方面需要注意的事项。通过系统的答案,帮助前端开发者更好地进行工程化的准备工作,提升网站的性能、安全性和监控能力。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何修改路由器密码?路由器登录密码和无线密码的修改方法
    本文介绍了修改路由器密码的两种方法:一是修改路由器登录口令,需要进入路由器后台进行操作;二是修改无线连接密码,通过进入路由器后台的无线设置和无线安全设置进行修改。详细步骤包括复位处理、登录路由器后台、选择系统工具、填入用户名和用户密码、保存修改等。 ... [详细]
  • 本文介绍了2019年上半年内蒙古计算机软考考试的报名通知和考试时间。考试报名时间为3月1日至3月23日,考试时间为2019年5月25日。考试分为高级、中级和初级三个级别,涵盖了多个专业资格。报名采取网上报名和网上缴费的方式进行,报考人员可登录内蒙古人事考试信息网进行报名。详细内容请点击查看。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
李2502933835
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有