1 Kubernetes 介紹 1
1.1 Kubernetes 係統的需求 2
1.1.1 從單體應用到微服務 2
1.1.2 為應用程序提供一個一緻的環境 5
1.1.3 邁嚮持續交付 :DevOps 和無運維 6
1.2 介紹容器技術 7
1.2.1 什麼是容器 7
1.2.2 Docker 容器平颱介紹 11
1.2.3 rkt——一個 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 開始使用 Kubernetes 和 Docker 23
2.1 創建、運行及共享容器鏡像 23
2.1.1 安裝 Docker 並運行 Hello World 容器 24
2.1.2 創建一個簡單的 Node.js 應用 26
2.1.3 為鏡像創建 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 運行一個本地單節點 Kubernetes 集群 34
2.2.2 使用 Google Kubernetes Engine 托管 Kubernetes 集群 36
2.2.3 為 kubectl 配置彆名和命令行補齊 39
2.3 在 Kubernetes 上運行第一個應用 40
2.3.1 部署 Node.js 應用 40
2.3.2 訪問 Web 應用 43
2.3.3 係統的邏輯部分 45
2.3.4 水平伸縮應用 46
2.3.5 查看應用運行在哪個節點上 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 通過 pod 閤理管理容器 56
3.2 以 YAML 或 JSON 描述文件創建 pod 58
3.2.1 檢查現有 pod 的 YAML 描述文件 59
3.2.2 為 pod 創建一個簡單的 YAML 描述文件 61
3.2.3 使用 kubectl create 來創建 pod 63
3.2.4 查看應用程序日誌 64
3.2.5 嚮 pod 發送請求 65
3.3 使用標簽組織 pod 66
3.3.1 介紹標簽 66
3.3.2 創建 pod 時指定標簽 67
3.3.3 修改現有 pod 的標簽 68
3.4 通過標簽選擇器列齣 pod 子集 69
3.4.1 使用標簽選擇器列齣 pod 69
3.4.2 在標簽選擇器中使用多個條件 71
3.5 使用標簽和選擇器來約束 pod 調度 71
3.5.1 使用標簽分類工作節點 72
3.5.2 將 pod 調度到特定節點 72
3.5.3 調度到一個特定節點 73
3.6 注解 pod 73
3.6.1 查找對象的注解 74
3.6.2 添加和修改注解 74
3.7 使用命名空間對資源進行分組 75
3.7.1 瞭解對命名空間的需求 75
3.7.2 發現其他命名空間及其 pod 75
3.7.3 創建一個命名空間 76
3.7.4 管理其他命名空間中的對象 77
3.7.5 命名空間提供的隔離 78
3.8 停止和移除 pod 78
3.8.1 按名稱刪除 pod 78
3.8.2 使用標簽選擇器刪除 pod 79
3.8.3 通過刪除整個命名空間來刪除 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 創建基於 HTTP 的存活探針 85
4.1.3 使用存活探針 86
4.1.4 配置存活探針的附加屬性 87
4.1.5 創建有效的存活探針 88
4.2 瞭解 ReplicationController 89
4.2.1 ReplicationController 的操作 90
4.2.2 創建一個 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 刪除一個 ReplicationController 103
4.3 使用 ReplicaSet 而不是 ReplicationController 104
4.3.1 比較 ReplicaSet 和 ReplicationController 104
4.3.2 定義 ReplicaSet 105
4.3.3 創建和檢查 ReplicaSet 106
4.3.4 使用 ReplicaSet 的更富錶達力的標簽選擇器 106
4.3.5 ReplicaSet 小結 107
4.4 使用 DaemonSet 在每個節點上運行一個 pod 107
4.4.1 使用 DaemonSet 在每個節點上運行一個 pod 108
4.4.2 使用 DaemonSet 隻在特定的節點上運行 pod 109
4.5 運行執行單個任務的 pod 112
4.5.1 介紹 Job 資源 112
4.5.2 定義 Job 資源 113
4.5.3 看 Job 運行一個 pod 114
4.5.4 在 Job 中運行多個 pod 實例 114
4.5.5 限製 Job pod 完成任務的時間 116
4.6 安排 Job 定期運行或在將來運行一次 116
4.6.1 創建一個 CronJob 116
4.6.2 瞭解計劃任務的運行方式 118
4.7 本章小結 118
5 服務 :讓客戶端發現 pod 並與之通信 121
5.1 介紹服務 122
5.1.1 創建服務 123
5.1.2 服務發現 129
5.2 連接集群外部的服務 132
5.2.1 介紹服務 endpoint 133
5.2.2 手動配置服務的 endpoint 133
5.2.3 為外部服務創建彆名 135
5.3 將服務暴露給外部客戶端 136
5.3.1 使用 NodePort 類型的服務 137
5.3.2 通過負載均衡器將服務暴露齣來 140
5.3.3 瞭解外部連接的特性 142
5.4 通過 Ingress 暴露服務 143
5.4.1 創建 Ingress 資源 145
5.4.2 通過 Ingress 訪問服務 146
5.4.3 通過相同的 Ingress 暴露多個服務 147
5.4.4 配置 Ingress 處理 TLS 傳輸 149
5.5 pod 就緒後發齣信號 150
5.5.1 介紹就緒探針 151
5.5.2 嚮 pod 添加就緒探針 152
5.5.3 瞭解就緒探針的實際作用 154
5.6 使用 headless 服務來發現獨立的 pod 155
5.6.1 創建 headless 服務 156
5.6.2 通過 DNS 發現 pod 156
5.6.3 發現所有的 pod——包括未就緒的 pod 157
5.7 排除服務故障 158
5.8 本章小結 159
6 捲 :將磁盤掛載到容器 161
6.1 介紹捲 162
6.1.1 捲的應用示例 162
6.1.2 介紹可用的捲類型 164
6.2 通過捲在容器之間共享數據 165
6.2.1 使用 emptyDir 捲 165
6.2.2 使用 Git 倉庫作為存儲捲 168
6.3 訪問工作節點文件係統上的文件 171
6.3.1 介紹 hostPath 捲 171
6.3.2 檢查使用 hostPath 捲的係統 pod 172
6.4 使用持久化存儲 173
6.4.1 使用 GCE 持久磁盤作為 pod 存儲捲 174
6.4.2 通過底層持久化存儲使用其他類型的捲 177
6.5 從底層存儲技術解耦 pod 179
6.5.1 介紹持久捲和持久捲聲明 179
6.5.2 創建持久捲 180
6.5.3 通過創建持久捲聲明來獲取持久捲 182
6.5.4 在 pod 中使用持久捲聲明 184
6.5.5 瞭解使用持久捲和持久捲聲明的好處 185
6.5.6 迴收持久捲 186
6.6 持久捲的動態捲配置 187
6.6.1 通過 StorageClass 資源定義可用存儲類型 188
6.6.2 請求持久捲聲明中的存儲類 188
6.6.3 不指定存儲類的動態配置 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 為容器設置環境變量 200
7.3.1 在容器定義中指定環境變量 201
7.3.2 在環境變量值中引用其他環境變量 201
7.3.3 瞭解硬編碼環境變量的不足之處 202
7.4 利用 ConfigMap 解耦配置 202
7.4.1 ConfigMap 介紹 202
7.4.2 創建 ConfigMap 203
7.4.3 給容器傳遞 ConfigMap 條目作為環境變量 206
7.4.4 一次性傳遞 ConfigMap 的所有條目作為環境變量 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 創建 Secret 220
7.5.4 對比 ConfigMap 與 Secret 221
7.5.5 在 pod 中使用 Secret 222
7.6 本章小結 228
8 從應用訪問 pod 元數據以及其他資源 229
8.1 通過 Downward API 傳遞元數據 229
8.1.1 瞭解可用的元數據 230
8.1.2 通過環境變量暴露元數據 231
8.1.3 通過 downwardAPI 捲來傳遞元數據 234
8.2 與 Kubernetes API 服務器交互 237
8.2.1 探究 Kubernetes REST API 238
8.2.2 從 pod 內部與 API 服務器進行交互 242
8.2.3 通過 ambassador 容器簡化與 API 服務器的交互 248
8.2.4 使用客戶端庫與 API 服務器交互 251
8.3 本章小結 253
9 Deployment: 聲明式地升級應用 255
9.1 更新運行在 pod 內的應用程序 256
9.1.1 刪除舊版本 pod,使用新版本 pod 替換 257
9.1.2 先創建新 pod 再刪除舊版本 pod 257
9.2 使用 ReplicationController 實現自動的滾動升級 259
9.2.1 運行第一個版本的應用 259
9.2.2 使用 kubectl 來執行滾動式升級 261
9.2.3 為什麼 kubectl rolling-update 已經過時 265
9.3 使用 Deployment 聲明式地升級應用 266
9.3.1 創建一個 Deployment 267
9.3.2 升級 Deployment 269
9.3.3 迴滾 Deployment 273
9.3.4 控製滾動升級速率 276
9.3.5 暫停滾動升級 278
9.3.6 阻止齣錯版本的滾動升級 279
9.4 本章小結 284
10 StatefulSet :部署有狀態的多副本應用 285
10.1 復製有狀態 pod 285
10.1.1 運行每個實例都有單獨存儲的多副本 286
10.1.2 每個 pod 都提供穩定的標識 287
10.2 瞭解 Statefulset 289
10.2.1 對比 Statefulset 和 ReplicaSet 289
10.2.2 提供穩定的網絡標識 290
10.2.3 為每個有狀態實例提供穩定的專屬存儲 292
10.2.4 Statefulset 的保障 294
10.3 使用 Statefulset 295
10.3.1 創建應用和容器鏡像 295
10.3.2 通過 Statefulset 部署應用 296
10.3.3 使用你的 pod 301
10.4 在 Statefulset 中發現夥伴節點 305
10.4.1 通過 DNS 實現夥伴間彼此發現 306
10.4.2 更新 Statefulset 308
10.4.3 嘗試集群數據存儲 309
10.5 瞭解 Statefulset 如何處理節點失效 310
10.5.1 模擬一個節點的網絡斷開 310
10.5.2 手動刪除 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 服務器做瞭什麼 322
11.1.4 API 服務器如何通知客戶端資源變更 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 控製器如何協作 335
11.2.1 瞭解涉及哪些組件 335
11.2.2 事件鏈 336
11.2.3 觀察集群事件 337
11.3 瞭解運行中的 pod 是什麼 339
11.4 跨 pod 網絡 340
11.4.1 網絡應該是什麼樣的 340
11.4.2 深入瞭解網絡工作原理 341
11.4.3 引入容器網絡接口 343
11.5 服務是如何實現的 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 服務器的安全防護 351
12.1 瞭解認證機製 351
12.1.1 用戶和組 352
12.1.2 ServiceAccount 介紹 353
12.1.3 創建 ServiceAccount 354
12.1.4 將 ServiceAccount 分配給 pod 356
12.2 通過基於角色的權限控製加強集群安全 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 保障集群內節點和網絡安全 381
13.1 在 pod 中使用宿主節點的 Linux 命名空間 381
13.1.1 在 pod 中使用宿主節點的網絡命名空間 382
13.1.2 綁定宿主節點上的端口而不使用宿主節點的網絡命名空間 383
13.1.3 使用宿主節點的 PID 與 IPC 命名空間 385
13.2 配置節點的安全上下文 386
13.2.1 使用指定用戶運行容器 387
13.2.2 阻止容器以 root 用戶運行 388
13.2.3 使用特權模式運行 pod 389
13.2.4 為容器單獨添加內核功能 390
13.2.5 在容器中禁用內核功能 391
13.2.6 阻止對容器根文件係統的寫入 392
13.2.7 容器使用不同用戶運行時共享存儲捲 394
13.3 限製 pod 使用安全相關的特性 396
13.3.1 PodSecurityPolicy 資源介紹 396
13.3.2 瞭解 runAsUser、 fsGroup 和 supplementalGroup 策略 398
13.3.3 配置允許、默認添加、禁止使用的內核功能 400
13.3.4 限製 pod 可以使用的存儲捲類型 402
13.3.5 對不同的用戶與組分配不同的 PodSecurityPolicy 402
13.4 隔離 pod 的網絡 406
13.4.1 在一個命名空間中啓用網絡隔離 406
13.4.2 允許同一命名空間中的部分 pod 訪問一個服務端 pod 407
13.4.3 在不同 Kubernetes 命名空間之間進行網絡隔離 408
13.4.4 使用 CIDR 隔離網絡 409
13.4.5 限製 pod 的對外訪問流量 409
13.5 本章小結 410
14 計算資源管理 411
14.1 為 pod 中的容器申請資源 411
14.1.1 創建包含資源 requests 的 pod 412
14.1.2 資源 requests 如何影響調度 413
14.1.3 CPU requests 如何影響 CPU 時間分配 418
14.1.4 定義和申請自定義資源 418
14.2 限製容器的可用資源 419
14.2.1 設置容器可使用資源量的硬限製 419
14.2.2 超過 limits 421
14.2.3 容器中的應用如何看待 limits 422
14.3 瞭解 pod QoS 等級 423
14.3.1 定義 pod 的 QoS 等級 424
14.3.2 內存不足時哪個進程會被殺死 426
14.4 為命名空間中的 pod 設置默認的 requests 和 limits 427
14.4.1 LimitRange 資源簡介 428
14.4.2 LimitRange 對象的創建 428
14.4.3 強製進行限製 430
14.4.4 應用資源 requests 和 limits 的默認值 430
14.5 限製命名空間中的可用資源總量 431
14.5.1 ResourceQuota 資源介紹 431
14.5.2 為持久化存儲指定配額 434
14.5.3 限製可創建對象的個數 434
14.5.4 為特定的 pod 狀態或者 QoS 等級指定配額 435
14.6 監控 pod 的資源使用量 436
14.6.1 收集、獲取實際資源使用情況 437
14.6.2 保存並分析曆史資源的使用統計信息 439
14.7 本章小結 442
15 自動橫嚮伸縮 pod 與集群節點 443
15.1 pod 的橫嚮自動伸縮 444
15.1.1 瞭解自動伸縮過程 444
15.1.2 基於 CPU 使用率進行自動伸縮 447
15.1.3 基於內存使用進行自動伸縮 453
15.1.4 基於其他自定義度量進行自動伸縮 453
15.1.5 確定哪些度量適閤用於自動伸縮 456
15.1.6 縮容到 0 個副本 456
15.2 pod 的縱嚮自動伸縮 456
15.2.1 自動配置資源請求 457
15.2.2 修改運行中 pod 的資源請求 457
15.3 集群節點的橫嚮伸縮 457
15.3.1 Cluster Autoscaler 介紹 457
15.3.2 啓用 Cluster Autoscaler 459
15.3.3 限製集群縮容時的服務乾擾 460
15.4 本章小結 461
16 高級調度 463
16.1 使用汙點和容忍度阻止節點調度到特定節點 463
16.1.1 介紹汙點和容忍度 464
16.1.2 在節點上添加自定義汙點 466
16.1.3 在 pod 上添加汙點容忍度 467
16.1.4 瞭解汙點和汙點容忍度的使用場景 467
16.2 使用節點親緣性將 pod 調度到特定節點上 469
16.2.1 指定強製性節點親緣性規則 470
16.2.2 調度 pod 時優先考慮某些節點 472
16.3 使用 pod 親緣性與非親緣性對 pod 進行協同部署 475
16.3.1 使用 pod 間親緣性將多個 pod 部署在同一個節點上 475
16.3.2 將 pod 部署在同一機櫃、可用性區域或者地理地域 478
16.3.3 錶達 pod 親緣性優先級取代強製性要求 479
16.3.4 利用 pod 的非親緣性分開調度 pod 481
16.4 本章小結 483
17 開發應用的最佳實踐 485
17.1 集中一切資源 486
17.2 瞭解 pod 的生命周期 487
17.2.1 應用必須預料到會被殺死或者重新調度 487
17.2.2 重新調度死亡的或者部分死亡的 pod 490
17.2.3 以固定順序啓動 pod 491
17.2.4 增加生命周期鈎子 493
17.2.5 瞭解 pod 的關閉 497
17.3 確保所有的客戶端請求都得到瞭妥善處理 500
17.3.1 在 pod 啓動時避免客戶端連接斷開 500
17.3.2 在 pod 關閉時避免客戶端連接斷開 501
17.4 讓應用在 Kubernetes 中方便運行和管理 505
17.4.1 構建可管理的容器鏡像 505
17.4.2 閤理地給鏡像打標簽,正確地使用 ImagePullPolicy 506
17.4.3 使用多維度而不是單維度的標簽 506
17.4.4 通過注解描述每個資源 506
17.4.5 給進程終止提供更多的信息 507
17.4.6 處理應用日誌 508
17.5 開發和測試的最佳實踐 510
17.5.1 開發過程中在 Kubernetes 之外運行應用 510
17.5.2 在開發過程中使用 Minikube 512
17.5.3 發布版本和自動部署資源清單 513
17.5.4 使用 Ksonnet 作為編寫 YAML/JSON manifest文件的額外選擇 513
17.5.5 利用持續集成和持續交付 514
17.6 本章小結 515
18 Kubernetes 應用擴展 517
18.1 定義自定義 API 對象 517
18.1.1 CustomResourceDefinitions 介紹 518
18.1.2 使用自定義控製器自動定製資源 522
18.1.3 驗證自定義對象 526
18.1.4 為自定義對象提供自定義 API 服務器 527
18.2 使用 Kubernetes 服務目錄擴展 Kubernetes 528
18.2.1 服務目錄介紹 529
18.2.2 服務目錄 API 服務器與控製器管理器介紹 530
18.2.3 Service 代理和 OpenServiceBroker API 530
18.2.4 提供服務與使用服務 533
18.2.5 解除綁定與取消配置 535
18.2.6 服務目錄給我們帶來瞭什麼 535
18.3 基於 Kubernetes 搭建的平颱 536
18.3.1 紅帽 OpenShift 容器平颱 536
18.3.2 Deis Workflow 與 Helm 539
18.4 本章小結 541
A 在多個集群中使用 kubectl 543
B 使用 kubeadm 配置多節點集群 549
C 使用其他容器運行時 563
D Cluster Federation 567
· · · · · · (
收起)