《Kubernetes in Action中文版》
内容简介
《Kubernetes in Action中文版》主要讲解如何在 Kubernetes 中部署分布式容器应用。《Kubernetes in Action中文版》开始部分概要介绍了 Docker 和Kubernetes 的由来和发展,然后通过在 Kubernetes 中部署一个应用程序,一点点增加功能,逐步加深我们对于Kubernetes架构的理解和操作的实践。在本书的后面部分,也可以学习一些高阶的主题,比如监控、调试及伸缩。 Kubernetes是希腊文,意思是“舵手”,带领我们安全地到达未知水域。Kubernetes这样的容器编排系统,会帮助我们妥善地管理分布式应用的部署结构和线上流量,高效地组织容器和服务。Kubernetes 作为数据中心操作系统,在设计软件系统时,能够尽量降低在底层网络和硬件设施上的负担。
作者简介
Marko Luksa是一位拥有20年以上专业开发经验的软件工程师,经手项目小到简单的Web应用,大到ERP系统、框架和中间件软件,应有尽有。在为Red Hat工作期间,他从Google App Engine API实现的开发起步, 这些API将基于Red Hat的JBoss中间件产品,之后他一直在为CDI/Weld、Infinispan/JBoss DataGrid等项目贡献力量。2014后, 他加入Red Hat的Cloud Enablement团队,负责 Kubernetes和相关技术开发的更新,保障公司的中间件软件能将Kubernetes与OpenShift特性的潜能用到极致。 译者简介 七牛容器云 (KIRK)团队,是负责七牛云基于自身公有云业务在容器方面的多年实践经验,针对企业应用快速部署、便捷运维打造的容器云计算平台。提供持续集成、弹性伸缩、应用市场等功能特性,使企业专注于业务逻辑开发,缩短业务上线周期,优化资源利用率,提高服务响应效率的一支技术团队。
目录
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.5限制Jobpod完成任务的时间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——包括未就绪的pod157
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从应用访问pod元数据以及其他资源229
8.1通过DownwardAPI传递元数据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.3限制pod使用安全相关的特性396
13.3.1PodSecurityPolicy资源介绍396
13.3.2了解runAsUser、fsGroup和supplementalGroup策略398
13.3.3配置允许、默认添加、禁止使用的内核功能400
13.3.4限制pod可以使用的存储卷类型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.5限制pod的对外访问流量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
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 in Action中文版 PDF 下载地址:
链接:https://pan.baidu.com/s/149Z9SuCgGlUyIg7yGc0irg?pwd=2rmh
提取码:2rmh
复制这段内容后打开百度网盘手机App,操作更方便哦