《深入理解OpenStack Neutron》
云计算与虚拟化技术丛书
深入理解OpenStack Neutron
李宗标 著
Foreword序
自从我在OpenStack香港峰会做了“深入探索Neutron”的主题分享后,很少看见有从业者如此专心研究Neutron代码并且整理和分享出来。于是我一看到样章便欣然答应审稿,并索要了全文稿件阅读。正值国庆并中秋假期,本是出去游玩的计划也取消了,不但免了外面喧嚣、拥堵之苦,还饱尝了稿内流畅、风趣之美,值!
作者不是简单地罗列Neutron代码,而是从头到尾都有自己的总结和理解。细致的图文解说令人记忆深刻。Neutron Ocata版代码近乎30万行,要想透彻掌握,除了扎实的Python语言知识技能、丰富的网络领域知识,还要有铁杵磨成针的信念和毅力、为公也为己的开源分享精神、踏实不轻浮的从业素质。从本书来看,作者在这些方面都有比较深的造诣,值得本人学习。
虽然此书只讲述了Neutron社区实现版本中基本的二层和三层部分,但是脉络清晰,行文循序渐进。阅读本书,建议读者先安装好OpenStack环境,有了基本的Neutron网络操作体验后,下载好源代码,准备好UML画图工具,从第1章开始一直读到最后。读完之后,如果读者能自己看着源代码把各种功能的UML相关图整理出来,本书的目的就达到一半了。“师傅领进门,修行在个人”,我想获取知识,自我成长的道理都是如此。
学习Neutron的另一个关键是不要有固定模式。Neutron的核心是API以及背后的资源模型,社区实现版本可以作为参考,因为我们在给客户实施部署时,可能要换成其他厂商的实现版本。在深知Neutron的内涵之后,提供出灵活多变,适应客户需求的虚拟网络解决方案才是我们的目的。也只有深知内涵,才能有变化,我想这也是本书“深入理解”几个字的内在含义。所以读完此书,不要停止,继续挖掘Neutron虚拟网络的背后逻辑、问题和可变部分,这样才能达到“应用自如,万变不离其宗”的境界。
Neutron定义了一组云计算中使用的网络模型,其后面实现可以是实在的网络硬件,也可以是虚拟的网络功能(网元)。虚虚实实,实中有虚,虚中有实,能根据客户的现实环境进行虚实结合,然后对Neutron进行定制化的部署甚至实现,是我对我们公司Neutron从业人员的要求。我想这个要求和本书作者对Neutron源码进行深入分析的目的是一致的。
总之,这本《深入理解OpenStack Neutron》既有对Neutron虚拟网络背后的网络原理方面的阐述,也有对Neutron的数据模型、启动过程、消息处理机制和经典API函数处理的源码分析。语言网络化,风趣而又流畅;知识通俗化,深刻又易懂。相信此书能帮助读者进一步掌握Neutron虚拟网络,为以后的实践打下扎实的基础。
九州云CTO 龚永生
2017年10月 中秋夜
Preface前 言
为什么写作本书
2016年1月16号,我在微信公众号(标哥说天下)发表了Neutron系列的第一篇文章,当时计划是半年写完,没想到写了一年半。也许是由于冲动吧,那天我决定写一系列有关Neutron的文章。
手里拎个锤子,认为满世界都是钉子,这是一种要命的思维逻辑。写Neutron系列,最初的原因,不是因为需要用它做什么,而是想要说明它不能做什么。这对于从事云计算的人来说,可能根本就不是问题,因为Neutron的适用范围也恰好在他们的工作范围之内,没有逾越半步。
对于那些从事非云计算行业,却又与Neutron有着千丝万缕的联系的人来说,这可能也不是问题。但是如果领导与“专家”太多,这可能就是问题了。
然而在写作的过程中,我逐步放弃了想说明“Neutron能做什么,不能做什么”的想法,慢慢改变为现在的思路:努力描述Neutron原本是什么!
本书首先从Linux虚拟网络知识讲起,步步推进,最后深入到Neutron的代码。当剥开Neutron代码的面纱以后,Linux虚拟网络既是构建Neutron网络的基础,也是构建Neutron代码的基础。Neutron的代码写到最后,不过是调用Linux的命令行而已(也包括调用OVS的命令行)。
这么说,当然对Neutron不公平,调用命令行只是Neutron代码的最后一步,在这之前,Neutron还需知道调用什么命令行。这不是是否熟练掌握各种命令行的问题,而是能否正确分配逻辑资源的问题。举个最简单的例子,为一个端口配置一个IP地址,在调用命令行之前,Neutron需要通过各种机制和算法为这个端口分配一个正确的IP地址。
Neutron不仅需要具备分配逻辑资源的机制,还需要创建相应的虚拟网元(物理资源),并将这些虚拟网元正确地连接和配置,构建成正确的网络。Neutron所能支持的二、三层网络特性,不仅体现在它的代码中,也体现在它的资源模型中,并且以RESTful接口的形式对外提供服务。
如何阅读本书
总体来说,Neutron并不神秘,也不深奥,却比较庞大。如果你对Neutron的代码细节比较感兴趣,本书会有大量的篇幅进行代码剖析。如果你仅仅想了解Neutron的基本原理,本书的前几章也正是这个目的,希望能对你有些帮助。
Neutron是一个关于网络的系统,本书第1章介绍了一些背景知识。在阅读本书之前,读者首先得具备一定的网络知识,也正是出于这样的目的,第2章介绍了Linux的虚拟网络知识。限于主题和篇幅的原因,本书没法再过多介绍其他内容。本书假设你对基本的TCP/IP协议、VXLAN、OVS等有一定的了解。当然,如果要阅读代码剖析那些章节,那么还需要对Python有一定的了解,因为Python的编程语言就是Python。第3章讲述了Neutron的实现模型。第4章讲述的是Neutron的资源模型。第5章讲述了Neutron的基本架构,以及架构中所涉及的Web机制、通信机制、并发机制等,这些都是Neutron的基本原理。第6章主要讲述Neutron如何启动Web Server,并通过WSGI Pipeline机制调用合适的 WSGI Application,以及WSGI Application如何巧妙地寻址到正确的Plugin。第7章主要讲述Plugin 如何如何处理Neutron的RESTful请求,如何进行逻辑资源分配,如何调用Agent。第8章主要讲述Agent如何配置(虚拟)网元,以构建Neutron网络。
但是无论多么细节的代码剖析,也没法做到将Neutron的每一行代码都讲述到。所以本书在每一个代码剖析的章节,尽可能地给出相关的类图和顺序图。如果你对Neutron代码还不是很熟悉,笔者强烈建议,你一边看着代码,一边看着本书,两相对照阅读,并且自己尝试着画出这些类图和顺序图,这将起到事半功倍的作用。
Neutron代码下载的网址是:https://releases.openstack.org/,截至笔者定稿时的最新版本是Ocata。笔者还建议你阅读这个网址的内容:https://developer.openstack.org/api-ref/networking/v2/
index.html,它讲述了Neutron的RESTful API,是非常重要的参考资料。
致谢
在写作的过程中,遇到了很多难题,幸亏得到陈苍老师许多热情而又无私的帮助,我才能越过一道道坎。陈苍老师是我的同事,安静、幽默、智慧。
风河的杨斌先生同样给予了我很多无私的帮助,他纠正了我原稿中的很多错误。
黄朝义、胡玉刚两位先生也很耐心地解答了我很多问题。我还向Oslo项目的PTL郭先生请教了有关Oslo的问题。
OpenStack资深专家(人称大师兄)、九州云CTO龚永生先生牺牲宝贵的国庆中秋双节假期,为本书审稿并作序,深感荣幸和不安。
感谢机械工业出版社华章公司的高婧雅的指导与帮助,我才能将这一系列文章集结付梓。
这一路走来,我自己受益良多,学习了很多知识,认识了很多朋友!微信里,大家给我留言,跟我交流,给我信心。欢迎大家与我交流或者指正我的错误,可以关注我的微信公众号“标哥说天下”(bgstx001)。
感谢你的支持、帮助和鼓励,我才能坚持到今天!
目 录Contents
序
前 言
第4章 Neutron的资源模型 51
4.1 Neutron资源的租户隔离 51
4.1.1 Neutron语境下租户隔离的
含义 52
4.1.2 Neutron在租户隔离中的无限
责任和有限责任 53
4.1.3 Neutron的租户隔离实现方案 54
4.1.4 租户隔离小结 56
4.2 Network 57
4.2.1 运营商网络和租户网络 58
4.2.2 物理网络 61
4.2.3 Network小结 64
4.3 Trunk Networking 65
4.3.1 Bridge的VLAN接口模式 65
4.3.2 VLAN aware VM与Trunk
Networking 69
4.3.3 Trunk Networking小结 78
4.4 Subnet 79
4.4.1 IP核心网络服务 80
4.4.2 Subnet资源池 81
4.5 Port 83
4.6 Router 86
4.6.1 Router的外部网关 88
4.6.2 增加Router接口 89
4.6.3 Router的路由表 91
4.6.4 Floating IP 92
4.6.5 Router小结 94
4.7 Multi-Segments 95
4.7.1 Multi-Segments的困惑 96
4.7.2 Multi-Segments的几个应用
场景 98
4.8 BGP VPN 102
4.8.1 BGP VPN的使用场景 103
4.8.2 BGP VPN的实现模型 104
4.8.3 BGP VPN的资源模型 105
4.9 本章小结 109
第5章 Neutron架构分析 112
5.1 Neutron的Web框架与规范 115
5.2 Neutron的消息通信机制 117
5.2.1 AMQP基本概念 118
5.2.2 AMQP的消息转发 118
5.3 Neutron的并发机制 122
5.3.1 协程概述 122
5.3.2 Neutron中的协程 124
5.4 通用库Oslo 131
5.5 本章小结 131
第6章 Neutron的服务 132
6.1 Neutron启动一个Web Server 133
6.1.1 Web Server的启动过程 133
6.1.2 Web Server启动过程中的
关键参数 135
6.1.3 Web Server的进程与协程 138
6.1.4 小结 142
6.2 加载WSGI Application 142
6.2.1 api-paste.ini对应的WSGI
Application 144
6.2.2 neutronapi_v2_0 section 146
6.3 Core Service API(RESTful)的
处理流程 148
6.3.1 Core Service的WSGI
Application 149
6.3.2 Core Service处理HTPP Request的基本流程 149
6.3.3 Core Service处理HTTP Request的函数映射 153
6.3.4 小结 162
6.4 Extension Service API(RESTful)的处理流程 164
6.4.1 Extension Service的类图与加载 164
6.4.2 Extension Service的WSGI Application 167
6.4.3 Extension Service处理HTTP Request的基本流程 169
6.4.4 Extension Service处理HTTP Request的函数映射 171
6.4.5 小结 176
6.5 Plugin的加载 178
6.5.1 Core Service Plugin的加载 179
6.5.2 Extension Services Plugin的加载 180
6.6 RPC Consumer的创建 181
6.6.1 Neutron Plugin创建RPC Consumer的接口 182
6.6.2 Neutron Server启动RPC Consumer 183
6.7 本章小结 187
第7章 Neutron的插件 190
7.1 核心插件 191
7.1.1 ML2插件简介 193
7.1.2 类型驱动 193
7.1.3 机制驱动 202
7.1.4 ML2插件create_network函数剖析 224
7.1.5 ML2插件create_subnet函数剖析 229
7.1.6 ML2插件create_port函数剖析 240
7.2 业务插件 249
7.2.1 Router Plugin的create_router函数分析 250
7.2.2 Router Plugin的add_router_interface代码分析 257
7.3 Neutron Plugin的消息发布和订阅 260
7.3.1 Neutron Plugin中的Callbacks Module机制 261
7.3.2 Neutron Plugin中的RPC机制 265
7.4 本章小结 266
第8章 Neutron的代理 268
8.1 OVS Agent 270
8.1.1 三类关键的Bridge 270
8.1.2 内外VID的转换 288
8.1.3 OVS Agent代码分析 295
8.1.4 OVS Agent小结 309
8.2 L3 Agent 311
8.2.1 class OVSInterfaceDriver分析 312
8.2.2 class RouterInfo分析 317
8.2.3 L3 Agent代码分析 326
8.2.4 L3 Agent小结 351
8.3 本章小结 352
- 点赞
- 收藏
- 关注作者
评论(0)