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资深架构师