Kubernetes in Action中文版
  • 推荐1
  • 收藏9
  • 浏览2.5K

Kubernetes in Action中文版

Marko Luksa (作者)  李雪瓅 (译者)

  • 书  号:978-7-121-34995-9
  • 出版日期:2018-12-20
  • 页  数:592
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 原书名: Kubernetes in Action 1st Edition
  • 原书号:9781617293726
  • 维护人:张春雨
纸质版 ¥148.00
本书主要讲解如何在 Kubernetes 中部署分布式容器应用。本书开始部分概要介绍了 Docker 和Kubernetes 的由来和发展,然后通过在 Kubernetes 中部署一个应用程序,一点点增加功能,逐步加深我们对于Kubernetes架构的理解和操作的实践。在本书的后面部分,也可以学习一些高阶的主题,比如监控、调试及伸缩。
Kubernetes是希腊文,意思是“舵手”,带领我们安全地到达未知水域。Kubernetes这样的容器编排系统,会帮助我们妥善地管理分布式应用的部署结构和线上流量,高效地组织容器和服务。Kubernetes 作为数据中心操作系统,在设计软件系统时,能够尽量降低在底层网络和硬件设施上的负担。
k8s实战之巅 用下一代Linux实现Docker容器集群编排|分布式可伸缩应用 全真案例|从零起步|保罗万象|高级技术
推 荐 序
2013 年,Docker 问世,由于其简练易用的使用范式,极大降低了容器技术的使用门槛,引爆了容器技术,一场轰轰烈烈的由容器带来的新计算革命开始了。
2014 年,预见到了容器带来的革命性变化,七牛内部成立了一个新项目——QCOS,全称为 Qiniu Cloud Operating System(也可以理解为 Qiniu Cluster OperatingSystem),目标是实现一个数据中心操作系统,让开发人员使用数据中心如同使用一台机器一样容易。在当时,Kubernetes 项目也刚刚开始,还在规格设计阶段。我们通读了 Kubernetes 的设计,决定自己干。这是一个非常疯狂的想法。促使我们决定自己干的原因有两点 :一是我们存储也自己干,而且干成了,所以计算自己干,也不无成功的可能 ;二是 Kubernetes 刚开始,一切如果跟随 Kubernetes,那么我们做起事情来肯定束手束脚,没办法按照商业公司的推进速度来推进。
但是做着做着我们就发现,计算不像存储,计算问题是一个非常开放性的问题。而以容器为核心的计算系统,其复杂性也不同于以虚拟机(VM)为代表的计算系统,因为虚拟机(VM)是以虚拟一台机器为边界的,其问题域同样比较闭合。但是容器计算就是要打破机器的边界,让计算力在数据中心内自由调度。这个问题域涉及面非常广,除了常规的计算力调度、负载均衡、部署升级、服务发现、日志与监控,这些东西都要以全新的方式来解决。
实际上给数据中心做一个操作系统并不是什么新想法。20 世纪 80 年代中期,贝尔实验室就开启了一个名为 Plan9 的操作系统项目,目的就是做一个数据中心操作系统。参与这个操作系统的名单都大名鼎鼎 :Rob Pike、Ken Thompson,等等。你没看错,就是今天创建了 Go 语言的那帮人。他们在 Plan9 项目解散后被 Google抢了过去,换了一个思路继续做数据中心操作系统 —— 从面向数据中心的语言开始:Go 语言就这样诞生了。而随着 Go 语言的流行,Docker、Kubernetes 接连诞生,继续续写着数据中心操作系统的梦想。
Kubernetes 诞生之初,虽然嘴里衔着 Google Borg 系统的金钥匙,但是同期竞争的项目还是比较多的,除了七牛自己内部发起的 QCOS 外,比较知名的还有 Docker Swam 和 Mesos。但是到了 2016 年,这场竞争越来越趋于 Kubernetes 一统天下。七牛内部 QCOS 项目也放弃了自研,将方向转向了 Kubernetes 阵营。
QCOS 项目对七牛有着特殊的意义,它是七牛业务多元化的开始。在此之前,七牛秉承专注做好一件事情,着眼于对象存储一个点,从单点切入,把单点做到极致的思路,获得了极佳的口碑,大量的移动互联网应用都选择了七牛作为它们的图片和视频托管的云服务提供商。选择做 QCOS,实际上是我们在打第二个根据地时,选择了一条极其艰难的道路。
今天我们 QCOS 团队(内部已更名为 KIRK 团队)发起了 Kubernetes in Action一书的翻译,他们邀请我给译本作序,我脑子里不由自主想起了这段历史。选择基于 Kubernetes,是我们从商业上来说的务实选择,但是它并不代表放弃自主研发,只是把梦想暂时封存在心里。中国古话说,师夷长技以制夷,别人的好东西我们是要学习的,学好了我们才能完成从模仿到超越的过程。
Kubernetes 的背后,是一场新计算革命,是真正的云计算 2.0,我们期待更多有想法的开发者能够学习 Kubernetes,能够加入这场计算革命。也欢迎大家加入七牛。
是为序。
许式伟 七牛云 CEO

