图书前言

前言

为什么写作本书

时间回到2022年,那一年年底中国再为世界奉上一部基建杰作: 白鹤滩水电站全部机组投产发电,这一当时世界技术难度最高的水电工程被中国人成功完成。港珠澳大桥、南水北调、中国高铁、空间站建设、探月工程等重大工程一次次证明中国工程师的勤劳与智慧。同样是在2022年年底,美国硅谷一家几百人的公司OpenAI以其AI产品ChatGPT震惊科技界,在AI领域领先了包括国内科技大厂在内的全球IT巨头们至少一代。如果说我国在基建领域独步全球,则在科技领域与国际顶尖水平还有一定的距离。

需要追赶的又何止AI一个领域。单就软件工程范畴而言,主流操作系统、主流商用数据库、电子设计自动化软件(EDA)、软件开发语言、主流开发IDE,甚至软件开发思想鲜有源自我国的。作为汇集超过700万聪明头脑的庞大群体,国内软件工作者不能再满足于达到会用、能用好这一层次,应更进一步地深入优秀软件的核心,探寻其设计的成功之源,从中汲取思想精华以期厚积薄发。在这方面,Kubernetes这类成功开源项目为我们提供了丰富的养料。这便是笔者2023年来做视频、写书籍分享优秀开源项目源码设计的原动力。道阻且长,行则将至。随着越来越多中国软件工程师的觉醒,相信国内软件工程师终将看齐基建同仁,为世界贡献具有创新性的顶级软件作品!

毫无疑问,云平台已成为政企应用的主流支撑平台,云原生作为可最大化云平台资源利用率的一套软件设计原则备受业界推崇。谈云原生就绕不开Kubernetes,它是云原生应用的底座: 容器技术的普及加速了单体应用的微服务化,微服务化是实现云原生诸多原则的前提条件,而微服务化必须解决服务编排问题,Kubernetes就是为了解决这个问题而生的。众所周知Kubernetes源自谷歌内部产品,其前身已历经大规模应用的实践考验,又有大厂做后盾,一经推出便势如破竹,统一了容器编排领域,成为事实上的标准。从应用层面讲解Kubernetes的书籍与资料已经十分丰富,这使滚动更新、系统自动伸缩、系统自愈等曾经时髦的概念及在Kubernetes上的配置方式现如今早已深入人心,但作为软件工程师,不仅可得益于Kubernetes提供的这些能力,同样可受益于它内部实现这些能力的方式,理解其精髓可显著提高工程师的业务水平,而这就鲜有除源码之外的优秀资料了,本书希望在一定程度上弥补这方面的缺憾。笔者选取Kubernetes的核心组件——API Server进行源代码讲解,从代码级别拆解控制器模式、准入控制机制、登录鉴权机制、API Server聚合机制等,力争涵盖API Server所有核心逻辑。为了缓解理解源码的枯燥感,笔者添加数章扩展开发的实践内容,也使学习与应用相辅相成。

带领读者体验Go语言魅力是写作本书的另一个目的。

Go语言诞生于2007年,灵感来自一场C++新特性布道会议中发生的讨论,现如今已经走过17个年头。Go语言的创立者大名鼎鼎,一位是C语言创建者Ken Thompson,另一位是UNIX的开发者Rob Pike,可以说Go语言的起点相当高。这门新语言确实不辱使命,主流的容器引擎均是用Go语言开发的,Kubernetes作为容器编排的事实标准也使用Go语言开发,单凭这两项成就就足以证明其价值。

Go语言在服务器端应用开发、命令行实用工具开发等领域应用越来越广,作为开发语言界的后起之秀,Go语言具有后发优势。以Go语言开发的应用被编译为目标平台的本地应用,所以在效率上相对依赖虚拟机的应用有优势;它在语法上比C语言简单,内存管理也更出众,具有易用性,而相对C++,Go语言更简单,用户也不用操心指针带来的安全问题。如果只看语法,则Go语言是相对简单的一门编程语言。若有C语言基础,则上手速度几乎可以用小时计,但要充分发挥Go语言的强悍能力则需对其有较为深入的理解和实践。为了帮助开发者更好地使用它,Go语言团队撰写了Effective Go一文,给出诸多使用的最佳实践,这些最佳实践在Kubernetes的源码中被广泛应用,这就使学习Kubernetes源码成为提升Go语言能力的一条路径。

目标读者

本书内容围绕Kubernetes API Server源代码展开,力图分析清楚它的设计思路,其内容可以帮助如下几类读者。

1. 希望提升系统设计能力的开发者

它山之石,可以攻玉。

入门软件开发并非难事,但要成为高阶人才去主导大型系统设计却实属不易。优秀架构师在能够游刃有余地挥洒创意之前均进行了常年积累。除了不断更新技术知识、学习经典设计理论、在实践中不断摸索外,从成功项目中汲取养料也是常用的进阶之道。Kubernetes项目足够成功,其社区成员已是百万计。它聚数十万优秀软件开发人员之力于一点,每个源文件、每个函数均经过认真思考与审核,其中考量耐人寻味。从源代码分析Kubernetes的设计正是本书的立足点。

