Kubernetes进阶实战

网友投稿 517 2022-05-29

云计算与虚拟化技术丛书

Kubernetes进阶实战

马永亮 著

Preface 前言

为什么要写这本书

《 Kubernetes进阶实战》

作为置身于IT技术领域多年的实践者和教育者,我们一直盼望着行业迎来这样一个时刻:异构的IT基础设施环境所造成的开发和部署系统应用纷繁复杂的局面终于迎来了终结者,开发人员无须再考虑复杂多样的运行环境下软件程序的移植问题,运维人员不用再手动解决运行环境中组件间的依赖关系等,从而让各自的核心职责都回归到开发和保证系统稳定运行本身。终于,以Docker为首的容器技术为此带来了基础保障,并在容器编排技术的支撑下尘埃落定,甚至连IT管理者心心念念多年的DevOps文化运动也借此找到了易于落地的实现方案。于是,系统运行割据多年的局面终于将走向天下一统。

尽管距Kubernetes 1.0的发布不过三四年的光景,但其如今的影响力在IT技术领域完全算得上空前绝后,目前,一众大小公司都在使用或正筹划使用这一IT技术发展史上可能最为成功的开源项目。Linux软件基金会的常务董事Jim Zemlin在Google Cloud Next 17大会上曾表示,Kubernetes是“云时代的Linux”。的确,Kubernetes应该是开源世界有史以来迭代最快的项目,而且在几乎所有需要采用容器技术的场景里成为占统治地位的解决方案,其发展速度恐怕也仅有Linux内核项目可堪匹敌。2018年3月,Kubernetes成为CNCF旗下“毕业”的第一个项目,并荣获2018年 OSCON最具影响力奖项。

目前,Kubernetes保持着每年发布四个重要版本的节奏,版本的每次更新都会引入数个新特性。这种快速迭代的机制在为用户不断带来惊喜的同时,也给他们在学习和使用上造成了一些困扰:相关领域的可参考书籍仍不丰富,互联网上可以得到的众多文档并非源于同一个版本,以及厘清脉络拼凑成完整的知识框架所需的时间成本较大。因此,我在课程以及直接或间接参与生产或测试环境的交付之余便萌生了撰写一本Kubernetes入门、进阶与实战的书籍的想法,将自己学习和使用的经验总结、沉淀并分享给更多有此需求的技术同行,帮助大家快速找到入门路径,降低时间成本,并迅速投入测试和生产之用。

的确,在写作过程中,Kubernetes这种快速迭代的机制,以及每每引入的新特性,在小惊喜之余带给笔者更多的却是真真切切的梦魇般的恐惧感:在一年多的写作时间里,许多章节几易其稿,却也依然无法确保能够涵盖即将成为核心功能的特性,于是沮丧感几度如影随形,直到自我安慰着“基础的核心特性基本不会发生大的变动,只要能帮助读者弄清楚Kubernetes系统的基础架构及核心工作逻辑就算工夫没有白费”之后方才释然。于是便有了这本力图尽量多地包罗Kubernetes系统目前主流特性及实践路径的入门和进阶之书、工具之书。

本书特色

本书致力于帮助容器编排技术的初级和中级用户循序渐进地理解与使用Kubernetes系统,因此本书的编写充分考虑到初学者进入新知识领域时的茫然,采用由浅入深、提纲挈领、再由点到面的方式讲解每一个知识细节。对于每个知识点,不仅介绍了其概念和用法,还分析了为什么要有这个概念,实现的方式是什么,背后的逻辑为何,等等,使读者不仅能知其然,还能知其所以然。

本书不仅要带领读者入门,更是一本可以随时动手加以验证的实践手册,而且对于部分重要的内容还会专门一步步地给出具体的实操案例,帮助读者在实践中升华对概念的理解。本书几乎涵盖了应用Kubernetes系统的所有主流知识点,它甚至可以作为计划考取CKA认证的读者的配套参考图书。

读者对象

◆云计算工程师

◆运维工程师

◆系统开发工程师

◆程序架构师

◆计划考取CKA认证的人员

◆其他对容器编排感兴趣的人员

如何阅读本书