译 者 序
早在 2011 年创业初期,七牛就决定使用 GoLang 作为主要开发语言,那时距离 GoLang 1.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 的世界。
参与本书翻译的七牛容器团队成员有 :卢兴铭(致谢词、第 1 章)、李雪瓅(第2 章)、路涛(第 3 章)、孙讷敏(第 4 章)、刘岩(第 5 章)、孙毅飞(第 6 章)、林培裕(第 7 章)、周玉壁(第 8 章)、陈凯俊(第 9 章)、杨冠军(第 10 章)、张钦尧 (第11 章)、况永巧 (第 12 章)、易弢(第 13 章)、王浩宇(第 14 章)、王雪瑞(第 15 章)、屈啸(第 16 章)、金鑫鑫(第 17 章)、陈忠杰(第 18 章)。由袁晓沛任翻译组组长,由李雪瓅、马力、冯义勇负责审校。
袁晓沛 容器计算部技术总监

在 Red Hat 工作了几年之后,2014 年底,我被分配到一个叫 Cloud Enablement的新团队。我们的任务是将公司的中间件系列产品引入基于 Kubernetes 开发的OpenShift 容器平台。当时,Kubernetes 还在初始的 1.0 版本中,甚至还没有正式发布。
我们团队必须尽快了解 Kubernetes 的细节,以便能够充分利用 Kubernetes 的一切,为软件开发设定正确的方向。当遇到问题时,很难判断是我们出错了,还是仅仅是碰到了一个 Kubernetes 的 bug。
从那以后,Kubernetes 有了长足的发展,我对它的理解也有了很大的提升。当我第一次使用它的时候,大多数人甚至从未听说过 Kubernetes。现在,几乎每个软件工程师都知道它,Kuberntes 已经成为在云上和内部数据中心运行应用程序的增长最快和使用最广泛的方式之一。
在使用 Kubernetes 的第一个月,我写了一篇包含两部分的博客文章,介绍如何在 OpenShift/Kubernetes 中运行 JBoss WildFly 应用服务集群。当时,我从未想过一篇简单的博客文章会让曼宁出版社的人联系我,询问我是否愿意写一本关于Kubernetes 的书。当然,我不能拒绝这样的提议,尽管我确信他们也会联系其他人,甚至最终会选择其他人。
经过一年半的写作和研究,完成了本书,这是一次很棒的经历。写一本关于一项技术的书是比使用更好的了解它的方法。随着我对 Kubernetes 了解的深入,以及Kubernetes 本身的不断发展,我不断地回到之前写完的章节,添加更多的信息。我是一个完美主义者,所以永远不会对这本书感到绝对满意,但我很高兴听到 MEAP(Manning Early Access Program)的许多读者觉得它是一本很好的学习 Kubernetes 的指南。
我的目的是让读者了解技术本身,并教会他们如何使用工具有效地在Kubernetes 集群中开发和部署应用程序。本书的重点不在如何建立和维护一个高可用的 Kubernetes 集群,但本书的最后一部分告诉读者这样一个集群应该包含什么,这能让大家很容易地理解处理这个问题的额外资源。
希望你能享受阅读此书,并且让你学到如何能够充分利用 Kubernetes 系统的强大之处。
在我开始写这本书之前,从来就没有想到将来会有这么多人参与进来,将一堆

关于本书
本书旨在让你能够熟练使用 Kubernetes。它介绍了在 Kubernetes 中有效地开发和运行应用所需的几乎所有概念。
在深入研究 Kubernetes 之前,本书概述了 Docker 等容器技术,包括如何构建容器,以便即使以前没有使用过这些技术的读者也可以使用它们。然后,它会慢慢带你从基本概念到实现原理了解大部分的 Kubernetes 知识。
本书适合谁
本书主要关注应用开发人员,但也从操作的角度概述了应用的管理。它适合任何对在多服务器上运行和管理容器化应用感兴趣的人。
对于希望学习容器技术以及大规模的容器编排的人,无论是初学者还是高级软件工程师都将得到在 Kubernetes 环境中开发、容器化和运行应用所需的专业知识。
阅读本书不需要预先了解容器或 Kubernetes 技术。本书以渐进的方式展开主题,不会使用让非专家开发者难以理解的应用源代码。
读者至少应该具备编程、计算机网络和运行 Linux 基本命令的基础知识,并了解常用的计算机协议,如 HTTP 协议。

