本書介紹了容器即服務(wù)的發(fā)展過程和主要技術(shù),重點(diǎn)闡述當(dāng)下主流的SwarmKit、Kubernetes、Mesos和Rancher 開源容器集群方案,并探討了容器技術(shù)在網(wǎng)絡(luò)、存儲(chǔ)、監(jiān)控、日志等方面的運(yùn)用場(chǎng)景和基礎(chǔ)知識(shí),以及該領(lǐng)域在近年來的一些新的發(fā)展方向。本書適合一線架構(gòu)師、開發(fā)者、運(yùn)維人員以及技術(shù)管理者進(jìn)行閱讀。
全局視角透視集群與容器編排
實(shí)戰(zhàn)級(jí)企業(yè)級(jí)容器化技術(shù)落地
容器架構(gòu)主線與集群生態(tài)藍(lán)圖
大規(guī)模部署與基礎(chǔ)設(shè)施即交付
序
在這個(gè)日新月異的時(shí)代,每一位站在浪尖上的技術(shù)匠人,都不得不加緊步伐,追趕不斷變化的趨勢(shì)。與此相應(yīng)的一個(gè)現(xiàn)象是,當(dāng)一本技術(shù)類的書籍剛剛面市,它所講述的內(nèi)容就已經(jīng)開始迅速過時(shí)。
這本書從2016 年初開始籌備,由于種種原因拖沓了近兩年終于完稿。在這段時(shí)間里:
SwarmKit 誕生了,原先的Swarm 技術(shù)棧光榮退役。
Kubernetes 的版本從1.0 一路更迭到1.10,增加了無數(shù)新特性。
Mesos 推出Unified Container,曾經(jīng)一度被看好的Docker 集成器風(fēng)光不再。
Rancher 發(fā)布2.0 版本,完全顛覆先前的用戶體驗(yàn)設(shè)計(jì)。
Docker 自家的LinuxKit、阿里的Pouch 這些底層開源技術(shù)在不斷演進(jìn)。
書還沒寫完,最初準(zhǔn)備的材料有一大半都已經(jīng)作廢。
先前筆者寫作《CoreOS 實(shí)踐之路》一書時(shí),同樣是一邊增加新章節(jié),一邊關(guān)注書里涉及軟件的變化,對(duì)已有章節(jié)進(jìn)行三番五次的補(bǔ)充修正,到完成時(shí),許多地方都被大段大段地重寫了。此次的《容器即服務(wù):從零構(gòu)建企業(yè)級(jí)容器集群》因?yàn)樯婕胺矫孑^多,加上寫作時(shí)間跨度較大,以至于維護(hù)其中的內(nèi)容變化更加困難,經(jīng)過數(shù)次截稿日的跳票,才費(fèi)勁地將書中示例涉及的大部分軟件更新到2017 年中下旬的版本。
不過,本書寫作的初衷并非在于介紹最新的工具。對(duì)于學(xué)習(xí)一門成熟的工具,最直接的方式莫過于閱讀它的文檔。但面對(duì)一個(gè)領(lǐng)域中眾多的知識(shí),入門者最容易迷失的地方在于缺少一條主線。本書一方面希望為容器集群及其周邊的領(lǐng)域勾勒一幅入門的藍(lán)圖,另一方面則是點(diǎn)出一些在文檔中沒有講清但實(shí)際很容易迷惑用戶的大坑小洼,對(duì)于細(xì)節(jié)和擴(kuò)展的內(nèi)容則以參考鏈接的形式提供。
如今的容器技術(shù)正在處于百花齊放的時(shí)期,當(dāng)我們討論到容器,很多時(shí)候已不是單純地在說某種內(nèi)核虛擬化技術(shù),而是在談服務(wù)集群、任務(wù)調(diào)度,以及Cloud Native 和微服務(wù)。與此同時(shí),容器平臺(tái)相關(guān)的應(yīng)用場(chǎng)景也越來越豐富,大規(guī)模容器化部署的運(yùn)用逐漸從少數(shù)大型企業(yè)發(fā)展到許多中型和創(chuàng)業(yè)企業(yè)里。作為現(xiàn)代產(chǎn)品發(fā)布模式的重塑者,容器技術(shù)以及它所提倡的基礎(chǔ)設(shè)施即代碼交付思想,對(duì)每位一線架構(gòu)師、開發(fā)者、運(yùn)維人員乃至技術(shù)管理者的工作帶來的影響,都不容小覷。本書截取了一些具有當(dāng)下時(shí)代特征的技術(shù)剪影,提供給讀者品味。
在編寫內(nèi)容時(shí),本書盡量以通用的容器技術(shù)作為背景,而非限定于特定的容器產(chǎn)品(比如Docker)。但在一些具體的例子方面,均采用了當(dāng)前最主流的Docker 容器作為講解示例。
由于寫作周期較長,加之作者個(gè)人的經(jīng)驗(yàn)所限,書中難免存在一些闡述不當(dāng)和錯(cuò)誤的地方。本書的勘誤表發(fā)布在博文視點(diǎn)官方網(wǎng)站http://www.broadview.com.cn/33276,懇請(qǐng)各位讀者通過此頁面提交勘誤或發(fā)郵件到linfan.china@gmail.com 予以指正。
最后,感謝在過去兩年中不斷督促和鼓勵(lì)我完成寫作的張春雨以及負(fù)責(zé)了整本書編輯的吳倩雪,沒有你們的努力,這本書肯定無法按時(shí)出版。感謝將我養(yǎng)育成材的父母以及我的愛人楊斌清,你們默默的支持使我得以靜下心來認(rèn)真地完成這部作品。同樣感謝每一位開源代碼的貢獻(xiàn)者,正是開源推動(dòng)了技術(shù)的革命,才使舊時(shí)王謝堂前燕,如今飛入尋常百姓家。我亦是一名普通的技術(shù)匠人,且當(dāng)少一些浮躁,多一些沉淀,借以此書自勉。
林 帆
2017 年12 月25 日
林帆,花名金戟,阿里巴巴研發(fā)效能事業(yè)部技術(shù)專家。前ThoughtWorks資深DevOps技術(shù)咨詢師,2015年極客邦CNut全球容器技術(shù)大會(huì)講師,2016年CSDN架構(gòu)技術(shù)實(shí)戰(zhàn)峰會(huì)講師,2017年StuQ容器集群技術(shù)直播課程講師。具有豐富的一線開發(fā)和運(yùn)維經(jīng)驗(yàn),是國內(nèi)早期的容器技術(shù)實(shí)踐者和布道師。
第1 部分 基礎(chǔ)概念
第1 章 容器集群綜述 2
1.1 虛擬化與容器 2
1.1.1 計(jì)算資源虛擬化 2
1.1.2 容器技術(shù)的本質(zhì) 4
1.1.3 基于容器的軟件交付 13
1.2 容器集群與分布式服務(wù) 16
1.2.1 微服務(wù)架構(gòu) 16
1.2.2 容器集群生態(tài)圈 18
1.3 容器即服務(wù) 26
1.3.1 從基礎(chǔ)設(shè)施到平臺(tái) 26
1.3.2 數(shù)據(jù)中心操作系統(tǒng) 29
1.4 本章小結(jié) 31
第2 部分 解決方案
第2 章 SwarmKit 集群解決方案 35
2.1 開源容器集群方案 35
2.1.1 容器社區(qū)的四朵金花 35
2.1.2 經(jīng)典Swarm、SwarmKit 和Swarm Mode 36
2.2 使用SwarmKit 37
2.2.1 SwarmKit 綜述 37
2.2.2 創(chuàng)建SwarmKit 集群 40
2.2.3 在SwarmKit 集群上運(yùn)行服務(wù) 43
2.2.4 SwarmKit 集群的其他功能 45
2.3 Docker Swarm Mode 45
2.3.1 Swarm Mode 綜述 45
2.3.2 集群的創(chuàng)建與銷毀 46
2.3.3 節(jié)點(diǎn)管理 48
2.3.4 服務(wù)管理 51
2.3.5 服務(wù)編排 56
2.3.6 應(yīng)用棧的管理 63
2.3.7 外置配置和密文管理 66
2.4 Swarm Mode 的圖形界面 69
2.4.1 Swarm Mode UI 現(xiàn)狀 69
2.4.2 Portainer 71
2.5 本章小結(jié) 74
第3 章 Kubernetes 集群解決方案 75
3.1 Kubernetes 集群概述 75
3.1.1 Kubernetes 項(xiàng)目的起源 75
3.1.2 Kubernetes 的結(jié)構(gòu) 76
3.1.3 基本概念 78
3.2 部署Kubernetes 集群 82
3.2.1 使用Minikube 82
3.2.2 使用kubeadm 83
3.2.3 理解Kubernetes 集群的部署過程 87
3.2.4 驗(yàn)證集群可用性 96
3.3 使用Kubernetes 98
3.3.1 通過Kubernetes 部署服務(wù) 98
3.3.2 服務(wù)的在線更新和回滾 103
3.3.3 單次任務(wù)、定時(shí)任務(wù)和全局服務(wù) 109
3.3.4 持久化存儲(chǔ) 113
3.3.5 配置存儲(chǔ) 116
3.3.6 管理有狀態(tài)的服務(wù) 122
3.3.7 健康檢查 126
3.3.8 提供對(duì)外服務(wù) 127
3.3.9 多租戶隔離和配額 131
3.3.10 集群的節(jié)點(diǎn)管理 135
3.4 Kubernetes 包管理工具Helm 137
3.4.1 Helm 簡(jiǎn)介 137
3.4.2 使用Helm 管理服務(wù) 137
3.4.3 自定義Chart 142
3.4.4 Chart 倉庫 146
3.5 本章小結(jié) 147
第4 章 Mesos 集群解決方案 148
4.1 Mesos 和DC/OS 概述 148
4.1.1 Mesos 項(xiàng)目的起源 148
4.1.2 Mesos 的結(jié)構(gòu) 149
4.1.3 Mesos 的內(nèi)部構(gòu)成 151
4.1.4 DC/OS 數(shù)據(jù)中心操作系統(tǒng) 152
4.2 部署Mesos 集群 153
4.2.1 部署ZooKeeper 153
4.2.2 部署Mesos 157
4.2.3 啟動(dòng)Master 節(jié)點(diǎn) 158
4.2.4 添加Agent 節(jié)點(diǎn) 161
4.2.5 Mesos 服務(wù)的啟動(dòng)參數(shù) 164
4.3 使用Marathon 管理服務(wù) 170
4.3.1 部署Marathon 170
4.3.2 添加一個(gè)應(yīng)用 172
4.3.3 使用DC/OS 命令行工具 177
4.3.4 使用Docker 容器 177
4.3.5 使用Unified Container 179
4.3.6 持久化卷存儲(chǔ) 182
4.3.7 Marathon-LB 負(fù)載均衡 184
4.3.8 Mesos-DNS 域名服務(wù) 188
4.3.9 服務(wù)依賴和編組 191
4.3.10 應(yīng)用升級(jí) 194
4.3.11 調(diào)度約束 199
4.3.12 健康檢查 201
4.4 使用Chronos 203
4.4.1 部署Chronos 203
4.4.2 定時(shí)表達(dá)式 204
4.4.3 創(chuàng)建定時(shí)任務(wù) 205
4.4.4 定時(shí)任務(wù)的依賴 208
4.5 更多的Mesos 服務(wù)框架 209
4.5.1 Mesos 服務(wù)框架的本質(zhì) 209
4.5.2 編寫自己的Mesos 服務(wù)框架 211
4.5.3 其他常見服務(wù)框架 216
4.6 DC/OS 218
4.6.1 DC/OS 簡(jiǎn)介 218
4.6.2 部署DC/OS 219
4.6.3 DC/OS 的操作 228
4.6.4 DC/OS 命令行工具 230
4.6.5 DC/OS 的應(yīng)用倉庫 231
4.7 本章小結(jié) 234
第5 章 Rancher 集群解決方案 235
5.1 Rancher 集群概述 235
5.1.1 Rancher 項(xiàng)目的起源 235
5.1.2 Rancher 的結(jié)構(gòu) 236
5.1.3 相關(guān)概念 237
5.2 構(gòu)建Rancher 集群 239
5.2.1 部署Server 節(jié)點(diǎn) 239
5.2.2 Server 節(jié)點(diǎn)的高可用部署方式 240
5.2.3 添加Agent 節(jié)點(diǎn) 241
5.3 Rancher 的服務(wù)管理 243
5.3.1 使用Rancher Web UI 創(chuàng)建服務(wù) 243
5.3.2 從容器 245
5.3.3 特殊類型的服務(wù) 247
5.3.4 使用應(yīng)用商店 251
5.3.5 服務(wù)編排 252
5.3.6 服務(wù)的升級(jí)和回滾 254
5.4 Rancher 使用進(jìn)階 256
5.4.1 Rancher 的標(biāo)簽 256
5.4.2 調(diào)度選項(xiàng) 257
5.4.3 服務(wù)健康檢查 258
5.4.4 Rancher 的元數(shù)據(jù)服務(wù) 260
5.4.5 Rancher 的DNS 服務(wù) 262
5.4.6 使用私有鏡像倉庫 263
5.4.7 Rancher 的Secret 服務(wù) 264
5.4.8 在應(yīng)用商店添加自定義應(yīng)用 265
5.5 Rancher 的命令行工具 268
5.5.1 配置Rancher 命令行工具 268
5.5.2 命令工具的基本使用 270
5.5.3 通過命令行進(jìn)行服務(wù)編排 273
5.5.4 通過命令行進(jìn)行服務(wù)升級(jí) 273
5.6 使用Rancher 安裝Kubernetes 274
5.6.1 Rancher 的環(huán)境管理 274
5.6.2 在Rancher 中添加Kubernetes 環(huán)境 276
5.6.3 在Rancher 中使用Kubernetes 279
5.7 本章小結(jié) 282
第3 部分 技術(shù)周邊
第6 章 容器集群的網(wǎng)絡(luò)和存儲(chǔ) 284
6.1 容器網(wǎng)絡(luò) 284
6.1.1 容器網(wǎng)絡(luò)標(biāo)準(zhǔn) 284
6.1.2 本地網(wǎng)絡(luò) 288
6.1.3 跨節(jié)點(diǎn)網(wǎng)絡(luò) 293
6.1.4 使用Docker 內(nèi)置的Overlay 類型網(wǎng)絡(luò) 300
6.1.5 構(gòu)建基于Flannel 的覆蓋網(wǎng)絡(luò) 301
6.1.6 構(gòu)建基于Calico 的BGP 路由網(wǎng)絡(luò) 306
6.2 容器存儲(chǔ) 310
6.2.1 容器實(shí)例和鏡像的存儲(chǔ) 310
6.2.2 容器卷的存儲(chǔ) 312
6.2.3 容器卷存儲(chǔ)標(biāo)準(zhǔn) 316
6.2.4 基于NFS 的卷存儲(chǔ) 317
6.2.5 基于Ceph 的卷存儲(chǔ) 320
6.2.6 使用公有云存儲(chǔ) 330
6.3 本章小結(jié) 332
第7 章 容器服務(wù)的基礎(chǔ)設(shè)施 333
7.1 集群性能監(jiān)控 333
7.1.1 常見的開源性能監(jiān)控方案 333
7.1.2 基于TICK Stack 的性能監(jiān)控 335
7.1.3 TICK Stack 的部署和使用 336
7.1.4 基于Prometheus 的性能監(jiān)控 341
7.1.5 Prometheus 的部署 343
7.1.6 Prometheus 的使用 353
7.2 集群日志管理 361
7.2.1 常見的開源日志管理方案 361
7.2.2 基于Elastic Stack 的日志管理 363
7.2.3 基于Fluentd 的日志管理 372
7.3 服務(wù)發(fā)現(xiàn) 377
7.3.1 常見的服務(wù)發(fā)現(xiàn)方案 377
7.3.2 Etcd 379
7.3.3 Consul 390
7.4 鏡像倉庫 398
7.4.1 容器鏡像倉庫概述 398
7.4.2 Registry 399
7.4.3 Harbor 405
7.5 本章小結(jié) 412
第8 章 容器技術(shù)新風(fēng)向 413
8.1 安全的集群操作系統(tǒng):Container Linux 413
8.1.1 Container Linux 概述 413
8.1.2 Container Linux 的部署 416
8.1.3 Container Linux 的使用 418
8.2 基于容器的操作系統(tǒng):RancherOS 419
8.2.1 RancherOS 概述 419
8.2.2 部署RancherOS 421
8.2.3 RancherOS 的使用 422
8.2.4 使用ros 工具管理系統(tǒng) 424
8.3 容器式的虛擬機(jī):Hyper 429
8.3.1 Hyper 概述 429
8.3.2 部署Hyper 430
8.3.3 Hyper 的使用 431
8.4 虛擬機(jī)式的容器:LXD 434
8.4.1 LXD 概述 434
8.4.2 LXD 的安裝和使用 435
8.4.3 服務(wù)熱遷移 440
8.5 容器與虛擬機(jī)的統(tǒng)一:Rkt 442
8.5.1 Rkt 概述 442
8.5.2 Rkt 的安裝和使用 444
8.6 企業(yè)級(jí)定制容器:Pouch450
8.6.1 Pouch 概述 450
8.6.2 Pouch 的開源生態(tài) 453
8.6.3 體驗(yàn)Pouch 455
8.7 微內(nèi)核操作系統(tǒng):Unikernel 458
8.7.1 Unikernel 概述 458
8.7.2 Unikernel 的發(fā)展 460
8.7.3 體驗(yàn)Unikernel 462
8.8 本章小結(jié) 465