书海网短评:
适读人群:本书适合系统架构师、开发和测试人员、运维人员阅读,对企业IT主管、系统管理员、平台管理员、SRE人员等同样具有参考价值,当然也可作为高等院校云计算及容器技术方向的专业教材。Kubernetes容器编排系统安
Kubernetes容器编排系统安全地管理分布式应用的结构和流程,以极高的效率组织容器和服务。Kubernetes充当集群的操作系统,消除了在设计中考虑底层网络和服务器基础设施的需要。《Kubernetes in Action中文版》教你使用Kubernetes部署基于容器的分布式应用。在构建Kubernetes集群前,将从Docker和Kubernetes的概观开始学习。你将逐步扩展初始应用程序、添加特性并加深对Kubernetes架构和操作的了解。当你浏览这本全面的指南时,还将探索高级的主题,如监控、调优和扩容。《Kubernetes in Action中文版》包括:
◎Kubernetes内部原理
◎跨集群部署容器
◎保障集群的安全
◎不停机更新应用
《Kubernetes in Action中文版》主要讲解如何在Kubernetes中部署分布式容器应用。《Kubernetes in Action中文版》开始部分概要介绍了Docker和Kubernetes的由来和发展,然后通过在Kubernetes中部署一个应用程序,一点点增加功能,逐步加深我们对于Kubernetes架构的理解和操作的实践。在《Kubernetes in Action中文版》的后面部分,也可以学习一些高阶的主题,比如监控、调试及伸缩。
Kubernetes是希腊文,意思是“舵手”,带领我们安全地到达未知水域。Kubernetes这样的容器编排系统,会帮助我们妥善地管理分布式应用的部署结构和线上流量,高效地组织容器和服务。Kubernetes作为数据中心操作系统,在设计软件系统时,能够尽量降低在底层网络和硬件设施上的负担。
原著作者简介
MarkoLuksa是一位拥有20年以上专业开发经验的软件工程师,经手项目小到简单的Web应用,大到ERP系统、框架和中间件软件,应有尽有。在为RedHat工作期间,他从GoogleAppEngineAPI实现的开发起步,这些API将基于RedHat的JBoss中间件产品,之后他一直在为CDI/Weld、Infinispan/JBossDataGrid等项目贡献力量。2014后,他加入RedHat的CloudEnablement团队,负责Kubernetes和相关技术开发的更新,保障公司的中间件软件能将Kubernetes与OpenShift特性的潜能完全发挥出来。
译者简介
七牛容器云(KIRK)团队,是负责七牛云基于自身公有云业务在容器方面的多年实践经验,针对企业应用快速部署、便捷运维打造的容器云计算平台。提供持续集成、弹性伸缩、应用市场等功能特性,使企业专注于业务逻辑开发,缩短业务上线周期,优化资源利用率,提高服务响应效率的一支技术团队。
“这《Kubernetes in Action中文版》专业且详尽。作者以实例的方式教授如何管理任何分布式和可伸缩应用程序的完整生命周期。”
——AntonioMagnaghi,System1
“《Kubernetes in Action中文版》突出的亮点是使用了真实的例子。不只是应用概念,还进行实际操作使用。”
——PaoloAntinori,RedHat
“《Kubernetes in Action中文版》深入讨论了Kubernetes及其相关技术。你值得拥有!”
——AlKrinker,USPTO
“从零经验到专业Kubernetes使用者的基础读物。”
——CsabaSari,ChimeraEntertainment
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 深入浅出地了解Kubernetes15
1.3.3 Kubernetes集群架构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
3 pod:运行于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.1 ReplicationController的操作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.5 ReplicaSet小结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.5 pod就绪后发出信号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
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 创建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
9 Deployment:声明式地升级应用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
10 StatefulSet:部署有状态的多副本应用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.4 Statefulset的保障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.1 Kubernetes组件的分布式特性316
11.1.2 Kubernetes如何使用etcd318
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 KubernetesServiceProxy的作用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.2 kube-proxy如何使用iptables344
11.6 运行高可用集群346
11.6.1 让你的应用变得高可用346
11.6.2 让Kubernetes控制平面变得高可用347
11.7 本章小结350
12 KubernetesAPI服务器的安全防护351
12.1 了解认证机制351
12.1.1 用户和组352
12.1.2 ServiceAccount介绍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.3 限制pod使用安全相关的特性396
13.4 隔离pod的网络406
13.5 本章小结410
14 计算资源管理411
14.1 为pod中的容器申请资源411
14.1.1 创建包含资源requests的pod412
14.1.2 资源requests如何影响调度413
14.1.3 CPUrequests如何影响CPU时间分配418
14.1.4 定义和申请自定义资源418
14.2 限制容器的可用资源419
14.3 了解podQoS等级423
14.4 为命名空间中的pod设置默认的requests和limits427
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服务目录扩展Kubernetes528
18.3 基于Kubernetes搭建的平台536
18.4 本章小结541
A 在多个集群中使用kubectl543
B 使用kubeadm配置多节点集群549
C 使用其他容器运行时563
D ClusterFederation567
推荐序
2013年,Docker问世,由于其简练易用的使用范式,极大降低了容器技术的使用门槛,引爆了容器技术,一场轰轰烈烈的由容器带来的新计算革命开始了。
2014年,预见到了容器带来的革命性变化,七牛内部成立了一个新项目——QCOS,全称为QiniuCloudOperatingSystem(也可以理解为QiniuClusterOperatingSystem),目标是实现一个数据中心操作系统,让开发人员使用数据中心如同使用一台机器一样容易。在当时,Kubernetes项目也刚刚开始,还在规格设计阶段。我们通读了Kubernetes的设计,决定自己干。这是一个非常疯狂的想法。促使我们决定自己干的原因有两点:一是我们存储也自己干,而且干成了,所以计算自己干,也不无成功的可能;二是Kubernetes刚开始,一切如果跟随Kubernetes,那么我们做起事情来肯定束手束脚,没办法按照商业公司的推进速度来推进。
但是做着做着我们就发现,计算不像存储,计算问题是一个非常开放性的问题。而以容器为核心的计算系统,其复杂性也不同于以虚拟机(VM)为代表的计算系统,因为虚拟机(VM)是以虚拟一台机器为边界的,其问题域同样比较闭合。但是容器计算就是要打破机器的边界,让计算力在数据中心内自由调度。这个问题域涉及面非常广,除了常规的计算力调度、负载均衡、部署升级、服务发现、日志与监控,这些东西都要以全新的方式来解决。
实际上给数据中心做一个操作系统并不是什么新想法。20世纪80年代中期,贝尔实验室就开启了一个名为Plan9的操作系统项目,目的就是做一个数据中心操作系统。参与这个操作系统的名单都大名鼎鼎:RobPike、KenThompson,等等。你没看错,就是今天创建了Go语言的那帮人。他们在Plan9项目解散后被Google抢了过去,换了一个思路继续做数据中心操作系统——从面向数据中心的语言开始:Go语言就这样诞生了。而随着Go语言的流行,Docker、Kubernetes接连诞生,继续续写着数据中心操作系统的梦想。
Kubernetes诞生之初,虽然嘴里衔着GoogleBorg系统的金钥匙,但是同期竞争的项目还是比较多的,除了七牛自己内部发起的QCOS外,比较知名的还有DockerSwam和Mesos。但是到了2016年,这场竞争越来越趋于Kubernetes一统天下。七牛内部QCOS项目也放弃了自研,将方向转向了Kubernetes阵营。
QCOS项目对七牛有着特殊的意义,它是七牛业务多元化的开始。在此之前,七牛秉承专注做好一件事情,着眼于对象存储一个点,从单点切入,把单点做到极致的思路,获得了极佳的口碑,大量的移动互联网应用都选择了七牛作为它们的图片和视频托管的云服务提供商。选择做QCOS,实际上是我们在打第二个根据地时,选择了一条极其艰难的道路。
今天我们QCOS团队(内部已更名为KIRK团队)发起了KubernetesinAction一书的翻译,他们邀请我给译本作序,我脑子里不由自主想起了这段历史。选择基于Kubernetes,是我们从商业上来说的务实选择,但是它并不代表放弃自主研发,只是把梦想暂时封存在心里。中国古话说,师夷长技以制夷,别人的好东西我们是要学习的,学好了我们才能完成从模仿到超越的过程。
Kubernetes的背后,是一场新计算革命,是真正的云计算2.0,我们期待更多有想法的开发者能够学习Kubernetes,能够加入这场计算革命。也欢迎大家加入七牛。
是为序。
许式伟七牛云CEO
译者序
早在2011年创业初期,七牛就决定使用GoLang作为主要开发语言,那时距离GoLang1.0的正式发布还有将近一年的时间。当时我们就断定,在分布式时代,GoLang这种语言必定会大放异彩。今天,七牛的绝大多数线上服务都是用GoLang实现的,Golang帮助我们以最高的效率实现应用,快速响应客户需求。现在,我们也很幸运地看到当前最热门的开源项目如Docker、Kubernetes等,也都是基于GoLang来实现的。
就像早期拥抱GoLang一样,七牛也是Docker和Kubernetes技术的坚定拥抱者和践行者。早在2014年,我们就基于Docker自研了一套容器集群管理系统,用于图片、音视频转码应用实例的资源调度,这套系统在线上运行了好几年,现在正逐渐被Kubernetes替代。
Docker和Kubernetes的出现,让我们发现了构建数据中心操作系统(DCOS)的可能性。Docker的轻量级、Kubernetes的灵活性和开放性,能让我们以API调用的方式来交付计算力(包括CPU、内存、网络、磁盘等),能让业务应用摆脱传统资源交付方式和既往运维手段的束缚,更快捷地得到部署、升级和管理,业务迭代速度大大加快,资源利用率大幅提高。
早在几年前,我们在七牛就成立了专门的容器云团队,致力于打造更健壮、更易用的容器集群调度管理系统。现在,我们在七牛内部全面推广和应用Kubernetes,不仅把无状态服务运行在Kubernetes中,也把有状态服务比如数据库运行在Kubernetes中,正如使用GoLang提高了我们的开发效率一样,使用Kubernetes大大提高了我们的部署和运维效率。
在七牛,我们坚定地认为,Kubernetes会成为下一个Linux,但是管理的不再是单台机器,而是以DCOS的方式来管理整个数据中心。熟练地掌握和使用Kubernetes,将成为每个前后端工程师的必备技能,Kubernetes将成为发布前后端服务的标准途径。
这《Kubernetes in Action中文版》的翻译,我们集中了七牛容器云团队,以及其他七牛内部热心志愿者的力量,针对翻译的每个术语我们认真推敲,尽最大可能达到“信”“达”“雅”的程度。鉴于水平有限,难免有纰漏,请读者谅解。
希望这《Kubernetes in Action中文版》能带领你进入Kubernetes的世界。
参与《Kubernetes in Action中文版》翻译的七牛容器团队成员有:卢兴铭(致谢词、第1章)、李雪瓅(第2章)、路涛(第3章)、孙讷敏(第4章)、刘岩(第5章)、孙毅飞(第6章)、林培裕(第7章)、周玉壁(第8章)、陈凯俊(第9章)、杨冠军(第10章)、张钦尧(第11章)、况永巧(第12章)、易弢(第13章)、王浩宇(第14章)、王雪瑞(第15章)、屈啸(第16章)、金鑫鑫(第17章)、陈忠杰(第18章)。由袁晓沛任翻译组组长,由李雪瓅、马力、冯义勇负责审校。
袁晓沛容器计算部技术总监
前言
在RedHat工作了几年之后,2014年底,我被分配到一个叫CloudEnablement的新团队。我们的任务是将公司的中间件系列产品引入基于Kubernetes开发的OpenShift容器平台。当时,Kubernetes还在初始的1.0版本中,甚至还没有正式发布。
我们团队必须尽快了解Kubernetes的细节,以便能够充分利用Kubernetes的一切,为软件开发设定正确的方向。当遇到问题时,很难判断是我们出错了,还是仅仅是碰到了一个Kubernetes的bug。
从那以后,Kubernetes有了长足的发展,我对它的理解也有了很大的提升。当我第一次使用它的时候,大多数人甚至从未听说过Kubernetes。现在,几乎每个软件工程师都知道它,Kuberntes已经成为在云上和内部数据中心运行应用程序的增长最快和使用最广泛的方式之一。
在使用Kubernetes的第一个月,我写了一篇包含两部分的博客文章,介绍如何在OpenShift/Kubernetes中运行JBossWildFly应用服务集群。当时,我从未想过一篇简单的博客文章会让曼宁出版社的人联系我,询问我是否愿意写一本关于Kubernetes的书。当然,我不能拒绝这样的提议,尽管我确信他们也会联系其他人,甚至最终会选择其他人。
经过一年半的写作和研究,完成了《Kubernetes in Action中文版》,这是一次很棒的经历。写一本关于一项技术的书是比使用更好的了解它的方法。随着我对Kubernetes了解的深入,以及Kubernetes本身的不断发展,我不断地回到之前写完的章节,添加更多的信息。我是一个完美主义者,所以永远不会对这《Kubernetes in Action中文版》感到绝对满意,但我很高兴听到MEAP(ManningEarlyAccessProgram)的许多读者觉得它是一本很好的学习Kubernetes的指南。
我的目的是让读者了解技术本身,并教会他们如何使用工具有效地在Kubernetes集群中开发和部署应用程序。《Kubernetes in Action中文版》的重点不在如何建立和维护一个高可用的Kubernetes集群,但《Kubernetes in Action中文版》的最后一部分告诉读者这样一个集群应该包含什么,这能让大家很容易地理解处理这个问题的额外资源。
希望你能享受阅读此书,并且让你学到如何能够充分利用Kubernetes系统的强大之处。
关于《Kubernetes in Action中文版》
《Kubernetes in Action中文版》旨在让你能够熟练使用Kubernetes。它介绍了在Kubernetes中有效地开发和运行应用所需的几乎所有概念。
在深入研究Kubernetes之前,《Kubernetes in Action中文版》概述了Docker等容器技术,包括如何构建容器,以便即使以前没有使用过这些技术的读者也可以使用它们。然后,它会慢慢带你从基本概念到实现原理了解大部分的Kubernetes知识。
《Kubernetes in Action中文版》适合谁
《Kubernetes in Action中文版》主要关注应用开发人员,但也从操作的角度概述了应用的管理。它适合任何对在多服务器上运行和管理容器化应用感兴趣的人。
对于希望学习容器技术以及大规模的容器编排的人,无论是初学者还是高级软件工程师都将得到在Kubernetes环境中开发、容器化和运行应用所需的专业知识。
阅读《Kubernetes in Action中文版》不需要预先了解容器或Kubernetes技术。《Kubernetes in Action中文版》以渐进的方式展开主题,不会使用让非专家开发者难以理解的应用源代码。
读者至少应该具备编程、计算机网络和运行Linux基本命令的基础知识,并了解常用的计算机协议,如HTTP协议。
《Kubernetes in Action中文版》的组织方式:路线图
《Kubernetes in Action中文版》分为三个部分,涵盖18个章节。
第一部分简要地介绍Docker和Kubernetes、如何设置Kubernetes集群,以及如何在集群中运行一个简单的应用。它包括两章:
第1章解释了什么是Kubernetes、Kubernetes的起源,以及它如何帮助解决当今大规模应用管理的问题。
第2章是关于如何构建容器镜像并在Kubernetes集群中运行的实践教程。还解释了如何运行本地单节点Kubernetes集群,以及在云上运行适当的多节点集群。
第二部分介绍了在Kubernetes中运行应用必须理解的关键概念。本章内容如下:
第3章介绍了Kubernetes的基本构建模块——pod,并解释了如何通过标签组织pod和其他Kubernetes对象。
第4章将向你介绍Kubernetes如何通过自动重启容器来保持应用程序的健康。还展示了如何正确地运行托管的pod,水平伸缩它们,使它们能够抵抗集群节点的故障,并在未来或定期运行它们。
第5章介绍了pod如何向运行在集群内外的客户端暴露它们提供的服务,还展示了运行在集群中的pod是如何发现和访问集群内外的服务的。
第6章解释了在同一个pod中运行的多个容器如何共享文件,以及如何管理持久化存储并使得pod可以访问。
第7章介绍了如何将配置数据和敏感信息(如凭据)传递给运行在pod中的应用。
第8章描述了应用如何获得正在运行的Kubernetes环境的信息,以及如何通过与Kubernetes通信来更改集群的状态。
第9章介绍了Deployment的概念,并解释了在Kubernetes环境中运行和更新应用的正确方法。
第10章介绍了一种运行需要稳定的标识和状态的有状态应用的专门方法。
第三部分深入研究了Kubernetes集群的内部,介绍了一些额外的概念,并从更高的角度回顾了在前两部分中所学到的所有内容。这是最后一组章节:
第11章深入Kubernetes的底层,解释了组成Kubernetes集群的所有组件,以及每个组件的作用。它还解释了pod如何通过网络进行通信,以及服务如何跨多个pod形成负载平衡。
第12章解释了如何保护KubernetesAPI服务器,以及通过扩展集群使用身份验证和授权。
第13章介绍了pod如何访问节点的资源,以及集群管理员如何防止pod访问节点的资源。
第14章深入了解限制每个应用程序允许使用的计算资源,配置应用的QoS(QualityofService)保证,以及监控各个应用的资源使用情况。还会介绍如何防止用户消耗太多资源。
第15章讨论了如何通过配置Kubernetes来自动伸缩应用运行的副本数,以及在当前集群节点数量不能接受任何新增应用时,如何对集群进行扩容。
第16章介绍了如何确保pod只被调度到特定的节点,或者如何防止它们被调度到其他节点。还介绍了如何确保pod被调度在一起,或者如何防止它们调度在一起。
第17章介绍了如何开发应用程序并部署在集群中。还介绍了如何配置开发和测试工作流来提高开发效率。
第18章介绍了如何使用自己的自定义对象扩展Kubernetes,以及其他人是如何开发并创建企业级应用平台的。
随着章节的深入,不仅可以了解单个构建Kubernetes的模块,还可以逐步增加对使用kubectl命令行工具的理解。









