至此落筆之際,OpenStack 問世幾近 7 年,7 年的時間,對很多項目來說已經足夠走過一個創建發展到沒落的輪回,而對于 OpenStack,7 年的時間仍然遠遠不夠讓我們看到它最終所能夠達到的高度。
從哲學的辯證角度:今天的必然正是由之前一系列的偶然所決定的。2010 年的一個偶然,OpenStack 由 RackSpace 和美國國家航空航天局合作發布,于是隨后的時間里無數公司與個人偶然初識 OpenStack 并深陷其中,而正是這些偶然相聯合,從而決定了會有今天這樣一本書,會有現在寫下的這些話。那么,當您偶然地拿起這本書,偶然地看到這段話,您是否會問自己:這樣的偶然又會導致什么樣的必然?
如果您依然決定繼續這次的偶然之旅,還請您問自己一個問題:我在強迫自己學習OpenStack 么?很希望您能回答不是,但希望與現實往往都有段不小的距離,因為很多時候,我們都是因為各種原因而強迫自己去喜歡的。或許,針對這個問題,最讓人愉悅的回答是“說實話,我學習的熱情從來都沒有低落過。Just for Fun.”
其次,在您繼續之前,面對 OpenStack 這樣一個新生事物,讓人最為惴惴不安的問題或許便是:我該如何更快更好的適應這個全新的世界?人工智能與機器學習領域里研究的一個很重要的問題是“為什么我們小時候有人牽一匹馬告訴我們那是馬,于是之后我們看到其他的馬就知道那是馬了?”。針對這個問題的一個結論是:我們頭腦里形成了一個生物關系的拓撲,我們所認知的各種生物都會放進這個拓撲的結構里,而我們隨著年紀不斷成長的過程就是形成并完善各種各樣或樹形或環形等拓撲的過程,并以此來認知我們所面對的各種新事物。
由此可見,或許我們認知 OpenStack 最快也最為自然的方式就是努力在腦海里形成它的拓撲,并不斷的進行細化。比如作為一個云計算的平臺它包括了哪些功能分別對應哪些項目,各個項目又實現了哪些服務以及功能,這些功能又是以什么樣的方式實現的,等等,對于我們感興趣的項目或服務又可以更為細致的去勾勒它其中的脈絡。就好似我們頭腦里形成的有關一個城市的地圖,它有哪些區,區里又有哪些標志建筑以及街道,對于我們熟悉的地方可以將它的周圍進行放大細化,甚至于一個微不足道的角落。
而對于這個拓撲細化的過程能夠起到有益輔助的是概念空間的勾勒。站在架構設計的角度,軟件從需求進到架構出的全過程中,勾勒描繪概念空間是很重要的一個中間過程。這個階段會形成所需要引入的各種新概念,比如操作系統中的進程、虛擬內存、系統調用等等,它們就類似一個拓撲中的標志建筑,而我們去認知研究這個軟件的時候,描繪這個概念空間也就不可避免成為重中之重。
本書的組織形式
本書的內容組織正是為了盡一切能力幫助讀者能夠形成有關 OpenStack 以及各個重要項目與功能比較細致的拓撲。首先是前四章,這幾章的內容希望能夠幫助您對 OpenStack 有個全面的認識和了解,從而形成對 OpenStack 整體的拓撲。
第 1 章主要介紹了 OpenStack 的成長史以及它的體系結構和社區現狀。
第 2 章詳盡的介紹了 OpenStack 開發的基礎流程以及如何去分析 OpenStack 的源碼。
第 3 章介紹了 OpenStack 的底層基石——虛擬化技術。大多數 OpenStack 的使用者和開發者并不了解虛擬化的一些細節,有了這一章的介紹,我們能夠對 OpenStack 有一個更好的認識。
第 4 章將 OpenStack 眾多項目中所使用到的通用技術加以介紹,有了這一章,我們理解各個具體項目的設計與實現時,可以少去很多的阻礙。
然后第 5~14 章的內容對 OpenStack 主要組件及項目的實現進行介紹。按照認識的發展規律,通過前面幾章的介紹我們已經對 OpenStack 有了全局的認識和了解,接下來就可以以興趣或工作需要為導向,尋找一個組件或項目,對其實現進行深入的鉆研和分析。這些章節的內容也是希望能夠盡量幫助您形成對相應項目的比較細致的拓撲,并不求對所有實現細節的詳盡分析。
第 5 章討論計算組件也就是 Nova 項目。Nova 為我們實現了 OpenStack 這個虛擬機世界的抽象,控制著一個個虛擬機的狀態變遷與生老病死,管理著他們的資源分配。
第 6 章討論存儲相關的四個項目:Swift,Cinder,Glance 以及 Ceph。他們共同為這個虛擬機世界的主體——虛擬機提供了安身之本,負責為每個虛擬機本身的鏡像以及它所產生的各種數據提供一個家,盡量的去做到“居者有其屋”。
第 7 章討論網絡組件也就是 Neutron 項目。沒有網絡,任何虛擬機都將只是這個虛擬機世界中的孤島,不知道自己生存的價值。
安全是每個軟件無法回避的問題,第 8 章便針對安全問題進行討論,包括 Keystone 項目以及可信計算池的相關內容。
第 9 章的內容有關計量與監控的項目 Ceilometer,計量與監控是公有云運營的一個重要環節。
第 10 章的內容與物理機管理有關,Ironic 項目被應用于 OpenStack 中的裸機管理和部署。
第 11 章介紹了 OpenStack 的控制面板。提供一個簡潔方便、用戶友好的控制界面給最終的用戶和開發者對 OpenStack 尤為重要。
隨著容器技術的發展,容器與云基礎架構的結合受到越來越多的關注,第 12 章便討論了OpenStack 對容器的支持。
第 13 章的內容與部署有關,但是這里討論的并不是如何部署的詳細步驟與過程,而只是與部署有關的幾個主要項目。
第 14 章介紹了幾個新興的項目,包括 Searchlight 與 Watcher 等。
感謝
作為英特爾的開源技術中心,參與 OpenStack 的開發與推廣是再為自然不過的事情。除了為 OpenStack 的完善與穩定貢獻更多的思考和代碼,我們也希望能通過這本書讓更多的人更快捷的融入 OpenStack 的大家庭。
如果沒有 Imad Sousou(英特爾軟件與服務事業部副總裁兼開源技術中心總經理)、MauriWhalen(英特爾軟件與服務事業部副總裁兼開源技術中心核心系統研發總監)、HillariePrestopine(英特爾軟件與服務事業部副總裁兼開源技術中心云和網絡系統研發總監)、David LBrown(英特爾開源技術中心云計算核心研發總監)、練麗萍(英特爾開源技術中心網絡和存儲研發總監)、Malini K Bhandaru(英特爾開源技術中心云計算主任工程師)、馮曉焰(英特爾開源技術中心中國安卓研發總監)、李少凡(英特爾開源技術中心虛擬化研發總監)、陳緒(英特爾開源技術中心中國云計算戰略總監)的支持,這本書不可能完成,謹在此感謝他們對本書編寫過程中的關懷與幫助。
也要感謝本書的編輯孫學瑛老師,從選題到最后的定稿,整個過程中,都給予我們無私的幫助和指導。
然后要感謝參與第一版與第二版各章內容編寫的各位同事,他們是王慶、丁建峰、任橋偉、陸連浩、翟綱、徐賀杰、程盈心、李曉燕、臧銳、賀永立、郭瑞景、喬立勇、陳巍、杜永豐、楊林、張磊、馮少合、金運通、魏剛、田雙太、汪亞雷、譚霖、辛曉慧,為了本書的順利完成,他們付出了很多努力。他們不僅為英特爾開源技術中心做出了很多的貢獻,而且長期活躍在中國的云計算技術生態系統中。
最后感謝所有對 OpenStack 抱有興趣或從事 OpenStack 工作的人,沒有你們的源碼與大量技術資料,本書便會成為無源之水。
英特爾開源技術中心(Intel Open Source Technology Center -- OTC)是英特爾公司內專職進行開源軟件開發的團隊,負責在系統軟件領域進行與英特爾?平臺相關的技術開發和創新,并在 Linux 操作系統內核,Android/Chrome 操作系統,云計算和虛擬化技術,HTML5 WebRuntime,圖形驅動及多媒體軟件以及系統軟件的優化等方面積累了業界領先的技術能力。同時依托強大的技術團隊,OTC 積極參與開源社區對開源軟件的推廣普及活動,并對國內及國際上主流開源操作系統廠商提供有力地支持。
第 1 章 初識 OpenStack1
1.1 從虛擬化到 OpenStack 1
1.1.1 虛擬化 1
1.1.2 云計算 2
1.1.3 OpenStack 4
1.2 OpenStack 基金會以及管理模式 7
1.2.1 董事會 8
1.2.2 技術委員會 9
1.2.3 用戶委員會 10
1.3 OpenStack 體系結構 11
1.4 OpenStack 項目發展流程 18
1.4.1 新項目 18
1.4.2 孵化項目、集成項目和核心項目 19
1.4.3 大帳篷(Big Tent) 20
1.5 OpenStack 社區 21
1.5.1 郵件列表 21
1.5.2 IRC 和項目例會 22
1.5.3 Summit 和 Meetup 23
1.5.4 其他社交平臺. 25
1.6 其他開源項目 25
1.7 OpenStack 的技術發展趨勢 30
第 2 章 OpenStack 開發基礎.33
2.1 相關開發資源 33
2.1.1 OpenStack 社區 33
2.1.2 OpenStack 文檔 33
2.1.3 OpenStack 書籍 34
2.1.4 其他網絡資源. 35
2.2 OpenStack 開發的技術基礎 35
2.3 部署開發環境 36
2.3.1 Git 37
2.3.2 Devstack. 38
2.4 瀏覽 OpenStack 源代碼 42
2.4.1 瀏覽代碼的工具 43
2.4.2 分析源碼如何入手 44
2.5 OpenStack 代碼質量保證體系 48
2.5.1 編碼規范 50
2.5.2 代碼評審 Gerrit 53
2.5.3 單元測試 Tox 58
2.5.4 持續集成 Jenkins 61
2.6 如何貢獻 66
2.6.1 文檔 67
2.6.2 修補 bug 67
2.6.3 增加 feature 69
2.6.4 review 72
2.6.5 調試 73
第 3 章 虛擬化 75
3.1 概述 75
3.1.1 虛擬化實現方式 77
3.1.2 虛擬化現狀和未來 79
3.2 高層管理工具 87
3.2.1 XenAPI 88
3.2.2 Libvirt 89
3.3 OpenStack 相關實現 98
3.3.1 Libvirt 驅動 98
3.3.2 XenAPI 驅動 100
第 4 章 OpenStack 通用技術102
4.1 消息總線 102
4.2 SQLAlchemy 和數據庫 107
4.3 RESTful API 和 WSGI 111
4.4 Eventlet 120
4.5.1 Cliff 122
4.5.2 oslo.config 125
4.5.3 oslo.db 128
4.5.4 oslo.i18n 131
4.5.5 oslo.messaging 132
4.5.6 stevedore 139
4.5.7 TaskFlow. 142
4.5.8 cookiecutter 149
4.5.9 oslo.policy 150
4.5.10 oslo.rootwrap 151
4.5.11 oslo.test 154
4.5.12 oslo.versionedobjects 156
第 5 章 計算.160
5.1 Nova 體系結構 161
5.2 Nova API 166
5.2.1 Nova v2.1 API 167
5.2.2 Nova API 實現. 168
5.3 Rolling Upgrade. 178
5.3.1 Rolling Upgrade 實現 179
5.4 Scheduler 186
5.4.1 調度器 187
5.4.2 Resource Tracker 191
5.4.3 調度流程 193
5.5 典型工作流程 195
5.5.1 創建虛擬機 195
5.5.2 冷遷移與 Resize 196
5.5.3 熱遷移 197
5.5.4 掛起和恢復 200
5.5.5 Rebuild 和 Evacuate 200
第 6 章 存儲.201
6.1 Swift. 201
6.1.1 Swift 體系結構 201
6.1.2 Ring 209
6.1.3 Swift API. 218
6.1.4 認證 226
6.1.5 對象管理與操作. 228
6.1.6 數據一致性 231
6.2 Cinder 234
6.2.1 Cinder 體系結構. 234
6.2.2 Cinder API 239
6.2.3 cinder-scheduler 241
6.2.4 cinder-volume 243
6.2.5 cinder-backup 248
6.3 Glance 249
6.3.1 Glance 體系結構 249
6.3.2 Glance API 252
6.4 Ceph 257
6.4.1 Ceph 體系結構 259
6.4.2 RADOS 261
6.4.3 Ceph 塊設備 281
6.4.4 Ceph FS 285
6.4.5 Ceph 與 OpenStack 286
第 7 章 網絡.289
7.1 Neutron 體系結構 289
7.1.1 Linux 虛擬網絡 290
7.1.2 Neutron 網絡抽象 294
7.1.3 Neutron 架構 295
7.1.4 Neutron 源碼結構 297
7.2 Neutron API 299
7.2.1 neutron-server 300
7.3 ML2 Plugin 301
7.4 Port Binding 擴展 308
7.5 Open vSwitch Agent 317
7.6 Service Plugin 324
7.6.1 Firewall 325
7.6.2 LoadBalance 326
7.7 Neutron 熱點話題 329
7.7.1 DVR 329
7.7.2 SDN 329
7.7.3 NFV/SRIOV 330
7.7.4 OVS 和 DPDK. 333
第 8 章 安全.335
8.1 OpenStack 安全概述 335
8.2 Keystone 336
8.2.1 Keystone 體系結構 336
8.2.2 Keystone 啟動過程 343
8.2.3 用戶認證及令牌獲取 346
8.2.4 簽名證書生成 349
8.2.5 Keystone 高階應用 352
8.3 可信計算池 355
8.3.1 體系結構 355
8.3.2 Intel TXT 與 TBoot 356
8.3.3 可信認證與 OpenAttestation 項目 358
8.3.4 TrustedFilter 362
8.3.5 部署 364
第 9 章 計量與監控 366
9.1 Ceilometer. 367
9.1.1 體系結構 367
9.1.2 Pipeline 370
9.1.3 Polling Agent 與 Pollster 插件 372
9.1.4 Notification Agent 與 Notification Listeners 插件 373
9.1.5 Collector 與 Dispatcher 插件 373
9.1.6 Storage/DB. 374
9.1.7 API Server 374
9.1.8 部署與使用 375
9.1.9 插件的開發 386
9.2 Aodh 396
9.2.1 體系結構 396
9.2.2 部署與使用 398
9.2.3 插件的開發 402
9.3 Gnocchi 408
9.3.1 體系結構 409
9.3.2 部署與使用 412
9.4 Panko 414
第 10 章 物理機管理 415
10.1 Ironic 體系結構 415
10.1.1 Ironic Driver 419
10.1.2 Ironic API. 423
10.1.3 Ironic Conductor 424
10.1.4 Ironic-python-agent. 425
10.1.5 ironic-inspector 426
10.2 Ironic 中的網絡管理 426
10.2.1 物理交換機管理 426
10.2.2 多租戶網絡的支持. 427
10.3 Ironic 節點的注冊和啟動 428
第 11 章 控制面板.432
11.1 Horizon 體系結構 432
11.1.1 Horizon 與 Django 432
11.1.2 Horizon 網站布局 435
11.1.3 Horzion 源碼結構 437
11.2 Horizon 部署 439
11.3 頁面渲染流程 441
第 12 章 容器455
12.1 容器技術 455
12.1.1 容器的原理 455
12.1.2 常見的容器集群管理工具. 456
12.2 容器與 OpenStack 460
12.2.1 nova-docker/heat-docker 461
12.2.2 Magnum 461
12.2.3 Murano 469
12.2.4 Kolla 472
12.2.5 Solum 472
12.2.6 Kuryr 474
12.2.7 容器技術與 OpenStack 的展望 476
第 13 章 部署477
13.1 配置管理工具 478
13.2 OpenStack 部署項目 480
13.2.1 Bifrost 481
13.2.2 Kolla 483
13.2.3 TripleO 490
13.2.4 Fuel 493
第 14 章 新興項目 495
14.1 Searchlight 495
14.1.1 Searchlight 體系結構 495
14.1.2 plugin 的開發 497
14.2 Watcher 502
14.2.1 Watcher 使用 503
14.2.2 Watcher 體系結構 505
14.2.3 strategy 的開發 507