本书的组织方式 :路线图
本书分为三个部分,涵盖 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 章解释了如何保护 Kubernetes API 服务器,以及通过扩展集群使用身份验证和授权。
第 13 章介绍了 pod 如何访问节点的资源,以及集群管理员如何防止 pod 访问节点的资源。
第 14 章深入了解限制每个应用程序允许使用的计算资源,配置应用的 QoS(Quality of Service)保证,以及监控各个应用的资源使用情况。还会介绍如何防止用户消耗太多资源。
第 15 章讨论了如何通过配置 Kubernetes 来自动伸缩应用运行的副本数,以及在当前集群节点数量不能接受任何新增应用时,如何对集群进行扩容。
第 16 章介绍了如何确保 pod 只被调度到特定的节点,或者如何防止它们被调度到其他节点。还介绍了如何确保 pod 被调度在一起,或者如何防止它们调度在一起。
第 17 章介绍了如何开发应用程序并部署在集群中。还介绍了如何配置开发和测试工作流来提高开发效率。
第 18 章介绍了如何使用自己的自定义对象扩展 Kubernetes,以及其他人是如何开发并创建企业级应用平台的。
随着章节的深入,不仅可以了解单个构建 Kubernetes 的模块,还可以逐步增加对使用 kubectl 命令行工具的理解。

目录

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
xxviii 目 录
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

本书勘误

印次
  • 页码:译者序  •  行数:4  •  印次: 5

    Golang
    应为
    GoLang

    winking324 提交于 2020/1/17 14:21:28
    张春雨 确认于 2020/3/23 14:20:40
  • 页码:8  •  行数:14  •  印次: 3

    原文:“虚拟机内核会通过管理程序在宿主机上的物理来CPU执行x86指令”
    应为:
    “虚拟机内核会通过管理程序在宿主机上的物理CPU来执行x86指令”

    sherleyZhou 提交于 2019/9/6 17:57:04
    张春雨 确认于 2020/3/23 9:53:23
  • 页码:8  •  行数:14  •  印次: 5

    “然后虚拟机内核会通过管理程序在宿主机上的物理来 CPU 执行 x86 指令。”

    应该是 “物理 CPU 来执行 x86 指令。”

    winking324 提交于 2020/1/17 14:23:21
    张春雨 确认于 2020/3/23 14:21:59
  • 页码:10  •  行数:21  •  印次: 2019

    第10页 Inter-process communication缩写应为ipc,中文版写作ipd,英文版正确

    xwlearn 提交于 2019/2/13 21:40:10
    张春雨 确认于 2019/4/12 10:44:30
  • 页码:10  •  行数:21  •  印次: 11

    communicaion 拼写错误,少了t,正确的应该为 communication

    yenai 提交于 2021/12/23 15:40:06
    张春雨 确认于 2024/2/5 13:07:44

读者评论

  • 2022年5月第13次印刷
    第113页 图4.10 “节点2发生故障” 应该是 “节点1发生故障”

    sun92发表于 2022/10/19 23:10:53
  • 第11次印刷,第17页,工作节点rtk应该是rkt

    kylezhou发表于 2022/6/28 0:50:25
  • 页码:25 • 行数:21 • 印次: 2020年8月第10次印刷
    8.1.3节
    粗体字 “何时使用Dowanward API方式”
    应该修改为”何时使用Downward API方式”

    育树霖疯发表于 2021/12/15 17:05:27
  • 出个电子版呗

    姜鹏发表于 2019/11/18 14:23:56
  • 发现《kubernetes in action》一个地方的错误:210页标题,”使用configMap卷”,应该是”使用ConfigMap卷”,字母c应该大写。
    同时这个问题导致自动生成的目录也是小写字母”c”

    yaohong发表于 2019/9/11 11:08:53

相关图书

Kubernetes源码剖析

郑东旭 (作者)

本书主要分析了Kubernetes核心功能的实现原理,是一本帮助读者了解Kubernetes架构设计及内部原理实现的书。由于Kubernetes代码量较大,源码...

 

Docker微服务架构实战

蒋彪 (作者)

微服务与Docker 是近年来分布式大规模服务架构中两个主流的技术趋势,本书主要介绍中小型企业在架构落地过程中柔性地切入微服务和Docker 虚拟化的各种方法。...

¥39.00

Kubernetes容器云运维实战

闫健勇 (作者)

本书是基于《Kubernetes权威指南:从Docker到Kubernetes实践全接触》进行企业级容器云平台建设的实战指南,力图对容器云平台的建设、应用和运营...

¥89.00

Java云原生

Josh Long, Kenny Bastani (作者) 张若飞 (译者)

无论是传统IT行业,还是互联网行业,都正处于行业历史上最剧烈的变革中 :大量的系统正在从传统的IT架构转向基于云的架构, 开发模式也正在从开发和运维分工的传统模...

¥128.00

生产微服务

Susan Fowler (作者) 薛命灯 (译者)

本书全面地探讨了微服务,作者从运行超过一千个微服务的高生产准备标准中获取经验,探讨了适用所有微服务的标准,分享了使微服务处于生产就绪状态的策略,为读者展现出一个...

¥35.00

Swarm容器编排与Docker原生集群

Fabrizio Soppelsa ,Chanwit Kaewkasi (作者) 崔婧雯 (译者)

Docker Swarm作为Docker集群原生的容器编排解决方案,是Docker生态系统中的关键组件之一。《Swarm容器编排与Docker原生集群》涵盖了S...

¥39.00