Kubernetes容器編排系統安全地管理分布式應用的結構和流程,以極高的效率組織容器和服務(wù)。Kubernetes充當集群的操作系統,消除了在設計中考慮底層網(wǎng)絡(luò )和服務(wù)器基礎設施的需要。本書(shū)教你使用Kubernetes部署基于容器的分布式應用。在構建Kubernetes集群前,將從Docker和Kubernetes的概觀(guān)開(kāi)始學(xué)習。你將逐步擴展初始應用程序、添加特性并加深對Kubernetes架構和操作的了解。當你瀏覽這本全面的指南時(shí),還將探索高級的主題,如監控、調優(yōu)和擴容。本書(shū)包括:
◎Kubernetes內部原理
◎跨集群部署容器
◎保障集群的安全
◎不停機更新應用
本書(shū)主要講解如何在 Kubernetes 中部署分布式容器應用。本書(shū)開(kāi)始部分概要介紹了 Docker 和Kubernetes 的由來(lái)和發(fā)展,然后通過(guò)在 Kubernetes 中部署一個(gè)應用程序,一點(diǎn)點(diǎn)增加功能,逐步加深我們對于Kubernetes架構的理解和操作的實(shí)踐。在本書(shū)的后面部分,也可以學(xué)習一些高階的主題,比如監控、調試及伸縮。
Kubernetes是希臘文,意思是“舵手”,帶領(lǐng)我們安全地到達未知水域。Kubernetes這樣的容器編排系統,會(huì )幫助我們妥善地管理分布式應用的部署結構和線(xiàn)上流量,高效地組織容器和服務(wù)。Kubernetes 作為數據中心操作系統,在設計軟件系統時(shí),能夠盡量降低在底層網(wǎng)絡(luò )和硬件設施上的負擔。
原著(zhù)作者簡(jiǎn)介
Marko Luksa是一位擁有20年以上專(zhuān)業(yè)開(kāi)發(fā)經(jīng)驗的軟件工程師,經(jīng)手項目小到簡(jiǎn)單的Web應用,大到ERP系統、框架和中間件軟件,應有盡有。在為Red Hat工作期間,他從Google App Engine API實(shí)現的開(kāi)發(fā)起步, 這些API將基于Red Hat的JBoss中間件產(chǎn)品,之后他一直在為CDI/Weld、Infinispan/JBoss DataGrid等項目貢獻力量。2014后, 他加入Red Hat的Cloud Enablement團隊,負責 Kubernetes和相關(guān)技術(shù)開(kāi)發(fā)的更新,保障公司的中間件軟件能將Kubernetes與OpenShift特性的潛能完全發(fā)揮出來(lái)。
譯者簡(jiǎn)介
七牛容器云 (KIRK)團隊,是負責七牛云基于自身公有云業(yè)務(wù)在容器方面的多年實(shí)踐經(jīng)驗,針對企業(yè)應用快速部署、便捷運維打造的容器云計算平臺。提供持續集成、彈性伸縮、應用市場(chǎng)等功能特性,使企業(yè)專(zhuān)注于業(yè)務(wù)邏輯開(kāi)發(fā),縮短業(yè)務(wù)上線(xiàn)周期,優(yōu)化資源利用率,提高服務(wù)響應效率的一支技術(shù)團隊。
1 Kubernetes 介紹1
1.1 Kubernetes 系統的需求 2
1.1.1 從單體應用到微服務(wù) 2
1.1.2 為應用程序提供一個(gè)一致的環(huán)境 5
1.1.3 邁向持續交付 :DevOps 和無(wú)運維 6
1.2 介紹容器技術(shù) 7
1.2.1 什么是容器 7
1.2.2 Docker 容器平臺介紹 11
1.2.3 rkt——一個(gè) Docker 的替代方案 14
1.3 Kubernetes 介紹 15
1.3.1 初衷 15
1.3.2 深入淺出地了解 Kubernetes 15
1.3.3 Kubernetes 集群架構 17
1.3.4 在 Kubernetes 中運行應用 18
1.3.5 使用 Kubernetes 的好處 20
1.4 本章小結 22
2 開(kāi)始使用 Kubernetes 和 Docker 23
2.1 創(chuàng )建、運行及共享容器鏡像 23
2.1.1 安裝 Docker 并運行 Hello World 容器 24
2.1.2 創(chuàng )建一個(gè)簡(jiǎn)單的 Node.js 應用 26
2.1.3 為鏡像創(chuàng )建 Dockerfile 27
2.1.4 構建容器鏡像 27
2.1.5 運行容器鏡像 30
2.1.6 探索運行容器的內部 31
2.1.7 停止和刪除容器 32
2.1.8 向鏡像倉庫推送鏡像 33
2.2 配置 Kubernetes 集群 34
2.2.1 用 Minikube 運行一個(gè)本地單節點(diǎn) Kubernetes 集群 34
2.2.2 使用 Google Kubernetes Engine 托管 Kubernetes 集群 36
2.2.3 為 kubectl 配置別名和命令行補齊 39
2.3 在 Kubernetes 上運行第一個(gè)應用 40
2.3.1 部署 Node.js 應用 40
2.3.2 訪(fǎng)問(wèn) Web 應用 43
2.3.3 系統的邏輯部分 45
2.3.4 水平伸縮應用 46
2.3.5 查看應用運行在哪個(gè)節點(diǎn)上 49
2.3.6 介紹 Kubernetes dashboard 50
2.4 本章小結 51
3 pod :運行于 Kubernetes 中的容器 53
3.1 介紹 pod 53
3.1.1 為何需要 pod 54
3.1.2 了解 pod 55
3.1.3 通過(guò) pod 合理管理容器 56
3.2 以 YAML 或 JSON 描述文件創(chuàng )建 pod 58
3.2.1 檢查現有 pod 的 YAML 描述文件 59
3.2.2 為 pod 創(chuàng )建一個(gè)簡(jiǎn)單的 YAML 描述文件 61
3.2.3 使用 kubectl create 來(lái)創(chuàng )建 pod 63
3.2.4 查看應用程序日志 64
3.2.5 向 pod 發(fā)送請求 65
3.3 使用標簽組織 pod 66
3.3.1 介紹標簽 66
3.3.2 創(chuàng )建 pod 時(shí)指定標簽 67
3.3.3 修改現有 pod 的標簽 68
3.4 通過(guò)標簽選擇器列出 pod 子集 69
3.4.1 使用標簽選擇器列出 pod 69
3.4.2 在標簽選擇器中使用多個(gè)條件 71
3.5 使用標簽和選擇器來(lái)約束 pod 調度 71
3.5.1 使用標簽分類(lèi)工作節點(diǎn) 72
3.5.2 將 pod 調度到特定節點(diǎn) 72
3.5.3 調度到一個(gè)特定節點(diǎn) 73
3.6 注解 pod73
3.6.1 查找對象的注解 74
3.6.2 添加和修改注解 74
3.7 使用命名空間對資源進(jìn)行分組 75
3.7.1 了解對命名空間的需求 75
3.7.2 發(fā)現其他命名空間及其 pod 75
3.7.3 創(chuàng )建一個(gè)命名空間 76
3.7.4 管理其他命名空間中的對象 77
3.7.5 命名空間提供的隔離 78
3.8 停止和移除 pod 78
3.8.1 按名稱(chēng)刪除 pod 78
3.8.2 使用標簽選擇器刪除 pod 79
3.8.3 通過(guò)刪除整個(gè)命名空間來(lái)刪除 pod 80
3.8.4 刪除命名空間中的所有 pod,但保留命名空間 80
3.8.5 刪除命名空間中的(幾乎)所有資源 80
3.9 本章小結 81
4 副本機制和其他控制器 :部署托管的 pod 83
4.1 保持 pod 健康 84
4.1.1 介紹存活探針 84
4.1.2 創(chuàng )建基于 HTTP 的存活探針 85
4.1.3 使用存活探針 86
4.1.4 配置存活探針的附加屬性 87
4.1.5 創(chuàng )建有效的存活探針 88
4.2 了解 ReplicationController 89
4.2.1 ReplicationController 的操作 90
4.2.2 創(chuàng )建一個(gè) ReplicationController 92
4.2.3 使用 ReplicationController 94
4.2.4 將 pod 移入或移出 ReplicationController 的作用域 97
4.2.5 修改 pod 模板 100
4.2.6 水平縮放 pod 101
4.2.7 刪除一個(gè) ReplicationController 103
4.3 使用 ReplicaSet 而不是 ReplicationController 104
4.3.1 比較 ReplicaSet 和 ReplicationController 104
4.3.2 定義 ReplicaSet 105
4.3.3 創(chuàng )建和檢查 ReplicaSet106
4.3.4 使用 ReplicaSet 的更富表達力的標簽選擇器106
4.3.5 ReplicaSet 小結 107
4.4 使用 DaemonSet 在每個(gè)節點(diǎn)上運行一個(gè) pod 107
4.4.1 使用 DaemonSet 在每個(gè)節點(diǎn)上運行一個(gè) pod 108
4.4.2 使用 DaemonSet 只在特定的節點(diǎn)上運行 pod 109
4.5 運行執行單個(gè)任務(wù)的 pod 112
4.5.1 介紹 Job 資源 112
4.5.2 定義 Job 資源 113
4.5.3 看 Job 運行一個(gè) pod 114
4.5.4 在 Job 中運行多個(gè) pod 實(shí)例 114
4.5.5 限制 Job pod 完成任務(wù)的時(shí)間 116
4.6 安排 Job 定期運行或在將來(lái)運行一次 116
4.6.1 創(chuàng )建一個(gè) CronJob 116
4.6.2 了解計劃任務(wù)的運行方式 118
4.7 本章小結 118
5 服務(wù) :讓客戶(hù)端發(fā)現 pod 并與之通信121
5.1 介紹服務(wù) 122
5.1.1 創(chuàng )建服務(wù) 123
5.1.2 服務(wù)發(fā)現 129
5.2 連接集群外部的服務(wù) 132
5.2.1 介紹服務(wù) endpoint 133
5.2.2 手動(dòng)配置服務(wù)的 endpoint 133
5.2.3 為外部服務(wù)創(chuàng )建別名 135
5.3 將服務(wù)暴露給外部客戶(hù)端 136
5.3.1 使用 NodePort 類(lèi)型的服務(wù) 137
5.3.2 通過(guò)負載均衡器將服務(wù)暴露出來(lái) 140
5.3.3 了解外部連接的特性 142
5.4 通過(guò) Ingress 暴露服務(wù) 143
5.4.1 創(chuàng )建 Ingress 資源 145
5.4.2 通過(guò) Ingress 訪(fǎng)問(wèn)服務(wù) 146
5.4.3 通過(guò)相同的 Ingress 暴露多個(gè)服務(wù) 147
5.4.4 配置 Ingress 處理 TLS 傳輸 149
5.5 pod 就緒后發(fā)出信號 150
5.5.1 介紹就緒探針 151
5.5.2 向 pod 添加就緒探針 152
5.5.3 了解就緒探針的實(shí)際作用 154
5.6 使用 headless 服務(wù)來(lái)發(fā)現獨立的 pod 155
5.6.1 創(chuàng )建 headless 服務(wù)156
5.6.2 通過(guò) DNS 發(fā)現 pod 156
5.6.3 發(fā)現所有的 pod——包括未就緒的 pod 157
5.7 排除服務(wù)故障 158
5.8 本章小結 159
6 卷 :將磁盤(pán)掛載到容器 161
6.1 介紹卷 162
6.1.1 卷的應用示例162
6.1.2 介紹可用的卷類(lèi)型 164
6.2 通過(guò)卷在容器之間共享數據 165
6.2.1 使用 emptyDir 卷 165
6.2.2 使用 Git 倉庫作為存儲卷 168
6.3 訪(fǎng)問(wèn)工作節點(diǎn)文件系統上的文件 171
6.3.1 介紹 hostPath 卷 171
6.3.2 檢查使用 hostPath 卷的系統 pod 172
6.4 使用持久化存儲 173
6.4.1 使用 GCE 持久磁盤(pán)作為 pod 存儲卷 174
6.4.2 通過(guò)底層持久化存儲使用其他類(lèi)型的卷 177
6.5 從底層存儲技術(shù)解耦 pod 179
6.5.1 介紹持久卷和持久卷聲明 179
6.5.2 創(chuàng )建持久卷 180
6.5.3 通過(guò)創(chuàng )建持久卷聲明來(lái)獲取持久卷 182
6.5.4 在 pod 中使用持久卷聲明 184
6.5.5 了解使用持久卷和持久卷聲明的好處 185
6.5.6 回收持久卷 186
6.6 持久卷的動(dòng)態(tài)卷配置 187
6.6.1 通過(guò) StorageClass 資源定義可用存儲類(lèi)型 188
6.6.2 請求持久卷聲明中的存儲類(lèi) 188
6.6.3 不指定存儲類(lèi)的動(dòng)態(tài)配置 190
6.7 本章小結 193
7 ConfigMap 和 Secret :配置應用程序 195
7.1 配置容器化應用程序 195
7.2 向容器傳遞命令行參數 196
7.2.1 在 Docker 中定義命令與參數 196
7.2.2 在 Kubernetes 中覆蓋命令和參數 199
7.3 為容器設置環(huán)境變量 200
7.3.1 在容器定義中指定環(huán)境變量 201
7.3.2 在環(huán)境變量值中引用其他環(huán)境變量 201
7.3.3 了解硬編碼環(huán)境變量的不足之處 202
7.4 利用 ConfigMap 解耦配置 202
7.4.1 ConfigMap 介紹 202
7.4.2 創(chuàng )建 ConfigMap 203
7.4.3 給容器傳遞 ConfigMap 條目作為環(huán)境變量 206
7.4.4 一次性傳遞 ConfigMap 的所有條目作為環(huán)境變量 208
7.4.5 傳遞 ConfigMap 條目作為命令行參數 209
7.4.6 使用 configMap 卷將條目暴露為文件 210
7.4.7 更新應用配置且不重啟應用程序 216
7.5 使用 Secret 給容器傳遞敏感數據 218
7.5.1 介紹 Secret 218
7.5.2 默認令牌 Secret 介紹 218
7.5.3 創(chuàng )建 Secret 220
7.5.4 對比 ConfigMap 與 Secret 221
7.5.5 在 pod 中使用 Secret 222
7.6 本章小結 228
8 從應用訪(fǎng)問(wèn) pod 元數據以及其他資源 229
8.1 通過(guò) Downward API 傳遞元數據 229
8.1.1 了解可用的元數據 230
8.1.2 通過(guò)環(huán)境變量暴露元數據 231
8.1.3 通過(guò) downwardAPI 卷來(lái)傳遞元數據 234
8.2 與 Kubernetes API 服務(wù)器交互 237
8.2.1 探究 Kubernetes REST API 238
8.2.2 從 pod 內部與 API 服務(wù)器進(jìn)行交互 242
8.2.3 通過(guò) ambassador 容器簡(jiǎn)化與 API 服務(wù)器的交互 248
8.2.4 使用客戶(hù)端庫與 API 服務(wù)器交互 251
8.3 本章小結 253
9 Deployment: 聲明式地升級應用 255
9.1 更新運行在 pod 內的應用程序 256
9.1.1 刪除舊版本 pod,使用新版本 pod 替換257
9.1.2 先創(chuàng )建新 pod 再刪除舊版本 pod 257
9.2 使用 ReplicationController 實(shí)現自動(dòng)的滾動(dòng)升級259
9.2.1 運行第一個(gè)版本的應用 259
9.2.2 使用 kubectl 來(lái)執行滾動(dòng)式升級 261
9.2.3 為什么 kubectl rolling-update已經(jīng)過(guò)時(shí) 265
9.3 使用 Deployment 聲明式地升級應用 266
9.3.1 創(chuàng )建一個(gè) Deployment 267
9.3.2 升級 Deployment 269
9.3.3 回滾 Deployment 273
9.3.4 控制滾動(dòng)升級速率 276
9.3.5 暫停滾動(dòng)升級 278
9.3.6 阻止出錯版本的滾動(dòng)升級 279
9.4 本章小結 284
10 StatefulSet :部署有狀態(tài)的多副本應用 285
10.1 復制有狀態(tài) pod 285
10.1.1 運行每個(gè)實(shí)例都有單獨存儲的多副本 286
10.1.2 每個(gè) pod 都提供穩定的標識 287
10.2 了解 Statefulset 289
10.2.1 對比 Statefulset 和 ReplicaSet 289
10.2.2 提供穩定的網(wǎng)絡(luò )標識 290
10.2.3 為每個(gè)有狀態(tài)實(shí)例提供穩定的專(zhuān)屬存儲 292
10.2.4 Statefulset 的保障 294
10.3 使用 Statefulset 295
10.3.1 創(chuàng )建應用和容器鏡像 295
10.3.2 通過(guò) Statefulset 部署應用 296
10.3.3 使用你的 pod 301
10.4 在 Statefulset 中發(fā)現伙伴節點(diǎn) 305
10.4.1 通過(guò) DNS 實(shí)現伙伴間彼此發(fā)現 306
10.4.2 更新 Statefulset 308
10.4.3 嘗試集群數據存儲 309
10.5 了解 Statefulset 如何處理節點(diǎn)失效 310
10.5.1 模擬一個(gè)節點(diǎn)的網(wǎng)絡(luò )斷開(kāi) 310
10.5.2 手動(dòng)刪除 pod 312
10.6 本章小結 313
11 了解 Kubernetes 機理 315
11.1 了解架構 315
11.1.1 Kubernetes 組件的分布式特性 316
11.1.2 Kubernetes 如何使用 etcd 318
11.1.3 API 服務(wù)器做了什么 322
11.1.4 API 服務(wù)器如何通知客戶(hù)端資源變更 324
11.1.5 了解調度器 325
11.1.6 介紹控制器管理器中運行的控制器 327
11.1.7 Kubelet 做了什么 331
11.1.8 Kubernetes Service Proxy 的作用 332
11.1.9 介紹 Kubernetes 插件 333
11.1.10 總結概覽 335
11.2 控制器如何協(xié)作 335
11.2.1 了解涉及哪些組件335
11.2.2 事件鏈 336
11.2.3 觀(guān)察集群事件 337
11.3 了解運行中的 pod 是什么 339
11.4 跨 pod 網(wǎng)絡(luò ) 340
11.4.1 網(wǎng)絡(luò )應該是什么樣的 340
11.4.2 深入了解網(wǎng)絡(luò )工作原理 341
11.4.3 引入容器網(wǎng)絡(luò )接口 343
11.5 服務(wù)是如何實(shí)現的 344
11.5.1 引入 kube-proxy 344
11.5.2 kube-proxy 如何使用 iptables 344
11.6 運行高可用集群 346
11.6.1 讓你的應用變得高可用 346
11.6.2 讓 Kubernetes 控制平面變得高可用 347
11.7 本章小結 350
12 Kubernetes API 服務(wù)器的安全防護 351
12.1 了解認證機制 351
12.1.1 用戶(hù)和組 352
12.1.2 ServiceAccount 介紹 353
12.1.3 創(chuàng )建 ServiceAccount 354
12.1.4 將 ServiceAccount 分配給 pod 356
12.2 通過(guò)基于角色的權限控制加強集群安全 358
12.2.1 介紹 RBAC 授權插件 359
12.2.2 介紹 RBAC 資源 360
12.2.3 使用 Role 和 RoleBinding 363
12.2.4 使用 ClusterRole 和 ClusterRoleBinding 367
12.2.5 了解默認的 ClusterRole 和 ClusterRoleBinding 376
12.2.6 理性地授予授權權限 379
12.3 本章小結 379
13 保障集群內節點(diǎn)和網(wǎng)絡(luò )安全 381
13.1 在 pod 中使用宿主節點(diǎn)的 Linux 命名空間 381
13.1.1 在 pod 中使用宿主節點(diǎn)的網(wǎng)絡(luò )命名空間382
13.1.2 綁定宿主節點(diǎn)上的端口而不使用宿主節點(diǎn)的網(wǎng)絡(luò )命名空間 383
13.1.3 使用宿主節點(diǎn)的 PID 與 IPC 命名空間 385
13.2 配置節點(diǎn)的安全上下文 386
13.3 限制 pod 使用安全相關(guān)的特性 396
13.4 隔離 pod 的網(wǎng)絡(luò ) 406
13.5 本章小結 410
14 計算資源管理 411
14.1 為 pod 中的容器申請資源 411
14.1.1 創(chuàng )建包含資源 requests 的 pod 412
14.1.2 資源 requests 如何影響調度 413
14.1.3 CPU requests 如何影響 CPU 時(shí)間分配 418
14.1.4 定義和申請自定義資源 418
14.2 限制容器的可用資源 419
14.3 了解 pod QoS 等級 423
14.4 為命名空間中的 pod 設置默認的 requests 和 limits 427
14.5 限制命名空間中的可用資源總量 431
14.6 監控 pod 的資源使用量 436
14.7 本章小結 442
15 自動(dòng)橫向伸縮 pod 與集群節點(diǎn) 443
15.1 pod 的橫向自動(dòng)伸縮 444
15.2 pod 的縱向自動(dòng)伸縮 456
15.3 集群節點(diǎn)的橫向伸縮 457
15.4 本章小結 461
16 高級調度463
16.1 使用污點(diǎn)和容忍度阻止節點(diǎn)調度到特定節點(diǎn) 463
16.2 使用節點(diǎn)親緣性將 pod 調度到特定節點(diǎn)上 469
16.3 使用 pod 親緣性與非親緣性對 pod 進(jìn)行協(xié)同部署 475
16.4 本章小結 483
17 開(kāi)發(fā)應用的最佳實(shí)踐 485
17.1 集中一切資源 486
17.2 了解 pod 的生命周期 487
17.3 確保所有的客戶(hù)端請求都得到了妥善處理 500
17.4 讓?xiě)迷?Kubernetes 中方便運行和管理 505
17.5 開(kāi)發(fā)和測試的最佳實(shí)踐 510
17.6 本章小結 515
18 Kubernetes 應用擴展 517
18.1 定義自定義 API 對象 517
18.2 使用 Kubernetes 服務(wù)目錄擴展 Kubernetes 528
18.3 基于 Kubernetes 搭建的平臺 536
18.4 本章小結 541
A 在多個(gè)集群中使用 kubectl 543
B 使用 kubeadm 配置多節點(diǎn)集群 549
C 使用其他容器運行時(shí) 563
D Cluster Federation 567