●1Kubernetes介紹1
1.1Kubernetes繫統的需求2
1.1.1從單體應用到微服務2
1.1.2為應用程序提供一個一致的環境5
1.1.3邁向持續交付:DevOps和無運維6
1.2介紹容器技術7
1.2.1什麼是容器7
1.2.2Docker容器平臺介紹11
1.2.3rkt——一個Docker的替代方案14
1.3Kubernetes介紹15
1.3.1初衷15
1.3.2深入淺出地了解Kubernetes15
1.3.3Kubernetes集群架構17
1.3.4在Kubernetes中運行應用18
1.3.5使用Kubernetes的好處20
1.4本章小結22
2開始使用Kubernetes和Docker23
2.1創建、運行及共享容器鏡像23
2.1.1安裝Docker並運行HelloWorld容器24
2.1.2創建一個簡單的Node.js應用26
2.1.3為鏡像創建Dockerfile27
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使用GoogleKubernetesEngine托管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介紹Kubernetesdashboard50
2.4本章小結51
3pod:運行於Kubernetes中的容器53
3.1介紹pod53
3.1.1為何需要pod54
3.1.2了解pod55
3.1.3通過pod合理管理容器56
3.2以YAML或JSON描述文件創建pod58
3.2.1檢查現有pod的YAML描述文件59
3.2.2為pod創建一個簡單的YAML描述文件61
3.2.3使用kubectlcreate來創建pod63
3.2.4查看應用程序日志64
3.2.5向pod發送請求65
3.3使用標簽組織pod66
3.3.1介紹標簽66
3.3.2創建pod時指定標簽67
3.3.3修改現有pod的標簽68
3.4通過標簽選擇器列出pod子集69
3.4.1使用標簽選擇器列出pod69
3.4.2在標簽選擇器中使用多個條件71
3.5使用標簽和選擇器來約束pod調度71
3.5.1使用標簽分類工作節點72
3.5.2將pod調度到特定節點72
3.5.3調度到一個特定節點73
3.6注解pod73
3.6.1查找對像的注解74
3.6.2添加和修改注解74
3.7使用命名空間對資源進行分組75
3.7.1了解對命名空間的需求75
3.7.2發現其他命名空間及其pod75
3.7.3創建一個命名空間76
3.7.4管理其他命名空間中的對像77
3.7.5命名空間提供的隔離78
3.8停止和移除pod78
3.8.1按名稱刪除pod78
3.8.2使用標簽選擇器刪除pod79
3.8.3通過刪除整個命名空間來刪除pod80
3.8.4刪除命名空間中的所有pod,但保留命名空間80
3.8.5刪除命名空間中的(幾乎)所有資源80
3.9本章小結81
4副本機制和其他控制器:部署托管的pod83
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了解ReplicationController89
4.2.1ReplicationController的操作90
4.2.2創建一個ReplicationController92
4.2.3使用ReplicationController94
4.2.4將pod移入或移出ReplicationController的作用域97
4.2.5修改pod模板100
4.2.6水平縮放pod101
4.2.7刪除一個ReplicationController103
4.3使用ReplicaSet而不是ReplicationController104
4.3.1比較ReplicaSet和ReplicationController104
4.3.2定義ReplicaSet105
4.3.3創建和檢查ReplicaSet106
4.3.4使用ReplicaSet的更富表達力的標簽選擇器106
4.3.5ReplicaSet小結107
4.4使用DaemonSet在每個節點上運行一個pod107
4.4.1使用DaemonSet在每個節點上運行一個pod108
4.4.2使用DaemonSet隻在特定的節點上運行pod109
4.5運行執行單個任務的pod112
4.5.1介紹Job資源112
4.5.2定義Job資源113
4.5.3看Job運行一個pod114
4.5.4在Job中運行多個pod實例114
4.5.5Jobpod完成任務的時間116
4.6安排Job定期運行或在將來運行一次116
4.6.1創建一個CronJob116
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介紹服務endpoint133
5.2.2手動配置服務的endpoint133
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.5pod就緒後發出信號150
5.5.1介紹就緒探針151
5.5.2向pod添加就緒探針152
5.5.3了解就緒探針的實際作用154
5.6使用headless服務來發現獨立的pod155
5.6.1創建headless服務156
5.6.2通過DNS發現pod156
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卷的繫統pod172
6.4使用持久化存儲173
6.4.1使用GCE持久磁盤作為pod存儲卷174
6.4.2通過底層持久化存儲使用其他類型的卷177
6.5從底層存儲技術解耦pod179
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
7ConfigMap和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.1ConfigMap介紹202
7.4.2創建ConfigMap203
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介紹Secret218
7.5.2默認令牌Secret介紹218
7.5.3創建Secret220
7.5.4對比ConfigMap與Secret221
7.5.5在pod中使用Secret222
7.6本章小結228
8從應用訪問數據以及其他資源229
8.1通過DownwardAP數據229
8.1.1了解數據230
8.1.2通過環境變數據231
8.1.3通過downwardAPI卷數據234
8.2與KubernetesAPI服務器交互237
8.2.1探究KubernetesRESTAPI238
8.2.2從pod內部與API服務器進行交互242
8.2.3通過ambassador容器簡化與API服務器的交互248
8.2.4使用客戶端庫與API服務器交互251
8.3本章小結253
9Deployment:聲明式地升級應用255
9.1更新運行在pod內的應用程序256
9.1.1刪除舊版本pod,使用新版本pod替換257
9.1.2先創建新pod再刪除舊版本pod257
9.2使用ReplicationController實現自動的滾動升級259
9.2.1運行第一個版本的應用259
9.2.2使用kubectl來執行滾動式升級261
9.2.3為什麼kubectlrolling-update已經過時265
9.3使用Deployment聲明式地升級應用.266
9.3.1創建一個Deployment267
9.3.2升級Deployment269
9.3.3回滾Deployment273
9.3.4控制滾動升級速率276
9.3.5暫停滾動升級278
9.3.6阻止出錯版本的滾動升級279
9.4本章小結284
10StatefulSet:部署有狀態的多副本應用285
10.1復制有狀態pod285
10.1.1運行每個實例都有單獨存儲的多副本286
10.1.2每個pod都提供穩定的標識287
10.2了解Statefulset289
10.2.1對比Statefulset和ReplicaSet289
10.2.2提供穩定的網絡標識290
10.2.3為每個有狀態實例提供穩定的專屬存儲292
10.2.4Statefulset的保障294
10.3使用Statefulset295
10.3.1創建應用和容器鏡像295
10.3.2通過Statefulset部署應用296
10.3.3使用你的pod301
10.4在Statefulset中發現伙伴節點305
10.4.1通過DNS實現伙伴間彼此發現306
10.4.2更新Statefulset308
10.4.3嘗試集群數據存儲309
10.5了解Statefulset如何處理節點失效310
10.5.1模擬一個節點的網絡斷開310
10.5.2手動刪除pod312
10.6本章小結313
11了解Kubernetes機理315
11.1了解架構315
11.1.1Kubernetes組件的分布式特性316
11.1.2Kubernetes如何使用etcd318
11.1.3API服務器做了什麼322
11.1.4API服務器如何通知客戶端資源變更324
11.1.5了解調度器325
11.1.6介紹控制器管理器中運行的控制器327
11.1.7Kubelet做了什麼331
11.1.8KubernetesServiceProxy的作用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-proxy344
11.5.2kube-proxy如何使用iptables344
11.6運行高可用集群346
11.6.1讓你的應用變得高可用346
11.6.2讓Kubernetes控制平面變得高可用347
11.7本章小結350
12KubernetesAPI服務器的安全防護351
12.1了解認證機制351
12.1.1用戶和組352
12.1.2ServiceAccount介紹353
12.1.3創建ServiceAccount354
12.1.4將ServiceAccount分配給pod356
12.2通過基於角色的權限控制加強集群安全358
12.2.1介紹RBAC授權插件359
12.2.2介紹RBAC資源360
12.2.3使用Role和RoleBinding363
12.2.4使用ClusterRole和ClusterRoleBinding367
12.2.5了解默認的ClusterRole和ClusterRoleBinding376
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使用特權模式運行pod389
13.2.4為容器單獨添加內核功能390
13.2.5在容器中禁用內核功能391
13.2.6阻止對容器根文件繫統的寫入392
13.2.7容器使用不同用戶運行時共享存儲卷394
13.3pod使用安全相關的特性396
13.3.1PodSecurityPolicy資源介紹396
13.3.2了解runAsUser、fsGroup和supplementalGroup策略398
13.3.3配置允許、默認添加、禁止使用的內核功能400
13.3.4pod可以使用的存儲卷類型402
13.3.5對不同的用戶與組分配不同的PodSecurityPolicy402
13.4隔離pod的網絡406
13.4.1在一個命名空間中啟用網絡隔離406
13.4.2允許同一命名空間中的部分pod訪問一個服務端pod407
13.4.3在不同Kubernetes命名空間之間進行網絡隔離408
13.4.4使用CIDR隔離網絡409
13.4.5pod的對外訪問流量409
13.5本章小結410
14計算資源管理411
14.1為pod中的容器申請資源411
14.1.1創建包含資源requests的pod412
14.1.2資源requests如何影響調度413
14.1.3CPUrequests如何影響CPU時間分配418
14.1.4定義和申請自定義資源418
14.2容器的可用資源419
14.2.1設置容器可使用資源量的硬419
14.2.2超過limits421
14.2.3容器中的應用如何看待limits422
14.3了解podQoS等級423
14.3.1定義pod的QoS等級424
14.3.2內存不足時哪個進程會被殺死426
14.4為命名空間中的pod設置默認的requests和limits427
14.4.1LimitRange資源簡介428
14.4.2LimitRange對像的創建428
14.4.3強制進行430
14.4.4應用資源requests和limits的默認值430
14.5命名空間中的可用資源總量431
14.5.1ResourceQuota資源介紹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.1pod的橫向自動伸縮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.2pod的縱向自動伸縮456
15.2.1自動配置資源請求457
xxviii目錄
15.2.2修行中pod的資源請求457
15.3集群節點的橫向伸縮457
15.3.1ClusterAutoscaler介紹457
15.3.2啟用ClusterAutoscaler459
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的非親緣性分開調度pod481
16.4本章小結483
17開發應用的很好實踐485
17.1集中一切資源486
17.2了解pod的生命周期487
17.2.1應用必須預料到會被殺死或者重新調度487
17.2.2重新調度死亡的或者部分死亡的pod490
17.2.3以固定順序啟動pod491
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合理地給鏡像打標簽,正確地使用ImagePullPolicy506
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在開發過程中使用Minikube512
17.5.3發布版本和自動部署資源清單513
17.5.4使用Ksonnet作為編寫YAML/JSONmanifest
文件的額外選擇513
17.5.5利用持續集成和持續交付514
17.6本章小結515
18Kubernetes應用擴展517
18.1定義自定義API對像517
18.1.1CustomResourceDefinitions介紹518
18.1.2使用自定義控制器自動定制資源522
18.1.3驗證自定義對像526
18.1.4為自定義對像提供自定義API服務器527
18.2使用Kubernetes服務目錄擴展Kubernetes528
18.2.1服務目錄介紹529
18.2.2服務目錄API服務器與控制器管理器介紹530
18.2.3Service代理和OpenServiceBrokerAPI530
18.2.4提供服務與使用服務533
18.2.5解除綁定與取消配置535
18.2.6服務目錄給我們帶來了什麼535
18.3基於Kubernetes搭建的平臺536
18.3.1紅帽OpenShift容器平臺536
18.3.2DeisWorkflow與Helm539
18.4本章小結541
A在多個集群中使用kubectl543
B使用kubeadm配置多節點集群549
C使用其他容器運行時563
DClusterFederation567
本書主要講解如何在 Kubernetes 中部署分布式容器應用。本書開始部分概要介紹了 Docker 和Kubernetes 的由來和發展,然後通過在 Kubernetes 中部署一個應用程序,一點點增加功能,逐步加深我們對於Kubernetes架構的理解和操作的實踐。在本書的後面部分,也可以學習一些高階的主題,比如監控、調試及伸縮。Kubernetes是希臘文,意思是“舵手”,帶領我們安全地到達未知水域。Kubernetes這樣的容器編排繫統,會幫助我們妥善地管理分布式應用的部署結構和線上流量,高效地組織容器和服務。Kubernetes 作為數據中心操作繫統,在設計軟件繫統時,能夠盡量降低在底層網絡和硬件設施上的負擔。