新書推薦:
《
革命与反革命:社会文化视野下的民国政治(近世中国丛书)
》
售價:NT$
435.0
《
画楼:《北洋画报》忆旧(年轮丛书)
》
售價:NT$
1573.0
《
大国脊梁:漫画版
》
售價:NT$
374.0
《
跟着渤海小吏读历史:大唐气象(全三册)
》
售價:NT$
989.0
《
心智的构建:大脑如何创造我们的精神世界
》
售價:NT$
352.0
《
美国小史(揭秘“美国何以成为美国”,理解美国的经典入门读物)
》
售價:NT$
352.0
《
中国古代北方民族史丛书——东胡史
》
售價:NT$
576.0
《
巨人传(插图珍藏本)
》
售價:NT$
3289.0
編輯推薦:
全面、翔实、有条理:本书涵盖了APIServer全部核心功能的源码实现,同时还包括社区治理、核心功能介绍、工具框架与概念介绍等非源码知识,为理解源码提供充足背景知识,降低理解门槛。不同于其他同类书籍,本书代码讲解粒度较细,各模块关联性体现得更为充分,条理性更强,从而降低阅读门槛。本书着力成为一本易读易懂的Kubernetes源码介绍书籍。
紧密结合实践:软件工程技能的提升离不开实践。本书第三篇专注APIServer的扩展开发,夯实第一篇和第二篇所讲源码知识。所选开发案例具有代表性,并针对同一场景应用不同扩展技术,在对比中体现各自的所长。
源码版本高 Kubernetes版本迭代迅速,本书针对写作时的最高版本v1.27编写。相较前序版本,该版本的APIServer部分源码存在较大变化,本书内容考虑了这些变化。
始于源码但不止于源码:Kubernetes项目贡献者以十万计,是史上最优秀的开源项目之一。本书介绍了该社区的治理模式和代码贡献流程,对开源感兴趣的读者必有所悟。同时,Go语言已成为开发者不容忽视的主流开发语言,APIServer使用Go语言开发,其诸多实现细节均流露出这
內容簡介:
本书第一主题为解析 Kubernetes API Server 源代码;第二主题是结合源码知识进行扩展开发。全书分为3篇12章。
第一篇为基础篇(第1章和第2章)。第1章简介Kubernetes及其组件,并迅速切入API Server,统一全书使用的概念名词,介绍其主要设计模式。第2章介绍Kubernetes项目组织和社区治理。组织结构对系统的设计有着直接影响,这部分帮助读者理解代码背后的人和组。在第2章读者也会看到如何参与Kubernetes项目,特别是贡献代码的过程。
第二篇为源码篇(第3~8章)是本书的核心篇章。第3章宏观展示API Server源代码的组织,总体架构设计等,其中关于启动流程的源码部分与本篇后续章节衔接紧密;第4章聚焦整个系统核心对象——Kubernetes API,本章将API分为几大类并讲解为API进行的代码生成;第5章到第8章分别解析API Server 的各个子 Server 源码,它们是GenericServer、主Server、扩展Server、聚合器与聚合Server。
第三篇为实战篇(第9~12章)讲解三种主流API Server扩展方式。作为辅助理解源码的手段之一,第9章不借助脚手架开发一个聚合Server;第10章为后两章基础,聚焦API Server Builder和Kubebuilder两款官方开发脚手架;第11章用 API Server Builder重写第9章的聚合Server;第12章用Kubebuilder开发一个操作器(Operator)。
本书适合Kubernetes系统运维人员、扩展开发人员、使用Go的开发者及希望提升设计水平的软件从业人员阅读,需具备Go语言和Kubernetes基础知识。
關於作者:
张海龙,复旦大学软件工程硕士、数学学士。从事企业管理软件开发16年,专注于软件生命周期管理领域。参与、管理大型云原生软件开发项目多年,具有丰富的大型单体软件微服务化经验。现任外企软件开发团队经理,拥有十多年团队管理经验。
目錄 :
第一篇基础篇
第1章Kubernetes与API Server概要(30min)3
1.1Kubernetes组件3
1.1.1控制面上的组件3
1.1.2节点上的组件6
1.2Kubernetes API 基本概念8
1.2.1API和API对象8
1.2.2API种类9
1.2.3API组和版本10
1.2.4API资源10
1.3API Server11
1.3.1一个Web Server11
1.3.2服务于API13
1.3.3请求过滤链与准入控制16
1.4声明式API和控制器模式17
1.4.1声明式API17
1.4.2控制器和控制器模式20
1.5本章小结26
第2章Kubernetes项目(17min)27
2.1Kubernetes社区治理27
2.1.1特别兴趣组 29
2.1.2SIG内的子项目组30
2.1.3工作组30
2.2开发人员如何贡献代码31
2.2.1开发流程31
2.2.2代码提交与合并流程32
2.3源代码下载与编译33
2.3.1下载33
2.3.2本地编译与运行34
2.4本章小结35
第二篇源码篇
第3章API Server(46min)39
3.1Kubernetes工程结构39
3.1.1顶层目录39
3.1.2staging目录40
3.1.3pkg目录43
3.2Cobra44
3.2.1命令的格式规范45
3.2.2用Cobra写命令行应用46
3.3整体结构49
3.3.1子Server49
3.3.2再谈聚合器51
3.4API Server的创建与启动51
3.4.1创建Cobra命令52
3.4.2命令的核心逻辑54
3.4.3CreateServerChain()函数56
3.4.4总结与展望58
3.5本章小结59
第4章Kubernetes API(44min)60
4.1Kubernetes API源代码61
4.1.1内部版本和外部版本62
4.1.2API的属性64
4.1.3API的方法与函数68
4.1.4API定义与实现的约定73
4.2内置API75
4.3核心API77
4.4代码生成80
4.4.1代码生成工作原理80
4.4.2代码生成举例91
4.4.3触发代码生成93
4.5本章小结95
第5章Generic Server(83min)96
5.1Go语言实现Web Server96
5.2gorestful 99
5.2.1gorestful简介99
5.2.2gorestful中的核心概念100
5.2.3使用gorestful102
5.3OpenAPI102
5.3.1什么是OpenAPI102
5.3.2Kubernetes使用OpenAPI规格说明103
5.3.3生成API OpenAPI规格说明105
5.3.4Generic Server与OpenAPI108
5.4Scheme机制110
5.4.1注册表的内容111
5.4.2注册表的构建112
5.5Generic Server的构建119
5.5.1准备Server运行配置119
5.5.2创建Server实例120
5.5.3构建请求处理链121
5.5.4添加启动和关闭钩子函数128
5.6Generic Server的启动129
5.6.1启动准备129
5.6.2启动130
5.7API 的注入与请求响应138
5.7.1注入处理流程139
5.7.2WebService及其Route生成过程142
5.7.3响应对Kubernetes API的HTTP请求146
5.8准入控制机制153
5.8.1什么是准入控制153
5.8.2准入控制器155
5.8.3动态准入控制159
5.9一个HTTP请求的处理过程163
5.10本章小结165
第6章主Server(54min)166
6.1主Server的实现166
6.1.1填充注册表167
6.1.2准备Server运行配置168
6.1.3创建主Server171
6.2主Server的几个控制器174
6.2.1ReplicaSet 控制器175
6.2.2Deployment 控制器177
6.2.3StatefulSet 控制器180
6.2.4Service Account 控制器182
6.3主Server的准入控制186
6.3.1运行选项和命令行参数186
6.3.2从运行选项到运行配置188
6.3.3从运行配置到Generic Server190
6.4API Server的登录验证机制191
6.4.1API Server登录验证基础192
6.4.2API Server的登录验证策略195
6.4.3API Server中构建登录认证机制199
6.5本章小结204
第7章扩展Server(34min)205
7.1CustomResourceDefinition介绍205
7.1.1CRD的属性206
7.1.2客制化API属性的定义与校验209
7.1.3启用Status和Scale子资源212
7.1.4版本转换的Webhook213
7.2扩展Server的实现215
7.2.1独立模块215
7.2.2准备Server运行配置216
7.2.3创建扩展Server217
7.2.4启动扩展Server226
7.3扩展Server中控制器的实现228
7.3.1发现控制器228
7.3.2名称控制器231
7.3.3非结构化规格控制器232
7.3.4API审批控制器234
7.3.5CRD 清理控制器235
7.4本章小结236
第8章聚合器和聚合Server(32min)237
8.1聚合器与聚合Server介绍237
8.1.1背景与目的237
8.1.2再谈API Server结构238
8.2聚合器的实现240
8.2.1APIService简介241
8.2.2准备Server运行配置 243
8.2.3创建聚合器243
8.2.4启动聚合器247
8.2.5聚合器代理转发HTTP请求256
8.3聚合器中控制器的实现258
8.3.1自动注册控制器与CRD注册控制器258
8.3.2APIService注册控制器260
8.3.3APIService状态监测控制器264
8.4聚合Server266
8.4.1最灵活的扩展方式267
8.4.2聚合Server的结构269
8.4.3委派登录认证270
8.4.4委派权限认证273
8.5本章小结277
第三篇实战篇
第9章开发聚合Server(32min) 281
9.1目标281
9.2聚合Server的开发282
9.2.1创建工程283
9.2.2设计API284
9.2.3生成代码287
9.2.4填充注册表291
9.2.5资源存取293
9.2.6编写准入控制299
9.2.7添加Web Server301
9.2.8部署与测试307
9.3相关控制器的开发317
9.3.1设计318
9.3.2实现318
9.3.3如何启动322
9.3.4测试324
9.4本章小结325
第10章API Server Builder与Kubebuilder(14min)326
10.1controllerruntime 326
10.1.1核心概念326
10.1.2工作机制328
10.2API Server Builder329
10.2.1概览330
10.2.2Builder用法331
10.3Kubebuilder334
10.3.1概览334
10.3.2功能335
10.3.3开发步骤335
10.4本章小结339
第11章API Server Builder开发聚合Server(17min)340
11.1目标340
11.2聚合Server的开发341
11.2.1工程初始化341
11.2.2创建v1alpha1版API并实现342
11.2.3添加v1版本API并实现346
11.3相关控制器的开发349
11.4部署与测试350
11.4.1准备工作350
11.4.2制作镜像351
11.4.3向集群提交353
11.4.4测试353
11.5本章小结356
第12章Kubebuilder开发Operator(15min)357
12.1目标357
12.2定义CRD357
12.2.1项目初始化357
12.2.2添加客制化API358
12.3相关控制器的开发360
12.3.1实现控制器360
12.3.2本地测试控制器361
12.4准入控制Webhook的开发362
12.4.1引入准入控制Webhook362
12.4.2实现控制逻辑363
12.5部署至集群并测试364
12.5.1制作镜像364
12.5.2部署certmanager365
12.5.3部署并测试366
12.6本章小结367
內容試閱 :
为什么写作本书
时间回到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年元旦于上海