API Server所应用的诸多设计实现为开发者提供了有益参考。例如控制器模式、准入控制机制、各种Webhook机制、登录认证策略、请求过滤的实现、OpenAPI服务说明的生成、Go代码生成机制、以Generic Server为底座的子Server构建方式等。上述每项设计思路均可应用到其他项目,特别是用Go语言开发的项目中。

本书中包含大量源代码的讲解,需要读者具有基本的Go语言语法知识;同时,当涉及Kubernetes的基本概念和操作时本书不会深入讲解,故需要读者具备Kubernetes的基础知识。不过读者阅读本书前不必成为这些方面的专家。

2. Kubernetes运维团队成员、扩展开发人员

知其然且知其所以然始终是做好软件运维工作的有力保证。了解Kubernetes功能的具体实现可让运维人员对系统能力有更深刻的认识,提升对潜在问题的预判能力,对已出现的故障迅速定位。相较于软件开发工程师,运维工程师一般不具备很强的开发能力,所以探究源码会比较吃力。本书有条理地带领读者厘清API Server各个组件的设计,降低了源码阅读的门槛。

笔者始终认为Kubernetes最强的一面恰恰是它最被忽视的高扩展能力。根据公开报道,国内外科技大厂(如谷歌、AWS、微软、字节跳动等)均有利用这些扩展能力做适合自身平台的客制化。目前讲解API Server客制化的资料并不系统。本书希望将API Server的客制化途径讲解清楚: 既介绍扩展机制的源代码实现,又讲解如何利用扩展机制进行客制化开发,希望为扩展开发人员提供相应参考。 

3. 希望提升Kubernetes知识水平的从业者

由表及里是领会任何技术的一个自然过程。随着最近三年线上办公的火爆,云平台的普及大大提速,Kubernetes作为云应用的重要支撑工具已被广泛应用,一批优秀的系统管理员在成长过程中开始产生深入了解Kubernetes功能背后原理的需求。拿众所周知的滚动更新机制举例,通过文档可以了解到其几个参数的含义,但很拗口,并且难记,有不明就里的感觉,但通过查看Deployment控制器源代码,将这些参数映射到程序的几个判断语句后,一切也就简单明朗了。

4. Go语言的使用者

Go语言的使用者完全可以利用Kubernetes项目来快速提升自己的工程能力。作为Kubernetes中最核心也是最复杂的组件,API Server的源码充分体现了Go语言的多种最佳实践。读者会看到管道(channel)如何编织出复杂的Server状态转换网,会看到优雅应用协程(Go Routine)的方式,也会学习到如何利用函数对象,以及诸多技术的应用方式。通过阅读API Server源码来提升自身Go语言水平一举多得。

5. 期望了解开源项目的开发者

开源在过去30年里极大地加速了软件行业的繁荣,在主要的应用领域开源产品起到了顶梁柱的作用,例如Linux、Android、Kubernetes、Cloud Foundry、Eclipse、PostgreSQL等。软件开源早已超出代码共享的范畴,成为一种无私、共同进步的精神象征。众多软件从业者以参与开源项目为荣。

本书在介绍源码的同时也展示了Kubernetes的社区治理,读者会看到这样一个百万人级别的社区角色如何设定,任务怎么划分,代码提交流程,质量保证手段。通过这些简要介绍,读者可以获得对开源项目管理的基本知识,为参与其中打下基础。如果聚焦API Server这一较小领域,则读者在本书的帮助下将掌握项目结构和核心代码逻辑,辅以一定量的自我学习便可参与其中。

资源下载提示

素材(源码)等资源: 扫描目录上方的二维码下载。

视频等资源: 扫描封底的文泉云盘防盗码,再扫描书中相应章节的二维码,可以在线学习。

致谢

特别感谢读者花时间阅读本书。本书的撰写历经坎坷。准备工作从2022年便已开始,为了保证严谨,笔者翻阅了API Server的所有源文件,让每个知识点都能落实到代码并经得起推敲。写作则贯穿2023年一整年,这几乎占去了笔者工作之余、教育儿女之外的所有空闲时间。笔者水平有限,书中仍有可能存在疏漏之处,期望读者能给予谅解并不吝指正,感激不尽!

笔者深知如果没有外部的帮助,则很难走到出版这一步,在此感谢所有人的付出。

首先特别感恩笔者所在公司和团队所提供的机会,让笔者在过去的多年里有机会接触云与Kubernetes,并能有深挖的时间。2023年笔者团队痛失栋梁,困难时刻团队成员勇于担当,共渡难关,让这本书的写作得以继续。谨以此书纪念那位已逝去的同事。

其次感谢家人的付出,作为两个孩子的父亲,没有家人的分担是无法从照顾孩子的重任中分出时间写作的,这本书的问世得益于你们的支持。

感谢清华大学出版社赵佳霓编辑,谢谢您在写作前的提点、审批协助及校稿过程中的辛勤付出。

张海龙2024年元旦于上海