推荐序一
Kubernetes,数字化转型浪潮下你必须了解的技术
从这几年应用开发的发展看,从传统的单体应用升级到微服务架构已是大势所趋。抛开巨型互联网企业不谈,大中型企业也已将微服务架构作为企业开发的首选,就连小公司对于微服务开发也跃跃欲试。微服务架构一统企业开发的时代已经到来。
如果你的企业还在进行传统的单体应用开发,那么你必须意识到你已经落后了,落后是要挨打的。
一项新技术的崛起是鼓舞人心的,但是在这个过程中必然会遇到很多挑战。微服务之间的服务通信、水平扩展、服务治理等是应用架构升级之后技术层面面临的重大挑战。同时相比传统单体应用的部署来说,微服务的发布和持续集成是软件工程层面面临的重大挑战。
而今,随着容器技术的崛起,这些问题迎刃而解。在容器技术之前,我们更多的是应用虚拟机技术。在一个服务器上可以开辟多个虚拟机,每一个虚拟机就相当于一个小型的服务器,虚拟机之间互相通信,虚拟机内部安装对应的软件和应用。
容器相当于在主机内运行的一个隔离的进程,它单独消耗该容器内应用所需要的资源。相比于虚拟机,容器不需要额外的进程,更轻量,能够运行更多的应用。
容器技术的崛起离不开Docker。不得不说,Docker已经成为容器技术的事实标准。要维护那么多微服务的容器,而且它们之间又有着错综复杂的依赖关系,是一件非常复杂且耗时的事情。如果节点有上千个,就变成了一个不可能完成的任务。因此,我们需要一个好的容器编排和管理系统。
Kubernetes是当前被业界广泛认可和看好的基于Docker的大规模容器化分布式系统解决方案。它是谷歌Borg(谷歌久负盛名的大规模集群管理系统)的一个开源版本。它不局限于任何一种语言,没有限定任何编程接口。Java、Go、C++、Python等语言编写的服务,都可以被映射为Kubernetes的服务。
Kubernetes具有以下优势:
简化了应用部署。Kubernetes将所有的工作节点暴露为一个单独的部署平台,开发人员不需要知道服务器的细节。
提高了硬件的利用率,让你从基础架构解耦。Kubernetes会根据你描述的需求,从现有的节点中挑选出最合适的节点来运行应用程序。Kubernetes能让应用移动,找到最优的节点。
健康检查和自愈。Kubernetes监控应用,一旦发生节点故障,会自动把应用调度到其他节点。这让运维团队把精力放在修复坏掉的节点上,而不是去重新分配节点。如果你的应用有足够的闲置节点,甚至可以暂时不用理会故障,比如在凌晨。
自动扩容。Kubernetes监控应用,自动调整应用的实例数量。如果Kubernetes运行在云架构上,弹性扩容会变得更加容易。
本书的译者对微服务架构、领域驱动架构、敏捷管理、DevOps持续交付有着非常丰富的实战经验。相信通过阅读他们翻译的这本书,会让你在数字化转型的新基建建设浪潮中拥有一项基础而强大的技能。
刘翔
明源云CTO
推荐序二
2014年,我加入ThoughtWorks的第一个项目是交付一个微服务架构风格的应用。在我加入时,该项目已经进行了一段时间,我的第一个任务是在自己的笔记本上搭建开发环境,验收标准是可以独立在笔记本上实现本地部署。我原以为这需要一个下午的时间,因为在此之前我对如何部署软件一窍不通,在上一份工作里,我把需要部署的软件包用邮件发给运维团队就行了。结果和我结对的同事从代码库中检出了一些奇怪的配置文件和脚本,操作Vagrant创建了三台基于VirtualBox的虚拟机,不一会儿就把所有三个服务部署好了。如果我修改了代码,再次部署所需要做的仅仅是再次执行那些脚本。
随后,我了解到这是源于ThoughtWorks一直秉持的持续交付理念—尽可能减少各个环境间的差异,配合自动化以减少最终部署到生产环境时遇到的“意外”。我喜欢这样的理念,但我不喜欢刚拿到手的笔记本变得反应迟缓,显然三台虚拟机消耗了它太多资源。两个月后,我接触到Docker,这是一种新兴的应用容器技术,我成功地在自己的笔记本上将那三个服务移植到Docker上,效果非常明显,笔记本不再咔咔作响。但当时这种技术还不够成熟,我们还无法把它应用到生产环境。而仅仅在开发环境使用容器技术显然增加了不同环境间的差异,进而增加了部署的风险。我意识到,虽然微服务架构风格已经引起人们的关注,但以容器技术为代表的配套基础设施还没有跟上节奏。
在随后的几年中,我们对容器技术保持关注。在ThoughtWorks于2017年11月发布的技术雷达中,容器技术借由Kubernetes平台达到了“采纳”级别,它已生产就绪。Kubernetes是云原生计算基金会(CNCF)致力于培育和维护的一个厂商中立的开源生态系统,也是该组织孵化的第一个“毕业”项目,可以认为Kubernetes是云原生基础设施的事实标准。我们这两年明显感觉到业界将Kubernetes投入生产的热情,各公有云服务商推出的Kubernetes托管服务更是大幅降低了其采纳门槛,无论是成本上还是技术上。
本书并不是Kubernetes的入门介绍,它的目的不是告诉读者Kubernetes是什么,而是怎么使用Kubernetes,尤其是如何结合持续交付和DevOps实践来使用Kubernetes。即使在第1章,对于一个简单的博客应用,作者也没有仅仅以使其能够启动运行作为目标,而是引出了制成品版本回溯、应用与配置分离、配置即代码等持续交付和DevOps的最佳实践在Kubernetes中的落地方式。如果读者已经在其他平台有这些实践的实施经验,那么本书是一本极具针对性的工具书,比起从网络各处质量参差不齐的资料中自行筛选和识别要高效得多。也正是因为这样的写作理念,本书的最佳实践才不容易过时。作为一个活跃的开源项目,Kubernetes仍在快速演进,也许在不久的将来,本书中的一些实践细节将不再适用,但本书中构建、运维应用的实践仍将有效。
本书的译者有丰富的应用交付、运维经验,也长期作为咨询师帮助客户解决实际问题,熟悉如何在中文环境中布道Kubernetes及其所代表的容器技术。相信他们的这一译作能给中文读者带来更好的阅读体验。
周宇刚
ThoughtWorks资深架构师
译者序
容器技术在IT世界里并不是什么新鲜事物,最早可追溯到20世纪70年代。在数字化时代的大背景下,蒙尘多年的容器开始绽放光彩,恰逢其时地出现在大众面前。容器对应用开发和运维方式的改变,成为企业业务模式快速创新和重塑不可或缺的支点。在它蓬勃发展的几年里,有两个极具意义的里程碑:一个是2013年 Docker 的横空出世,它基于容器镜像带来的标准化,帮助开发者解决了应用打包、分发和部署的问题,真正实现了应用的一次构建、随处部署;另一个则是2016年的三大编排之争,容器编排帮助运维人员大幅降低了应用运行、管理和维护的复杂度,实现了单容器到容器云的跨越,为容器的投产奠定了坚实的基础。而在这场经典之争中脱颖而出,最终成为容器编排事实标准的就是 Kubernetes,也是本书的主角。
作为译者,我们对 Kubernetes 并不陌生。在经历众多国内外交付项目的同时,我们也亲眼见证了 Kubernetes 在企业里一步步被采纳的全过程。从早期的谨小慎微到如今的标准配备,我们也不可避免地经历了一些至暗时刻。例如:缺乏良好的资源管理,导致应用不稳定、调度不可控、资源利用率低等问题;没有在最初就建立起集中监控和日志系统,故障出现时难以定位和排查,导致过长的服务恢复时间;代码化和自动化的程度不足导致环境不一致,进而影响应用部署、发布的速度和稳定。尽管通过不断的探索,我们最终识别并解决了这些问题。但是在翻译的过程中,我们也不禁多次感慨—如果能够早点遇到本书就好了。
在这个知识大爆炸的时代,通过搜索引擎、官方文档以及市面上涌现出来的大量关于Kubernetes的书籍,我们能够轻而易举地获得Kubernetes的各种资料,但这些精华总是零散地分布在各类知识库中,我们很难找到将它们体系化地应用于实践,并成功适配不同需求场景的最佳姿势。基于多年的软件交付、运维经验,我们深刻地体会到,对于绝大多数的新技术来说,学习它们的知识并不那么难,但是掌握将它们成功用于实践的技能却总会面临各种挑战,Kubernetes也不例外。本书的原作者均是专注于开源云和 Kubernetes 的专家,他们将实际工作中的经验教训提炼、总结并分享出来,对于读者来说,这是一笔宝贵的财富。
本书并非局限于Kubernetes本身的诸多最佳实践,更多的是从实际场景出发,详细介绍如何在Kubernetes上构建应用,包括开发者工作流、镜像分发、持续部署、网络安全、运维监控等应用交付和运维全生命周期的方方面面,甚至还包括很多Kubernetes生态圈中的优秀工具与发展趋势,以帮助我们更好地管理集群。无论你是Kubernetes的初学者还是经验丰富的工程师,相信都能从本书中找到一些解决实际问题的灵感。
在本书的翻译及出版过程中,我们非常感谢机械工业出版社华章公司的编辑们,他们在本书的翻译和校对过程中提供了巨大帮助。同时也特别感谢万学凡、周训杰、黄亚铭、杨佳欢等同事和好友的热情付出,他们在翻译流程和内容审校方面给出了很多宝贵的建议。
限于水平和时间,译文中难免存在疏漏,希望读者不吝赐教,发现问题请发送邮件至k8sbestpractice@hotmail.com,我们将不胜感激。
陈亮 王磊 张扬
2020年6月15日
前言
目标读者
Kubernetes是云原生开发的事实标准。它是一个功能强大的工具,可以使应用程序开发更容易、部署更快、运行更可靠。但是,只有正确使用Kubernetes才能发挥它最大的价值。本书的目标读者是那些需要将应用程序部署到Kubernetes,并且有兴趣学习可用于构建在Kubernetes之上的应用程序的模式和实践的人。
值得指出的是,本书并不是Kubernetes的入门指南。我们假设你对Kubernetes API和工具有基本的了解,并且知道如何创建Kubernetes集群并与之交互。如果你想学习Kubernetes,可以找到很多优秀的资源,例如Kubernetes:Up and Running(O’Reilly)。
这本书面向的是那些想要深入了解如何在Kubernetes上部署特定应用程序和工作负载的人。无论你是刚准备将第一个应用程序部署到Kubernetes,还是已经使用Kubernetes多年,本书都会对你有帮助。
为什么写这本书
我们四人对如何帮助人们将应用程序部署到Kubernetes有着丰富的经验。基于这些经验,我们清楚地知道人们的痛点在哪里,然后帮助他们找到成功之道。在编写本书时,我们试图总结这些经验,以便更多的人可以学习在实践中积累的知识。同时我们希望能够将这些经验记录下来并且传播出去,使人们能够独立地在Kubernetes上成功部署和管理应用程序。
本书概览
很可能你会一口气就把整本书从头到尾浏览完,但这并不是我们真正希望的。相反,我们将本书设计成一个独立章节的集合。每一章都完整阐述了可能需要使用Kubernetes完成的特定任务。你可以根据需要学习本书以了解某个特定的主题或感兴趣的部分,然后将它放在一边,直到有新的主题要了解时再拿起它。
尽管采用了这种章节独立的组织方法,但还是会有一些主题贯穿多个章节。有几章是关于Kubernetes上的应用程序开发的。第2章介绍开发者工作流。第5章探讨持续集成和测试。第15章介绍如何在Kubernetes上构建更高层的平台。第16章论述状态管理和有状态应用。除了应用程序开发之外,还有几章是关于Kubernetes中的服务运维的。第1章介绍如何搭建一个基本服务。第3章介绍监控和度量指标。第4章介绍配置管理。第6章介绍版本控制与发布。第7章介绍应用程序的全球化部署。
还有一些关于集群管理的章节,包括关于资源管理的第8章、关于网络的第9章、关于Pod安全的第10章、关于集群策略与治理的第11章、关于多集群管理的第12章以及关于准入控制与授权的第17章。最后,有几章是完全独立的,其中包括外部服务集成(第13章)和机器学习(第14章)。
尽管在付诸实践之前先阅读所有章节可能会很有用,但我们更希望你能将本书当作参考手册来使用。它旨在作为指南,为你在实际工作中实践这些主题时提供指导。