《深入理解OpenStack Neutron》

举报
华章计算机 发表于 2019/05/29 22:04:22 2019/05/29
【摘要】 本书摘自《深入理解OpenStack Neutron》一作者是李宗标。

云计算与虚拟化技术丛书


深入理解OpenStack Neutron


李宗标 著

深入理解OpenStack Neutron 立.jpg

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

前 言

第1章 Neutron概述  1

1.1 Neutron的由来  1

1.2 Neutron的特性与应用  3

1.2.1 基于OpenStack的应用  4

1.2.2 基于SDN的应用  6

1.3 Neutron的扩展能力  8

1.4 本章小结  9

第2章 Linux虚拟网络基础  11

2.1 tap  11

2.2 namespace  13

2.3 veth pair  16

2.4 Bridge  17

2.5 Router  19

2.6 tun  21

2.7 iptables  24

2.7.1 NAT  27

2.7.2 Firewall  30

2.7.3 mangle  32

2.8 本章小结  32

第3章 Neutron的网络实现模型  34

3.1 Neutron的三类节点  34

3.2 计算节点的实现模型  35

3.2.1 VLAN实现模型  37

3.2.2 VXLAN实现模型  41

3.2.3 GRE实现模型  44

3.2.4 计算节点的实现模型小结  45

3.3 网络节点的实现模型  46

3.4 控制节点的实现模型  49

3.5 本章小结  49

第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


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200