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