书名:云原生测试实战
ISBN:978-7-115-61873-3
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 孙高飞
责任编辑 孙喆思
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书用通俗易懂的语言介绍云原生理论基础,用丰富的实际案例还原云原生测试场景,是一本专注于讲述云原生测试的实战图书。本书共9章,第1章至第3章主要介绍云原生基础,包括云原生的概念和相关测试挑战,Docker的核心能力和测试场景,Kubernetes的集群搭建、常用对象和定制化开发等内容;第4章至第6章主要介绍云原生测试场景,包括在Kubernetes中实施混沌工程、性能测试、稳定性测试,使用Prometheus搭建监控系统等内容;第7章至第9章主要介绍云原生与其他领域相结合的测试场景,包括边缘计算、CI/CD和大数据技术与Kubernetes结合的测试场景及对应的测试方案。
本书适合在云领域工作的测试人员学习与借鉴,也适合对云和容器技术感兴趣的人员阅读与参考。
随着越来越多的企业开始应用云原生技术栈推动业务和架构的发展,Docker和Kubernetes逐渐成为大多数IT从业人员必备的技能并在面向B端的领域大放光彩,它们被融入产品并提供给用户使用。因此,在云原生架构下开展测试已经成为质量保证行业中一个重要的细分领域。在本书中,作者结合自建测试平台的经验,详细地总结了云原生架构下的测试方案,帮助测试人员解决云原生架构下的测试难题。
——黄小明 腾讯云智能总监
容器技术相关的图书并不少,但大多都从开发和运维的视角进行科普和实践内容的讲解,很难指导测试人员在云原生背景下开展测试活动,建立质量保证体系。因此,业界急需从测试人员视角出发的侧重云原生架构和相关测试理论的图书,本书满足了行业需要。本书内容丰富,案例众多,包含容器基础技术、云原生架构特点、在云原生架构下开发对应的测试工具和各项测试实践的细节。本书通俗易懂且实用性强,适合相关领域的测试人员阅读。
——杨春晖 工业和信息化部电子第五研究所研究员、高级工程师
随着云计算和边缘计算的普及,云原生已经成为当今软件行业发展的核心元素。在云原生时代,如何在工业级产品应用中适配云平台的网络,以及存储、算力、调度等方面的难题,已经成为相关从业人员重点学习的内容。而测试人员还需探索如何保证云原生产品质量、如何研究各项测试活动,以及如何利用云原生的特性构建更有效的测试技术。本书深入研究和探讨这些问题,汇集业界的最新实践成果,从理论、方法和实践层面进行全面的分析和总结,为在云原生架构下工作的从业人员提供参考资料和学习指南,帮助读者快速入门容器技术并开展云原生测试。
——朱华亮 百度主任架构师
2016年4月高飞在TesterHome写了第一篇文章,从此开始了篇篇精华之路。那时候我们还在移动测试方向“玩”得不亦乐乎,高飞已经开始研究容器、大数据、机器学习等领域了。我曾经有一个签名“和高飞学Kubernetes”,虽然我一直没有用心学,但是高飞的精华文章从没有停止。高飞的容器相关的文章随着他工作经验的丰富,越来越成体系,并终于在2023年成书。我们可以在市面上搜到很多关于云原生、关于Kubernetes的开发和运维的图书,但是从测试角度切入,向大家介绍如何测试云原生产品的图书少之又少,即便书中有相关内容,也是粗浅地带过。通过本书的内容简介,可以看出这是一本有细节、有落地的图书。这得益于高飞在第四范式做测试工作的时候,对Kubernetes的专研和在日常业务迭代中的应用。随着越来越多的应用“生”在云上,“长”在云上,云原生已经成为各大互联网公司技术发展的主要方向,Kubernetes作为云原生的核心平台,无论是开发人员、测试人员,还是运维人员,都需要去了解、学习和掌握它。测试人员想要了解如何保障云原生产品的质量(如高可用性和稳定性),阅读真正有这方面经验的前辈写的书是很好的学习途径。正所谓“师傅领进门,还带你修行”,相信读者阅读本书会有所收获。
——张立华(恒温) 蚂蚁高级测试开发专家
目前云原生技术应用越来越广泛,而其测试技术却很缺乏。本书全面介绍了各种云原生场景,特别是故障注入、混沌工程和边缘计算等场景的测试方案,还介绍了我个人比较关注的云原生产品的性能测试和监控数据收集,这些内容都非常值得参考和借鉴。
——齐涛(道长) 南方基金网络金融部测试负责人,
《Robot Framework自动化测试修炼宝典》作者
随着云计算和DevOps的广泛应用,容器技术及其应用成为当下软件行业非常热门的话题。在此背景下,从业人员发现传统的测试技能已经无法满足云原生时代的需要。测试人员需要面对在云原生架构下保证产品的质量,实践基于容器技术的自动化测试、性能测试、容量测试、混沌工程以及环境治理等一系列问题。这些问题或许可以从本书中找到答案,本书从Docker和Kubernetes技术出发,全面介绍了云原生架构的特点和测试活动的细节,非常适合在云原生架构下工作的测试人员以及对该领域有兴趣的从业人员阅读。
——陈振宇 南京大学软件学院教授、博导
本书是非常实用的技术图书,对在现代云原生环境下进行测试工作的读者来说非常有价值。本书深入介绍了云原生测试的概念、策略、工具和实践,涵盖了云原生应用、微服务、容器、Kubernetes等相关技术,并且从性能、稳定性、持续集成、大数据等不同角度出发,讲解了云原生产品的各种测试场景以及测试场景的具体实现,读者可以通过本书循序渐进地学习和了解云原生测试。本书融合了理论和实践,让读者既能深入理解云原生测试的原理和策略,又能使用具体的工具和框架实践,非常值得推荐。本书不仅对测试人员有用,对在云原生环境下进行开发和部署的人员,也具有一定的参考价值。
——邓东汉 前平安银行测试专家
容器技术的出现带来了云技术的爆发式发展,随着相关云端应用数量和规模的增加,工业界急需一套自动部署、扩缩和管理容器的应用,Kubernetes应运而生。当前介绍Kubernetes及其所赋能的领域的测试方面的图书很少,本书恰到好处地面世了。本书详细介绍的混沌工程、分布式压力测试以及与Jenkins结合的CI/CD等内容特别能体现质量保证的技术力和生产力,在我的互联网大厂工作经历中,这些专项的产物都是作为基础建设,在公司生产发布活动中发挥着重要的作用,这些内容值得重点学习和拓展研究。
——哈莫(Harmo) 前腾讯高级测试开发工程师
其实一直以来我都没有写书的想法,我习惯将工作中的点点滴滴都记录在TesterHome社区,我那“随心所欲且跳脱”的行文风格非常适合社区,与社区伙伴的互动也让我收获良多。我复盘了这些年在社区中记录的点点滴滴,发现已经积累了差不多150篇技术文章,这些文章奠定了本书的基础,也是我编写本书的原因。在2021年末,我像往常一样在微信群中与朋友们聊天,当聊到行业中的某些图书的时候,恒温突然说:“高飞,你都在社区写了这么多篇文章了,要不我帮你联系出版社,你也写本书出来吧。”就是这句话让我鬼使神差地开始了写书之旅。当天晚上,恒温给我介绍了人民邮电出版社的编辑,定下了写作的大致范围。直到几天后,我才反应过来自己到底接下了一件多大的事情。在我的印象中,写书是一件传道育人的大事情,书中的内容需要经得起考验,稍不严谨就会误人子弟,所以我反应过来后倍感压力,在这一年多我始终保持诚惶诚恐的态度在写作。
当思考书中内容应该围绕什么主题展开的时候,我回顾了一下自己的职业生涯,希望能表达出自己最为擅长且对测试同行有所帮助的东西。之所以最后选择了“云原生”这个主题,一是因为最近七八年我花费了非常多的精力在云原生领域,二是因为我认为云原生会在软件行业成为中流砥柱,甚至其中的某些技术(如Docker和Kubernetes)在未来会成为从业人员的基本技能。从目前的行业发展来看,这是很有可能的。在国内,各种以云为主要业务的公司和以云为卖点的产品如雨后春笋般涌出,由此市场中产生了对相关测试人才的旺盛需求,尤其在早些年,容器技术并没有被测试行业重视,导致很多公司想招聘到合格的测试人员非常困难,所以作为测试人员,不论是否决定在云原生领域发展,都应该积极积累这方面的知识。当然,我希望能有更多的测试同行进入云原生领域,因为相比一些其他的一般领域,这个领域拥有较高的复杂度和深度,它的挑战性更大却可以为我们带来更多的机会。
因为本书介绍的技术复杂度较高,所以建议对云原生及其基础技术了解较浅的读者先仔细阅读前3章的内容,已经对云原生及其基础技术有较深理解的读者可以跳过此部分内容。下面对每章具体的内容进行介绍。
第1章主要介绍云原生的概念,通过容器、声明式API等关键技术来讲解云原生架构与传统架构的区别,同时介绍在云原生架构中都有哪些重点的测试挑战。
第2章主要讲解容器技术的基础,着重介绍Linux名字空间对容器隔离起到的重要作用,并探讨Docker的底层原理。本书后续章节的内容以第2章的知识为基础。
第3章主要讲解Kubernetes的基础,从对集群搭建的讲解到对各个常用对象的详细介绍,再到对定制化开发内容的讲述,都为后续的测试场景打下坚实的基础。
第4章主要讲解在Kubernetes中实施混沌工程的内容,详细介绍高可用测试的理论知识和实践方法,讲解Chaos Mesh、jvm-sandbox等开源工具的原理和使用方法,并且演示如何通过Kubernetes客户端定制化开发故障工具。
第5章主要讲解在Kubernetes中实施性能测试与使用Prometheus搭建监控系统的相关内容,分别介绍根据PromQL(Prometheus提供的查询语言)定制化开发监控系统,通过虚拟节点测试Kubernetes集群自身性能,以及分布式压力测试工具JMeter,尤其详细地介绍容量测试在云原生领域的特殊之处。
第6章主要讲解在Kubernetes中实施稳定性测试的方法以及对应监控系统的开发,并且会介绍如何利用Kubernetes客户端开发一种与Prometheus完全不同的监控组件,该组件可以感知Kubernetes集群内的瞬时异常并抓取对应的错误信息。
第7章主要讲解Kubernetes与边缘计算相结合的测试场景,以开源项目SuperEdge为例详细讲解边缘计算的各种场景及其对应的测试方案。
第8章主要讲解Kubernetes与持续集成和持续部署相结合的各种测试场景,以Jenkins为例讲解各种场景的流水线设计。
第9章主要讲解Kubernetes与大数据技术相结合的测试场景,以Spark和Flink为例分别介绍批处理场景与流计算场景下的测试方案,并详细介绍如何开发一个支持多种数据源、数据规模、数据格式的大规模的造数工具。
本书的内容偏向场景实战而非理论研究,所以强烈建议大家阅读本书时,可以在一个真实的Kubernetes集群中反复练习,使用minikube(入门学习场景下的简易单节点集群)这类非标准Kubernetes集群可能会遇到不可预知的问题。
本书虽然是个人创造的结晶,但在整个创作过程中离不开TesterHome社区以及人民邮电出版社的帮助,在这里特别感谢TesterHome的创始人张立华(恒温)和人民邮电出版社的编辑孙喆思。另外,本书参考了开源项目的相关文献资料,在此我对这些开源项目的资料提供者表示衷心感谢。
本书提供如下资源:
● 本书源代码;
● 本书思维导图;
● 异步社区7天VIP会员。
要获得以上资源,您可以扫描下方二维码,根据指引领取。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区(https://www.epubit.com/),按书名搜索,进入本书页面,点击“发表勘误”,输入勘误信息,点击“提交勘误”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给本书的责任编辑(sunzhesi@ptpress.com.cn)。
如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。
“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域多年的发展与积淀。异步图书面向IT行业以及各行业使用IT技术的用户。
近几年,云原生(cloud native)成为一个非常热门的话题,在如今的软件行业,如果技术团队还没有投入云原生的“怀抱”,就会被贴上过时的标签。但云原生到底是什么?在已经使用云计算的情况下,云原生为我们带来了什么新的东西?把应用部署在云上就是云原生了吗?相信这些是每个初入云原生领域的人都会感到困惑的问题。在现有资料中,大多数针对云原生的介绍都让人云里雾里,或者不同的资料之间有较大的区别。这是因为云原生并没有确定的实现方式,每个人和组织对于云原生的定义也是不一样的,即使是相同的人随着时间的推移对于云原生也会有新的理解。在这里建议大家不要纠结云原生具体的实现方式,而要搞清楚使用云原生的目的是什么,清楚使用它的目的后,我们自然可以结合自身的工作环境来推导出云原生是什么了。
“云原生”于2010年被提出,它表示一种架构,这种架构能让应用和中间件在云环境中保持良好的运行和迭代状态。在当时,提出云原生的概念以及云原生架构必须包含的属性,是为了能构建一种符合云计算特性的标准来指导云计算应用的编写,原文描述是:“I've been thinking a lot about what it means for applications and middleware to work well in a cloud environment”(我一直在思考应用和中间件在云环境中良好工作意味着什么)。所以,云原生本质上是为了能让程序在云环境中运行和迭代得更好而产生的一种设计思想。理论上云原生没有固定的架构实现,因为云环境的设计是各不相同的,每种云环境都有适合它运行的设计思路。只不过在当今的软件行业,云领域应用最多的是容器技术,所以现在提到云原生往往都绕不开Docker、containerd、Kubernetes(简称K8s)等。本书也将聚焦容器领域,但这并不是说云原生只有容器这一条实现路径。比较正式的定义可以参考CNCF(cloud native computing foundation,云原生计算基金会)的说法:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的关键技术包括容器、服务网格(service mesh)微服务、不可变基础设施和声明式API(application program interface,应用程序接口)。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统做出频繁的重大变更和做出可预测的重大变更。
把程序部署在云中运行和让程序更好地在云中运行是两种完全不一样的设计,前者只需要把应用程序打包后放到云中运行即可,无法保证整个流程的高效和稳定,只是做到了软件的运行基于云,而不是云原生。实现云原生的关键不是在哪里运行应用,而是如何构建应用。这需要在设计之初就考虑到云的设计并最大程度地利用其特点完善整个系统。可以理解为,技术团队应把云环境当作应用的一部分,在最开始就思考如何对接云平台中的网络、存储、安全、通信、调度等特性,尽量利用云平台提供的特性来实现应用,并以此为背景总结出一套可以让产品高效迭代的流程和方法论。例如,在传统的设计中,应用是与服务器绑定的。即便设计了良好的高可用和负载均衡架构,也是把众多服务和数据分布在固定的几台服务器中,一旦服务器崩溃,其中的应用就会停止提供服务。而在云原生的思维方式里,应用是不依赖某个具体的服务器的,应用在部署时声明它需要的资源(内存、CPU、GPU、存储等),云平台会自动把它调度到符合条件的服务器中。而如果该服务器崩溃,云平台也可以把该服务器上所有的应用调度到其他符合条件的服务器中运行。如果应用依赖存储设备,云平台也会提供相应的分布式存储来完成数据的迁移。所以,在CNCF的定义中,云原生的关键技术包括容器(利用容器技术把应用程序都制作成镜像,才可以随意地在任何服务器中部署与运行)、微服务和声明式API等。
在云原生的演化路线中,技术栈中由云平台管理的部分越来越多,云平台接管了软件运行所需要的网络、存储、安全、通信、调度等设计,软件只需要按照规范进行对接就可以完成以前需要很高的成本才能完成的工作。随后,人们发现由开发人员管理的部分越来越少,开发人员只需要关心自己的业务实现,其他的部分都由云平台解决。这样是正确的,因为“云”这个概念被提出的目的就是减少开发团队的开发成本,把他们从复杂的基础设施中解放出来,这也是云原生的目的。
虽然云原生在不同公司的实现方式可能是不一样的,但在业界也确实存在一些常用的实践方法,具体如下。
● 容器化:容器是云原生非常关键的技术之一,通过把应用程序制作成镜像,使得应用与具体的服务器解耦。云平台可以自由地调度资源并充分利用容器的技术优势,如快速启动、更低的资源消耗、更灵活的超卖策略等。
● 微服务化:这是指应用采用微服务架构进行开发,即把应用拆分成一个个独立的微服务,微服务之间采用定义好的API进行通信,每个微服务可以独立开发、升级、扩展与演进,每个微服务还可以采用不同的技术进行开发。微服务也是云原生非常关键的技术之一,把整个系统拆分成众多小而简单的服务,有助于云平台系统实施更加有效的调度策略。
● 弹性能力:应用的性能可以根据实际的需要进行弹性伸缩,在系统负载较高时动态地进行扩容,在系统负载较低时通过缩容来回收资源。一般的云平台都会提供这样的弹性能力,这也得益于容器技术。例如,一个实现了负载均衡的服务拥有两个实例,这两个实例分布在不同的机器中,当业务高峰期来临时,系统发现这两个实例的负载较高后可以选择自动在另外的机器中创建一个新的实例,并把它加入负载均衡来共同承担压力,或者选择不添加新的实例,但动态地为原来的两个实例增加资源配额。
● DevOps:可以说云原生进一步推动了DevOps的发展,尤其是在持续集成与发布领域,利用云原生非常容易实现开发与部署的一体化运作。
云原生还有其他的关键技术,如服务网格、无服务器(serverless)等,只不过它们并不像上面的实践方法那样普及,所以这里就不详细介绍了。
云原生与传统的软件设计方式截然不同,这为测试人员带来了新的挑战,具体有以下几方面的挑战。
● 容器领域的知识储备:在国内,容器技术于2015年崛起,当年Docker成为每个相关领域的技术大会都在谈论的话题。但在当时,行业内更多是把容器技术看作运维领域要解决的问题,所以即便到现在,测试人员对于容器技术的知识积累也仍然有限,想在市面上招聘一名精通容器技术的测试人员仍然十分困难。但在云原生越来越流行的今天,很多测试活动都必须在容器环境下开展,知识储备的不足已经成为测试人员非常大的问题。
● 高可用测试:传统软件迁移到云原生架构中往往需要做出比较大的改造,这些改造对于软件功能的影响往往比较小,但很多潜在的高可用问题比较难发现。每种云平台都会为用户提供各种高可用的设计来帮助用户减少开发成本,而这些高可用的设计与传统软件的高可用设计也会“碰撞”出很多难以预测的“火花”。同时,云原生在为容器注入故障方面也与传统方式有着很大的不同,这些都为测试人员带来了更多的挑战。
● 性能测试与对应的监控系统:在传统的性能测试中,测试人员更关注服务的各项性能指标,基本不会关注服务的资源配额是否合理,或者说在有些传统的软件架构中,可能就没有“配额”这个概念。而在云原生领域,技术人员需要为每个服务设置对应的资源配额,而且设置资源配额有很多种策略。测试人员除了要保证服务的性能符合预期,还需要验证给服务设置的资源配额是否合理,这就出现了一种新的测试类型——容量测试。同时,云原生往往伴随微服务架构,这意味着一个系统中会存在大量的服务,测试人员熟悉的传统监控方式无法满足云原生的测试需求(想象一下,每次测试都需要收集几百个服务的所有资源的使用情况,将是一件多么恐怖的事)。所以,这需要测试人员学习云原生时代最流行的监控系统,并开发对应的性能数据自动收集组件。
● 稳定性测试与对应的监控系统:云平台一般有很强大的自愈能力,正是因为运用了容器技术,在服务崩溃后云平台可以立即发现并将该服务重新调度到可用节点。很多时候服务中断时间很短,测试人员可能根本感知不到服务曾经出现过问题。这对测试人员来说是不友好的,很多由软件设计引起的崩溃问题测试人员往往很难发现。尤其是在云平台上,大量的容器运行在同一台服务器中,很多团队会选择各种超卖策略来提升资源利用率,这也会导致服务互相影响,让系统变得不稳定。所以,能让测试人员感知到这种瞬时的异常事件,并把定位排查的信息收集到一起的监控系统十分重要。测试人员需要开发这样的监控系统并基于此来设计对应的稳定性测试场景。
● 边缘计算:边缘计算在近些年也开始慢慢流行,并且目前许多互联网大厂都开始探索边缘计算与云原生的结合方式,开源社区中也有对应的开源项目。测试人员需要了解该领域的测试方法。
● 持续集成与发布:持续集成与发布作为非常流行的软件实践活动,已经在许多公司有较为成熟的理念和实践方法。而在容器技术流行的今天,如何让容器与云平台更好地集成也是测试人员需要学习的。
● 云原生与大数据:目前云领域早已脱离了早年间大家对它的认知,越来越多的大数据和人工智能(artificial intelligence,AI)项目开始与各个云平台集成,云平台也逐渐满足分布式计算程序运行所需要的条件。在大数据日益普及的今天,测试人员需要开始积累相关的知识。
几年前,云这个概念还离测试行业较远,只有若干大厂才会建设云相关的基础设施,所以在测试行业中从事云领域工作的人还比较少。但是最近几年云计算和云原生越来越流行,行业内的各个公司纷纷开始了“迁云”计划。这一突然的变故在给测试行业带来挑战的同时也带来了机遇,希望大家能抓住机遇,尽早开始储备相关的知识并步入云原生领域。