阅读使用本书之前,读者需要具备Docker容器技术的基础使用能力。本书逻辑上共分为五大部分,15章。

第一部分(第1~2章),介绍Kubernetes系统的基础概念及其基本应用。

第1章  介绍容器编排系统出现的背景,以及Kubernetes系统的功能、特性、核心概念、系统组件及应用模型。

第2章  讲解Kubernetes的核心对象,以及直接使用命令管理资源对象的快速入门技巧。

第二部分(第3~6章),介绍核心资源类型及其应用。

第3章  介绍资源管理模型、陈述式与声明式资源管理接口,并通过命令对比说明两种操作方式的不同之处。

第4章  介绍Pod资源的常用配置、生命周期、存储状态和就绪状态检测,以及计算资源的需求及限制等。

第5章  介绍Pod控制器资源类型,重点讲解了控制无状态应用的ReplicaSet、Deployment、DaemonSet控制器,并介绍了Job和CronJob控制器。

第6章  介绍Service和Ingress资源类型,涵盖Service类型、功用及其实现,以及Ingress控制器、Ingress资源的种类及其实现,并通过案例详细说明了Ingress资源的具体使用方式。

第三部分(第7~9章),介绍存储卷及StatefulSet控制器。

第7章  主要介绍存储卷类型及常见存储卷的使用方式、PV和PVC出现的原因及应用,以及存储类资源的应用和存储卷的动态供给。

第8章  介绍使用一等资源类型Conf?igMap和Secret为容器应用提供配置及敏感信息的方式。

第9章  主要介绍有状态应用的Pod控制器资源StatefulSet,包括基础应用、动态扩缩容及更新机制等。

第四部分(第10~11章),介绍安全相关的话题,主要涉及认证、授权、准入控制、网络模型与网络策略。

第10章  重点讲解认证方式、Service Account和TLS认证、授权插件类型及RBAC,并于章节的最后介绍LimitRanger、ResourceQuota和PodSecurityPolicy三种类型的准入控制器及相关的资源类型。

第11章  主要介绍网络插件基础及f?lannel的三种后端实现与应用、借助Canal插件实现网络策略的方式,以及Calico网络插件的基础使用。

第五部分(第12~15章),介绍Kubernetes系统的高级话题。

第12章  介绍Pod资源的调度策略及高级调度方式的应用,包括节点亲和、Pod资源亲和以及基于污点和容忍度的调度。

第13章  介绍系统资源的扩展方式,包括自定义资源类型、自定义资源对象、自定义API及控制器、Master节点的高可用、基于Kubernetes的PaaS系统等话题。

第14章  介绍资源指标、自定义指标、监控系统及HPA控制器的应用。

第15章  介绍简化应用管理的工具Helm,并基于Helm介绍如何为Kubernetes系统提供统一的日志收集与管理工具栈EFK。

有一定Kubernetes使用经验的读者可以挑选感兴趣的章节阅读。而对于初学者,建议从基础部分逐章阅读,但构建在Kubernetes系统之上的应用多数都要求读者能熟练使用相关领域的知识和技能,如果对某些内容的理解比较困难,那么可能是由于相关知识欠缺,建议读者通过其他资料补充学习相关知识后再阅读本书。编撰本书的主要意图是为初学者提供一个循序渐进的实操手册,不过,任何读者也都可以将它作为一本案头的工具书随时进行查阅。

排版约定

本书中所有的命令都附带了或长格式或短格式的命令提示符,以便读者区分文中正常使用的“#”和“$”,命令提示格式为“~]#”或“~]$”,较长的命令使用了“\”为续行符,且命令及其输出使用了有别于正文的字体。

更多内容和附带代码

本书相关的配置清单等都放置于https://github.com/ikubernetes/的相关仓库中,在实践中需要时可直接克隆至本地实验环境中使用。

勘误和支持

