-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathkubernetes.txt
1734 lines (1182 loc) · 40.3 KB
/
kubernetes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
第1章 Kubernetes入门 1
1.1 Kubernetes是什么 1
1.2 为什么要用Kubernetes 4
1.3 从一个简单的例子开始 5
1.3.1 环境准备 6
1.3.2 启动MySQL服务 6
1.3.3 启动Tomcat应用 9
1.3.4 通过浏览器访问网页 10
1.4 Kubernetes基本概念和术语 12
1.4.1 Master 12
1.4.2 Node 12
1.4.3 Pod 15
1.4.4 Label(标签) 18
1.4.5 Replication Controller 22
1.4.6 Deployment 26
1.4.7 Horizontal Pod Autoscaler 28
1.4.8 StatefulSet 29
1.4.9 Service(服务) 30
1.4.10 Volume(存储卷) 37
1.4.11 Persistent Volume 41
1.4.12 Namespace(命名空间) 42
1.4.13 Annotation(注解) 43
1.4.14 小结 44
第2章 Kubernetes实践指南 45
2.1 Kubernetes安装与配置 45
2.1.1 系统要求 45
2.1.2 使用kubeadm工具快速安装Kubernetes集群 46
2.1.3 以二进制文件方式安装Kubernetes集群 51
2.1.4 Kubernetes集群的安全设置 59
2.1.5 Kubernetes集群的网络配置 64
2.1.6 内网中的Kubernetes相关配置 64
2.1.7 Kubernetes的版本升级 65
2.1.8 Kubernetes核心服务配置详解 66
2.2 kubectl命令行工具用法详解 86
2.2.1 kubectl用法概述 86
2.2.2 kubectl子命令详解 88
2.2.3 kubectl参数列表 90
2.2.4 kubectl输出格式 90
2.2.5 kubectl操作示例 92
2.3 深入掌握Pod 93
2.3.1 Pod定义详解 93
2.3.2 Pod的基本用法 98
2.3.3 静态Pod 103
2.3.4 Pod容器共享Volume 104
2.3.5 Pod的配置管理 106
2.3.6 在容器内获取Pod信息(Downward API) 119
2.3.7 Pod生命周期和重启策略 124
2.3.8 Pod健康检查 125
2.3.9 玩转Pod调度 127
2.3.10 Init Container(初始化容器) 149
2.3.11 Pod的升级和回滚 152
2.3.12 Pod的扩容和缩容 166
2.3.13 使用StatefulSet搭建MongoDB集群 171
2.4 深入掌握Service 180
2.4.1 Service定义详解 181
2.4.2 Service基本用法 182
2.4.3 Headless Service 187
2.4.4 集群外部访问Pod或Service 192
2.4.5 DNS服务搭建指南 196
2.4.6 自定义DNS和上游DNS服务器 204
2.4.7 Ingress:HTTP 7层路由机制 208
第3章 Kubernetes核心原理 226
3.1 Kubernetes API Server 原理分析 226
3.1.1 Kubernetes API Server概述 226
3.1.2 独特的Kubernetes Proxy API接口 229
3.1.3 集群功能模块之间的通信 230
3.2 Controller Manager 原理分析 231
3.2.1 Replication Controller 232
3.2.2 Node Controller 234
3.2.3 ResourceQuota Controller 235
3.2.4 Namespace Controller 237
3.2.5 Service Controller与Endpoint Controller 237
3.3 Scheduler原理分析 238
3.4 kubelet运行机制分析 242
3.4.1 节点管理 242
3.4.2 Pod管理 243
3.4.3 容器健康检查 244
3.4.4 cAdvisor资源监控 245
3.5 kube-proxy 运行机制分析 247
3.6 深入分析集群安全机制 251
3.6.1 API Server认证管理(Authentication) 251
3.6.2 API Server授木又管理(Authorization) 253
3.6.3 Admission Control(准入控制) 272
3.6.4 Service Account 274
3.6.5 Secret私密凭据 279
3.7 网络原理 282
3.7.1 Kubernetes网络模型 282
3.7.2 Docker的网络基础 284
3.7.3 Docker的网络实现 296
3.7.4 Kubernetes的网络实现 304
3.7.5 Pod和Service网络实战 308
3.7.6 CNI网络模型 321
3.7.7 Kubernetes网络策略 331
3.7.8 开源的网络组件 333
3.8 共享存储原理 363
3.8.1 共享存储机制概述 363
3.8.2 PV详解 364
3.8.3 PVC详解 368
3.8.4 PV和PVC的生命周期 370
3.8.5 StorageClass详解 373
3.8.6 动态存储管理实战:GlusterFS 376
第4章 Kubernetes开发指南 388
4.1 REST简述 388
4.2 Kubernetes API详解 390
4.2.1 Kubernetes API概述 390
4.2.2 API版本 395
4.2.3 API Groups(API组) 395
4.2.4 API方法说明 397
4.2.5 API响应说明 398
4.3 使用Java程序访问Kubernetes API 400
4.3.1 Jersey 401
4.3.2 Fabric8 412
4.3.3 使用说明 413
第5章 Kubernetes运维指南 434
5.1 Kubernetes集群管理指南 434
5.1.1 Node的管理 434
5.1.2 更新资源对象的Label 436
5.1.3 Namespace:集群环境共享与隔离 437
5.1.4 Kubernetes资源管理 441
5.1.5 资源紧缺时的Pod驱逐机制 475
5.1.6 Pod Disruption Budget(主动驱逐保护) 483
5.1.7 Kubernetes集群的高可用部署方案 485
5.1.8 Kubernetes集群监控 496
5.1.9 集群统一日志管理 513
5.1.10 Kubernetes审计日志(Audit Log) 522
5.1.11 使用Web UI(Dashboard)管理集群 523
5.1.12 Helm:Kubernetes应用包管理工具 527
5.2 Trouble Shooting指导 538
5.2.1 查看系统Event事件 538
5.2.2 查看容器日志 540
5.2.3 查看Kubernetes服务日志 541
5.2.4 常见问题 542
5.2.5 寻求帮助 546
5.3 Kubernetes开发中的新功能 546
5.3.1 Pod Preset(运行时参数注入策略) 546
5.3.2 Cluster Federation(集群联邦) 553
5.3.3 容器运行时接口(Container Runtime Interface-CRI) 557
5.3.4 对GPU的支持 561
5.3.5 Kubernetes的演进路线(Roadmap)和开发模式 565
第6章 Kubernetes源码导读 568
6.1 Kubernetes源码结构和编译步骤 568
6.2 kube-apiserver进程源码分析 572
6.2.1 进程启动过程 572
6.2.2 关键代码分析 574
6.2.3 设计总结 589
6.3 kube-controller-manager进程源码分析 592
6.3.1 进程启动过程 592
6.3.2 关键代码分析 595
6.3.3 设计总结 603
6.4 kube-scheduler进程源码分析 605
6.4.1 进程启动过程 605
6.4.2 关键代码分析 610
6.4.3 设计总结 617
6.5 kubelet进程源码分析 619
6.5.1 进程启动过程 619
6.5.2 关键代码分析 624
6.5.3 设计总结 647
6.6 kube-proxy进程源码分析 648
6.6.1 进程启动过程 648
6.6.2 关键代码分析 650
6.6.3 设计总结 665
6.7 kubectl进程源码分析 666
6.7.1 kubectl create命令 667
6.7.2 rolling-update命令 671
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 注解 pod73
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 创建和检查 ReplicaSet106
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.3 限制 pod 使用安全相关的特性 396
13.4 隔离 pod 的网络 406
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.3 了解 pod QoS 等级 423
14.4 为命名空间中的 pod 设置默认的 requests 和 limits 427
14.5 限制命名空间中的可用资源总量 431
14.6 监控 pod 的资源使用量 436
14.7 本章小结 442
15 自动横向伸缩 pod 与集群节点 443
15.1 pod 的横向自动伸缩 444
15.2 pod 的纵向自动伸缩 456
15.3 集群节点的横向伸缩 457
15.4 本章小结 461
16 高级调度463
16.1 使用污点和容忍度阻止节点调度到特定节点 463
16.2 使用节点亲缘性将 pod 调度到特定节点上 469
16.3 使用 pod 亲缘性与非亲缘性对 pod 进行协同部署 475
16.4 本章小结 483
17 开发应用的最佳实践 485
17.1 集中一切资源 486
17.2 了解 pod 的生命周期 487
17.3 确保所有的客户端请求都得到了妥善处理 500
17.4 让应用在 Kubernetes 中方便运行和管理 505
17.5 开发和测试的最佳实践 510
17.6 本章小结 515
18 Kubernetes 应用扩展 517
18.1 定义自定义 API 对象 517
18.2 使用 Kubernetes 服务目录扩展 Kubernetes 528
18.3 基于 Kubernetes 搭建的平台 536
18.4 本章小结 541
A 在多个集群中使用 kubectl 543
B 使用 kubeadm 配置多节点集群 549
C 使用其他容器运行时 563
D Cluster Federation 567
第1章 Kubernetes入门 1
1.1 Kubernetes是什么 1
1.2 为什么要用Kubernetes 4
1.3 从一个简单的例子开始 5
1.3.1 环境准备 6
1.3.2 启动MySQL服务 6
1.3.3 启动Tomcat应用 9
1.3.4 通过浏览器访问网页 10
1.4 Kubernetes基本概念和术语 12
1.4.1 Master 12
1.4.2 Node 12
1.4.3 Pod 15
1.4.4 Label(标签) 18
1.4.5 Replication Controller 22
1.4.6 Deployment 26
1.4.7 Horizontal Pod Autoscaler 28
1.4.8 StatefulSet 29
1.4.9 Service(服务) 30
1.4.10 Volume(存储卷) 37
1.4.11 Persistent Volume 41
1.4.12 Namespace(命名空间) 42
1.4.13 Annotation(注解) 43
1.4.14 小结 44
第2章 Kubernetes实践指南 45
2.1 Kubernetes安装与配置 45
2.1.1 系统要求 45
2.1.2 使用kubeadm工具快速安装Kubernetes集群 46
2.1.3 以二进制文件方式安装Kubernetes集群 51
2.1.4 Kubernetes集群的安全设置 59
2.1.5 Kubernetes集群的网络配置 64
2.1.6 内网中的Kubernetes相关配置 64
2.1.7 Kubernetes的版本升级 65
2.1.8 Kubernetes核心服务配置详解 66
2.2 kubectl命令行工具用法详解 86
2.2.1 kubectl用法概述 86
2.2.2 kubectl子命令详解 88
2.2.3 kubectl参数列表 90
2.2.4 kubectl输出格式 90
2.2.5 kubectl操作示例 92
2.3 深入掌握Pod 93
2.3.1 Pod定义详解 93
2.3.2 Pod的基本用法 98
2.3.3 静态Pod 103
2.3.4 Pod容器共享Volume 104
2.3.5 Pod的配置管理 106
2.3.6 在容器内获取Pod信息(Downward API) 119
2.3.7 Pod生命周期和重启策略 124
2.3.8 Pod健康检查 125
2.3.9 玩转Pod调度 127
2.3.10 Init Container(初始化容器) 149
2.3.11 Pod的升级和回滚 152
2.3.12 Pod的扩容和缩容 166
2.3.13 使用StatefulSet搭建MongoDB集群 171
2.4 深入掌握Service 180
2.4.1 Service定义详解 181
2.4.2 Service基本用法 182
2.4.3 Headless Service 187
2.4.4 集群外部访问Pod或Service 192
2.4.5 DNS服务搭建指南 196
2.4.6 自定义DNS和上游DNS服务器 204
2.4.7 Ingress:HTTP 7层路由机制 208
第3章 Kubernetes核心原理 226
3.1 Kubernetes API Server 原理分析 226
3.1.1 Kubernetes API Server概述 226
3.1.2 独特的Kubernetes Proxy API接口 229
3.1.3 集群功能模块之间的通信 230
3.2 Controller Manager 原理分析 231
3.2.1 Replication Controller 232
3.2.2 Node Controller 234
3.2.3 ResourceQuota Controller 235
3.2.4 Namespace Controller 237
3.2.5 Service Controller与Endpoint Controller 237
3.3 Scheduler原理分析 238
3.4 kubelet运行机制分析 242
3.4.1 节点管理 242
3.4.2 Pod管理 243
3.4.3 容器健康检查 244
3.4.4 cAdvisor资源监控 245
3.5 kube-proxy 运行机制分析 247
3.6 深入分析集群安全机制 251
3.6.1 API Server认证管理(Authentication) 251
3.6.2 API Server授木又管理(Authorization) 253
3.6.3 Admission Control(准入控制) 272
3.6.4 Service Account 274
3.6.5 Secret私密凭据 279
3.7 网络原理 282
3.7.1 Kubernetes网络模型 282
3.7.2 Docker的网络基础 284
3.7.3 Docker的网络实现 296
3.7.4 Kubernetes的网络实现 304
3.7.5 Pod和Service网络实战 308
3.7.6 CNI网络模型 321
3.7.7 Kubernetes网络策略 331
3.7.8 开源的网络组件 333
3.8 共享存储原理 363
3.8.1 共享存储机制概述 363
3.8.2 PV详解 364
3.8.3 PVC详解 368
3.8.4 PV和PVC的生命周期 370
3.8.5 StorageClass详解 373
3.8.6 动态存储管理实战:GlusterFS 376
第4章 Kubernetes开发指南 388
4.1 REST简述 388
4.2 Kubernetes API详解 390
4.2.1 Kubernetes API概述 390
4.2.2 API版本 395
4.2.3 API Groups(API组) 395
4.2.4 API方法说明 397
4.2.5 API响应说明 398
4.3 使用Java程序访问Kubernetes API 400
4.3.1 Jersey 401
4.3.2 Fabric8 412
4.3.3 使用说明 413
第5章 Kubernetes运维指南 434
5.1 Kubernetes集群管理指南 434
5.1.1 Node的管理 434
5.1.2 更新资源对象的Label 436
5.1.3 Namespace:集群环境共享与隔离 437
5.1.4 Kubernetes资源管理 441
5.1.5 资源紧缺时的Pod驱逐机制 475
5.1.6 Pod Disruption Budget(主动驱逐保护) 483
5.1.7 Kubernetes集群的高可用部署方案 485
5.1.8 Kubernetes集群监控 496
5.1.9 集群统一日志管理 513
5.1.10 Kubernetes审计日志(Audit Log) 522
5.1.11 使用Web UI(Dashboard)管理集群 523
5.1.12 Helm:Kubernetes应用包管理工具 527
5.2 Trouble Shooting指导 538
5.2.1 查看系统Event事件 538
5.2.2 查看容器日志 540
5.2.3 查看Kubernetes服务日志 541
5.2.4 常见问题 542
5.2.5 寻求帮助 546
5.3 Kubernetes开发中的新功能 546
5.3.1 Pod Preset(运行时参数注入策略) 546
5.3.2 Cluster Federation(集群联邦) 553
5.3.3 容器运行时接口(Container Runtime Interface-CRI) 557
5.3.4 对GPU的支持 561
5.3.5 Kubernetes的演进路线(Roadmap)和开发模式 565
第6章 Kubernetes源码导读 568
6.1 Kubernetes源码结构和编译步骤 568
6.2 kube-apiserver进程源码分析 572
6.2.1 进程启动过程 572
6.2.2 关键代码分析 574
6.2.3 设计总结 589
6.3 kube-controller-manager进程源码分析 592
6.3.1 进程启动过程 592
6.3.2 关键代码分析 595
6.3.3 设计总结 603
6.4 kube-scheduler进程源码分析 605
6.4.1 进程启动过程 605
6.4.2 关键代码分析 610
6.4.3 设计总结 617
6.5 kubelet进程源码分析 619
6.5.1 进程启动过程 619
6.5.2 关键代码分析 624
6.5.3 设计总结 647
6.6 kube-proxy进程源码分析 648
6.6.1 进程启动过程 648
6.6.2 关键代码分析 650
6.6.3 设计总结 665
6.7 kubectl进程源码分析 666
6.7.1 kubectl create命令 667
6.7.2 rolling-update命令 671
第1章Kubernetes系统基础 1
1.1容器技术概述 1
1.1.1容器技术的功用 2
1.1.2容器简史 3
1.1.3Docker的功能限制 4
1.2Kubernetes概述 4
1.2.1Kubernetes简史 4
1.2.2Kubernetes特性 5
1.2.3Kubernetes概念和术语 6
1.3Kubernetes集群组件 10
1.3.1Master组件 10
1.3.2Node组件 12
1.3.3核心附件 13
1.4Kubernetes网络模型基础 13
1.4.1网络模型概述 13
1.4.2集群上的网络通信 15
1.5本章小结 16
第2章Kubernetes快速入门 17
2.1Kubernetes的核心对象 17
2.1.1Pod资源对象 18
2.1.2Controller 19
2.1.3Service 20
2.1.4部署应用程序的主体过程 21
2.2部署Kubernetes集群 22
2.2.1kubeadm部署工具 22