为什么要写这本书异构的IT基础设施环境导致开发和部署的系统应用纷繁复杂,作为IT技术领域多年的应用者和实践者,我们曾期盼这种局面迎来“终结者”。该“终结者”不仅可以让开发人员从长期饱受困扰的程序移植问题中解脱出来,也可以让运维人员无须再手动解决运行环境中组件间的依赖关系等问题,从而让他们的核心职责分别回归到业务开发和保证系统稳定运行上。终于,以Docker为代表的应用容器技术为该难题的解决带来了一缕曙光,冉冉升起的容器编排之星Kubernetes则让该难题的解决几近尘埃落定,甚至连IT管理者心心念念多年的DevOps文化运动也借此找到了易于落地的实现方案。于是,系统运行割据多年的局面被打破,开始步入天下一统的时代。Kubernetes是CNCF旗下的第一个“毕业”项目,并荣获2018年OSCON最具影响力奖项。尽管距Kubernetes 1.0发布已有几年光景,但其影响力至今仍可以说是空前绝后。Kubernetes可能是IT技术发展史上最为成功的开源项目,除了各类拥有IT信息系统的公司在使用或准备使用它之外,甚至在美国它逐渐成为武器系统和战斗机软件的基础设施。Linux软件基金会的常务董事Jim Zemlin在2017年的Google Cloud Next大会上曾说过,Kubernetes是“云时代的Linux”。的确,Kubernetes应该是开源世界里有史以来迭代最快的项目,俨然成为容器编排领域的事实标准,这样的迭代速度和影响力恐怕仅有Linux内核项目可堪与之匹敌。目前,Kubernetes仍保持着每年发布4个重要版本的节奏,每次版本更新都会引入数个新特性,这种快速迭代的机制在给用户不断带来惊喜的同时,也在学习和使用上给用户造成一些困扰:相关领域的参考书仍不丰富,而互联网上可以得到的文档并非源于同一个技术版本,且厘清脉络形成完整的知识框架的时间成本较大。因此笔者在教授课程以及进行生产实践之余便萌生了写一本Kubernetes入门与实践图书,把学习和使用经验总结并分享给更多有需要的技术同行的想法,以帮助大家缩短入门路径,降低时间成本。然而,在写作过程中,Kubernetes这种快速迭代的机制以及每每引入的新特性却在给笔者带来小惊喜之余,也使笔者感到沮丧:在一年多的写作时间里许多章节几易其稿,却依然无法确保涵盖即将成为核心功能的特性。这种沮丧感几度如影随形,直到自我安慰“基础的核心特性基本不会发生大的变动,只要能帮助读者弄清楚Kubernetes系统的基础架构及核心工作逻辑就算没有白费工夫”之后方才释去,于是便有了这本尽量多地包罗Kubernetes系统目前的主流特性及实践路径的入门之书、工具之书。第2版与第1版的区别2020年8月26日,Kubernetes v1.19正式发布,这是2020年于v1.18之后发布的第二个新版本。相对于2018年发布的v1.12来说,这两个版本的Kubernetes进行了不少改进并引入了诸多新的特性,不少组件与工具的功能有了较大变动。于是,本书第2版基于v1.18和v1.19的大多数新特性进行了相应的修改和升级,例如增加了kubectl插件、Kustomize、CNI、CSI及新版本调度框架等内容。在本书第1版(2019年1月)出版后,笔者收到了许多热心读者的反馈意见,部分读者强烈建议深入讲解Service和Ingress相关的话题。因此在本书第2版中,笔者扩充了对这两个话题的讲解,分别用一章进行阐述。另外,相对于第1版,第2版在各知识点的讲解顺序及内容编排上也进行了大幅度的调整,不少章节甚至进行了大范围的重写。但如何深入理解Kubernetes及其各组件的原理性知识,以及如何将其应用于实践仍是本书贯穿始终的主旨。本书特色本书致力于帮助容器编排技术的初级、中级读者循序渐进地理解和使用Kubernetes系统,因此在编写时充分考虑了初学者进入一个新的知识领域时不知从何入手的茫然局面,以由浅入深、由点到面的方式讲解每一个知识细节。对于每个知识点,不仅介绍其概念和用法,还分析了为什么要有这个概念,实现方式是什么,背后的逻辑为何等,使读者不仅知其然,还知其所以然。本书不仅可以带领读者入门,更是一本可以随时动手加以验证的实践手册,而且部分重要的内容还专门按步骤讲解具体的实操案例,帮助读者在实践中加深对概念的理解。本书几乎涵盖了应用Kubernetes系统的主流知识点,甚至可以作为考取CKA认证证书的配套参考书。读者对象云原生程序开发工程师云计算运维工程师云计算架构师计划考取CKA认证证书的读者其他对容器编排感兴趣的人员如何阅读本书阅读本书前,读者需要具有Docker容器技术的基础知识。本书分为5大部分,共16章。第一部分为系统基础(第1~2章),介绍Kubernetes系统基础概念及基本应用。第1章介绍容器编排系统出现的背景,以及Kubernetes系统的功能、特性、核心概念、系统组件及应用模型。第2章讲解Kubernetes的部署模式,包括kubeadm部署工具的部署方式及部署过程,并给出了使用直接命令式操作管理资源对象的方法,以帮助读者快速入门。第二部分为核心资源(第3~8章),介绍各种核心资源及应用。第3章介绍资源管理模型以及命令式和声明式管理接口,并通过命令对比说明两种操作方式的不同。第4章介绍Pod资源的常用配置、生命周期、存储状态和就绪状态检测,以及计算资源的需求与限制等。第5章主要介绍存储卷类型及常见存储卷的使用方式,PV和PVC出现的原因与应用,以及存储类资源的应用与存储卷的动态供给。第6章介绍使用ConfigMap和Secret资源为容器应用提供配置及敏感信息的方式。第7章讲解Service资源,分别介绍了Service类型、功用及其实现,并深入分析了各种类型Service的实现方式。第8章介绍Pod控制器资源类型,重点讲解了控制无状态应用的ReplicaSet、Deployment、StatefulSet和DaemonSet控制器,并介绍了Job和CronJob控制器。第三部分为安全(第9~10章),介绍安全相关的话题,主要涉及认证、授权、准入控制、网络模型及网络策略等。第9章重点讲解认证方式、ServiceAccount和TLS认证、授权插件类型及RBAC,并在最后介绍了LimitRange、ResourceQuota和PodSecurityPolicy这3种类型的准入控制器及相关的资源类型。第10章主要介绍网络插件基础及Flannel的3种后端实现及其应用,Calico网络插件IPIP和BGP模型的实现,以及网络策略的实现及应用。第四部分为进阶(第11~13章),主要介绍调度框架和调度插件、资源扩展和路由网关等高级话题。第11章介绍Pod资源的经典调度策略、新式的调度框架及调度插件,包括节点亲和、Pod资源亲和及基于污点与容忍度的调度等话题。第12章介绍系统资源的扩展方式,包括自定义资源类型、自定义资源对象、自定义API及控制器、Master节点的高可用等话题。第13章介绍Ingress资源及其实现、Ingress Nginx配置与应用案例,以及基于Contour的高级应用发布机制,例如蓝绿部署、流量迁移、流量镜像、超时和重试等。第五部分为必备生态组件(第14~16章),重点介绍Kubernetes上用于支撑核心功能的关键附加组件。第14章讲解大规模应用部署管理工具Kustomize与Helm的基础及应用案例。第15章介绍资源指标、自定义指标、Prometheus监控系统及HPA控制器的应用。第16章介绍如何为Kubernetes系统提供统一日志收集及管理工具栈EFK。有一定Kubernetes使用经验的读者可以挑选感兴趣的章节直接阅读。对于初学者,建议从基础部分逐章阅读,但构建在Kubernetes系统之上的应用多数都要以读者熟悉相关领域的知识为基础,如果某些内容很难理解,通常是由于缺乏相关知识所致,建议读者通过其他资料补足基础后再阅读。编撰本书的主要意图是为初级和中级读者提供一本循序渐进的实操手册,但任何读者都可以把它作为一本案头工具书随时查阅。排版约定本书所有的命令都附带了或长或短的命令提示符“#”和“$”或“~#”或“~$”,较长的命令使用了“\”作为续行符,且命令及其输出使用了无铺灰背景色的代码体。附带代码本书相关的配置清单等都放在https:github.comikubernetes的仓库中,实践时可直接克隆到本地实验环境中使用。勘误和支持虽然笔者从事培训及技术研究工作已十余年,但考虑到排版印刷后不可更改,整个写作过程几乎是战战兢兢、如履薄冰,讲解每一个关键话题时,都大量调阅资料并反复斟酌,尽量清晰、准确地加以描述,同时试图避免因自己的理解偏差而误导读者。尽管如此,由于笔者的水平有限,加之写作时间仓促,书中难免存在不妥之处,恳请读者批评指正。如果你有更多的宝贵意见,可以通过邮箱mage@magedu.com联系我,期待得到读者的真挚反馈。另外,本书的勘误将会发布在笔者的公众号(iKubernetes)或本书专用的GitHub主页(https:github.comikubernetes)上,欢迎读者朋友关注并留言讨论。参考资料本书名为《Kubernetes进阶实战》(第2版),但对于具有不同知识基础和结构的读者来说,仅凭一本书的内容根本不足以获取所需的全部信息,大家还可以通过以下途径获取关于Kubernetes系统的更多资料,笔者在本书写作期间也从这些参考资料中获得了很大帮助。Kubernetes Documentation和Kubernetes API Reference:这是提供Kubernetes领域相关知识的最全面、最深入和最准确的参考材料。Kubernetes in Action:本书的谋篇布局及写作理念与此书不谋而合,因此对许多概念的理解和验证也以此书为素材,写作时有多处概念的描述借鉴了此书的内容。Red Hat OpenShift Documentation:这是Red Hat公司的产品文档规范,权威、细致且条理清晰,是不可多得的参考材料。The New Stack的技术文章及调研报告:该站点有了解Kubernetes系统技术细节和行业应用现状与趋势的不可多得的优秀资源。Bitnami及Heptio站点上的博客文章:它们提供了深入了解和学习Kubernetes系统某个特定技术细节的可靠资料。另外,本书借鉴了网络上的一些技术文章和参考文档。在这里一并向这些图书和文章的作者表示深深的谢意!致谢Kubernetes社区创造性的劳动成果和辛苦付出,才让我们有了学习、使用如此优秀的开源系统的可能性,这也是本书得以构建的基石。感谢我的同事们在我写作期间给予的支持和理解,是他们让我有了可以放心写作的时间和精力。感谢本书第1版的热心读者的真诚建议和积极反馈,他们提出的宝贵意见为本书第2版的写作提供了参考方向或素材。感谢参加了我的课程(马哥教育)的学员朋友们,大家的学习热情及工作中源源不断的反馈信息与需求在不同程度上帮助我一直保持对技术的追求和热忱,教学相长在此得到了充分体现。感谢机械工业出版社华章公司的编辑高婧雅女士对本书写作的悉心指导,以及对我本人的包容和理解。最后要特别感谢我的家人,我为写作这本书牺牲了很多陪伴他们的时间,是他们在生活中的关怀和鼓励才使我能够踏踏实实地完成本书。 马永亮