尽管进行授课及技术写作已十数年,但动笔著书尚属首次,考虑到排版印刷后的表述无可更改,整个写作过程战战兢兢、如履薄冰。进行每一个关键话题的表述之前都查阅了大量资料,并且反复斟酌,既期望能够将知识点清晰、准确地加以描述,也试图避免因自己的理解偏差而误导读者。尽管如此,由于笔者水平有限,加之编写时间仓促,书中难免存在不妥之处,恳请读者批评指正。如果读者有更多的宝贵意见,请通过邮箱mage@magedu.com联系我,期待能够得到你们的真挚反馈,在技术之路上互勉共进。另外,本书的勘误将会发布在笔者的博客(http://www.ilinux.io)或本书专用的GitHub主页(https://github.com/ikubernetes)上,欢迎读者朋友们关注并留言讨论。

参考资料

致谢

感谢Kubernetes社区创造性的劳动成果和辛苦付出,我们因此有了学习和使用如此优秀的开源系统的可能性,这也是本书得以编撰的基石。

感谢我的同事们在我写作期间给予的支持和理解,他们的努力让我拥有了得以放心写作的时间和精力。感谢提供了相关行业信息并促使我下定决心开始编写此书的张常安和张士杰先生,本书的写作过程中也得到了他们支援的宝贵素材。

感谢参加了我的课程(马哥教育)的学员朋友们,大家的学习热情及工作中源源不断反馈而来的信息与需求在不同程度上帮助我一直保持着对技术的追求和热忱,教学相长在此得到了充分的体现。

感谢机械工业出版社华章公司高婧雅女士对本书写作的悉心指导,以及对我本人的包容和理解。

最后要特别感谢我的家人,为写作这本书,我牺牲了很多陪伴他们的时间,也正因为他们在生活中的关怀和鼓励才使我能够踏踏实实地完成本书内容的编写。

目  录Contents

前言

第1章 Kubernetes系统基础  1

1.1 容器技术概述  1

1.1.1 容器技术的功用  2

1.1.2 容器简史  3

1.1.3 Docker的功能限制  4

1.2 Kubernetes概述  4

1.2.1 Kubernetes简史  4

1.2.2 Kubernetes特性  5

1.2.3 Kubernetes概念和术语  6

1.3 Kubernetes集群组件  10

1.3.1 Master组件  10

1.3.2 Node组件  12

1.3.3 核心附件  13

1.4 Kubernetes网络模型基础  13

1.4.1 网络模型概述  13

1.4.2 集群上的网络通信  15

1.5 本章小结  16

第2章 Kubernetes快速入门  17

2.1 Kubernetes的核心对象  17

2.1.1 Pod资源对象  18

2.1.2 Controller  19

2.1.3 Service  20

2.1.4 部署应用程序的主体过程  21

2.2 部署Kubernetes集群  22

2.2.1 kubeadm部署工具  22

2.2.2 集群运行模式  24

2.2.3 准备用于实践操作的集群环境  25

2.2.4 获取集群环境相关的信息  26

2.3 kubectl使用基础与示例  26

2.4 命令式容器应用编排  29

2.4.1 部署应用(Pod)  30

2.4.2 探查Pod及应用详情  33

2.4.3 部署Service对象  36

2.4.4 扩容和缩容  38

2.4.5 修改及删除对象  40

2.5 本章小结  41

第3章 资源管理基础  42

3.1 资源对象及API群组  42

3.1.1 Kubernetes的资源对象  43

3.1.2 资源及其在API中的组织形式  46

3.1.3 访问Kubernetes REST API  48

3.2 对象类资源格式  49

3.2.1 资源配置清单  50

3.2.2 metadata嵌套字段  51

3.2.3 spec和status字段  52

3.2.4 资源配置清单格式文档  53

3.2.5 资源对象管理方式  54

3.3 kubectl命令与资源管理  56

3.3.1 资源管理操作概述  56

3.3.2 kubectl的基本用法  57

3.4 管理名称空间资源  59

3.4.1 查看名称空间及其资源对象  60

3.4.2 管理Namespace资源  61

3.5 Pod资源的基础管理操作  61

3.5.1 陈述式对象配置管理方式  62

3.5.2 声明式对象配置管理方式  64

3.6 本章小结  65

第4章 管理Pod资源对象  66

4.1 容器与Pod资源对象  66

4.2 管理Pod对象的容器  68

4.2.1 镜像及其获取策略  69

4.2.2 暴露端口  70

4.2.3 自定义运行的容器化应用  71

4.2.4 环境变量  72

4.2.5 共享节点的网络名称空间  73

4.2.6 设置Pod对象的安全上下文  74

4.3 标签与标签选择器  75

4.3.1 标签概述  75

4.3.2 管理资源标签  77

4.3.3 标签选择器  78

4.3.4 Pod节点选择器nodeSelector  79

4.4 资源注解  80

4.4.1 查看资源注解  81

4.4.2 管理资源注解  82

4.5 Pod对象的生命周期  82

4.5.1 Pod的相位  82

4.5.2 Pod的创建过程  83

4.5.3 Pod生命周期中的重要行为  84

4.5.4 容器的重启策略  87

4.5.5 Pod的终止过程  87

4.6 Pod存活性探测  88

4.6.1 设置exec探针  89

4.6.2 设置HTTP探针  90

4.6.3 设置TCP探针  92

4.6.4 存活性探测行为属性  93

4.7 Pod就绪性探测  94

4.8 资源需求及资源限制  96

4.8.1 资源需求  96

4.8.2 资源限制  98

4.8.3 容器的可见资源  99

4.8.4 Pod的服务质量类别  100

4.9 本章小结  101

第5章 Pod控制器  103

5.1 关于Pod控制器  103

5.1.1 Pod控制器概述  104

5.1.2 控制器与Pod对象  105

5.1.3 Pod模板资源  106

5.2 ReplicaSet控制器  106

5.2.1 ReplicaSet概述  107

5.2.2 创建ReplicaSet  108

5.2.3 ReplicaSet管控下的Pod对象  109

5.2.4 更新ReplicaSet控制器  111

5.2.5 删除ReplicaSet控制器资源  114

5.3 Deployment控制器  114

5.3.1 创建Deployment  115

5.3.2 更新策略  116

5.3.3 升级Deployment  119

5.3.4 金丝雀发布  121

5.3.5 回滚Deployment控制器下的应用发布  123

5.3.6 扩容和缩容  123

5.4 DaemonSet控制器  124

5.4.1 创建DaemonSet资源对象  124

5.4.2 更新DaemonSet对象  126

5.5 Job控制器  127

5.5.1 创建Job对象  128

5.5.2 并行式Job  129

5.5.3 Job扩容  130

5.5.4 删除Job  130

5.6 CronJob控制器  131

5.6.1 创建CronJob对象  131

5.6.2 CronJob的控制机制  132

5.7 ReplicationController  133

5.8 Pod中断预算  133

5.9 本章小结  134

第6章 Service和Ingress  136

6.1 Service资源及其实现模型  136

6.1.1 Service资源概述  136

6.1.2 虚拟IP和服务代理  138

6.2 Service资源的基础应用  140

6.2.1 创建Service资源  140

6.2.2 向Service对象请求服务  141

6.2.3 Service会话粘性  142

6.3 服务发现  143

6.3.1 服务发现概述  143

6.3.2 服务发现方式:环境变量  145

6.3.3 ClusterDNS和服务发现  146

6.3.4 服务发现方式:DNS  146

6.4 服务暴露  147

6.4.1 Service类型  147

6.4.2 NodePort类型的Service资源  149

6.4.3 LoadBalancer类型的Service资源  150

6.4.4 ExternalName Service  151

6.5 Headless类型的Service资源  152

6.5.1 创建Headless Service资源  153

6.5.2 Pod资源发现  153

6.6 Ingress资源  154

6.6.1 Ingress和Ingress Controller  154

6.6.2 创建Ingress资源  155

6.6.3 Ingress资源类型  157

6.6.4 部署Ingress控制器(Nginx)  159

6.7 案例:使用Ingress发布tomcat  161

6.7.1 准备名称空间  161

6.7.2 部署tomcat实例  162

6.7.3 创建Service资源  163

6.7.4 创建Ingress资源  164

6.7.5 配置TLS Ingress资源  165

6.8 本章小结  168

第7章 存储卷与数据持久化  169

7.1 存储卷概述  169

7.1.1 Kubernetes支持的存储卷类型  170

7.1.2 存储卷的使用方式  171

7.2 临时存储卷  172

7.2.1 emptyDir存储卷  172

7.2.2 gitRepo存储卷  175

7.3 节点存储卷hostPath  176

7.4 网络存储卷  178

7.4.1 NFS存储卷  178

7.4.2 RBD存储卷  180

7.4.3 GlusterFS存储卷  182

7.4.4 Cinder存储卷  183

7.5 持久存储卷  184

7.5.1 创建PV  186

7.5.2 创建PVC  188

7.5.3 在Pod中使用PVC  190

7.5.4 存储类  191

7.5.5 PV和PVC的生命周期  194

7.6 downwardAPI存储卷  196

7.6.1 环境变量式元数据注入  197

7.6.2 存储卷式元数据注入  199

7.7 本章小结  201

第8章 配置容器应用:Conf?igMap和Secret  202

8.1 容器化应用配置方式  202

8.2 通过命令行参数配置容器应用  204

8.3 利用环境变量配置容器应用  206

8.4 应用程序配置管理及Conf?igMap资源  208

8.4.1 创建Conf?igMap对象  209

8.4.2 向Pod环境变量传递Conf?igMap对象键值数据  212

8.4.3 Conf?igMap存储卷  215

8.4.4 容器应用重载新配置  219

8.4.5 使用Conf?igMap资源的注意事项  220

8.5 Secret资源  221

8.5.1 Secret概述  221

8.5.2 创建Secret资源  222

8.5.3 Secret存储卷  224

8.5.4 imagePullSecret资源对象  225

8.6 本章小结  226

第9章 StatefulSet控制器  227

9.1 StatefulSet概述  227

9.1.1 Stateful应用和Stateless应用  227

9.1.2 StatefulSet控制器概述  228

9.1.3 StatefulSet的特性  230

9.2 StatefulSet基础应用  231

9.2.1 创建StatefulSet对象  232

9.2.2 Pod资源标识符及存储卷  234

9.3 StatefulSet资源扩缩容  237

9.4 StatefulSet资源升级  238

9.4.1 滚动更新  238

9.4.2 暂存更新操作  239

9.4.3 金丝雀部署  240

9.4.4 分段更新  241

9.4.5 其他话题  241

9.5 案例:etcd集群  242

9.5.1 创建Service资源  242

9.5.2 etcd StatefulSet  243

9.6 本章小结  247

第10章  认证、授权与准入控制  248

10.1  访问控制概述  248

10.1.1  用户账户与用户组  249

10.1.2  认证、授权与准入控制基础  250

10.2  服务账户管理与应用  253

10.2.1  Service Account自动化  253

10.2.2  创建服务账户  255

10.2.3  调用imagePullSecret资源对象  256

10.3  X.509数字证书认证  256

10.3.1  Kubernetes中的SSL/TLS认证  257

10.3.2  客户端配置文件kubeconf?ig  259

10.3.3  TLS bootstrapping机制  262

10.4  基于角色的访问控制:RBAC  263

10.4.1  RBAC授权插件  264

10.4.2  Role和RoleBinding  266

10.4.3  ClusterRole和ClusterRoleBin-ding  269

10.4.4  聚合型ClusterRole  271

10.4.5  面向用户的内建ClusterRole  273

10.4.6  其他的内建ClusterRole和ClusterRoleBinding  274

10.5  Kubernetes Dashboard  275

10.5.1  部署HTTPS通信的Dashboard  275

10.5.2  配置token认证  277

10.5.3  配置kubeconf?ig认证  277

10.6  准入控制器与应用示例  279

10.6.1  LimitRange资源与LimitRanger准入控制器  279

10.6.2  ResourceQuota资源与准入控制器  281

10.6.3  PodSecurityPolicy  283

10.7  本章小结  288

第11章  网络模型与网络策略  289

11.1  Kubernetes网络模型及CNI插件  289

11.1.1  Docker容器的网络模型  289

11.1.2  Kubernetes网络模型  291

11.1.3  Pod网络的实现方式  293

11.1.4  CNI插件及其常见的实现  295

11.2  f?lannel网络插件  297

11.2.1  f?lannel的配置参数  297

11.2.2  VxLAN后端和direct routing  298

11.2.3  host-gw后端  301

11.3  网络策略  302

11.3.1  网络策略概述  302

11.3.2  部署Canal提供网络策略功能  303

11.3.3  配置网络策略  305

11.3.4  管控入站流量  306

11.3.5  管控出站流量  308

11.3.6  隔离名称空间  310

11.3.7  网络策略应用案例  311

11.4  Calico网络插件  315

11.4.1  Calico工作特性  316

11.4.2  Calico系统架构  318

11.4.3  Calico部署要点  320

11.4.4  部署Calico提供网络服务和网络策略  321

11.4.5  客户端工具calicoctl  324

11.5  本章小结  325

第12章  Pod资源调度  326

12.1  Kubernetes调度器概述  326

12.1.1  常用的预选策略  327

12.1.2  常用的优选函数  330

12.2  节点亲和调度  332

12.2.1  节点硬亲和性  332

12.2.2  节点软亲和性  335

12.3  Pod资源亲和调度  337

12.3.1  位置拓扑  338

12.3.2  Pod硬亲和调度  338

12.3.3  Pod软亲和调度  341

12.3.4  Pod反亲和调度  342

12.4  污点和容忍度  343

12.4.1  定义污点和容忍度  344

12.4.2  管理节点的污点  345

12.4.3  Pod对象的容忍度  346

12.4.4  问题节点标识  347

12.5  Pod优选级和抢占式调度  347

12.6  本章小结  348

第13章  Kubernetes系统扩展  349

13.1  自定义资源类型(CRD)  349

13.1.1  创建CRD对象  350

13.1.2  自定义资源格式验证  351

13.1.3  子资源  353

13.1.4  使用资源类别  355

13.1.5  多版本支持  355

13.1.6  自定义控制器基础  356

13.2  自定义API Server  359

13.2.1  自定义API Server概述  359

13.2.2  APIService对象  360

13.3  Kubernetes集群高可用  361

13.3.1  etcd高可用  362

13.3.2  Controller Manager和Scheduler高可用  363

13.4  Kubernetes的部署模式  364

13.4.1  关键组件  365

13.4.2  常见的部署模式  366

13.5  容器时代的DevOps概述  369

13.5.1  容器:DevOps协作的基础  369

13.5.2  泛型端到端容器应用程序生命周期工作流  370

13.5.3  基于Kubernetes的DevOps  371

13.6  本章小结  372

第14章  资源指标及HPA控制器  373

14.1  资源监控及资源指标  373

14.1.1  资源监控及Heapster  374

14.1.2  新一代监控架构  376

14.2  资源指标及其应用  378

14.2.1  部署metrics-server  378

14.2.2  kubectl top命令  380

14.3  自定义指标与Prometheus  381

14.3.1  Prometheus概述  382

14.3.2  部署Prometheus监控系统  384

14.3.3  自定义指标适配器k8s-prometheus-adapter  388

14.4  自动弹性缩放  390

14.4.1  HPA概述  390

14.4.2  HPA(v1)控制器  391

14.4.3  HPA(v2)控制器  393

14.5  本章小结  397

第15章  Helm程序包管理器  398

15.1  Helm基础  398

15.1.1  Helm的核心术语  399

15.1.2  Helm架构  400

15.1.3  安装Helm Client  400

15.1.4  安装Tiller server  401

15.1.5  Helm快速入门  402

15.2  Helm Charts  405

15.2.1  Charts文件组织结构  405

15.2.2  Chart.yaml文件组织格式  406

15.2.3  Charts中的依赖关系  407

15.2.4  模板和值  408

15.2.5  其他需要说明的话题  409

15.2.6  自定义Charts  410

15.3  Helm实践:部署EFK日志管理系统  415

15.3.1  ElasticSearch集群  416

15.3.2  日志采集代理f?luentd  421

15.3.3  可视化组件Kibana  422

15.4  本章小结  424

附录A 部署Kubernetes集群  425

附录B 部署GlusterFS及Heketi  437

马永亮

2018年10月

网络 Kubernetes

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:AI Earth地球科学云平台简介
下一篇:【VPC-最佳实践】网络规划
相关文章