本书主要分析了Kubernetes核心功能的实现原理,是一本帮助读者了解Kubernetes架构设计及内部原理实现的书。由于Kubernetes代码量较大,源码不容易理解,所以本书将梳理相关知识点,帮助读者快速学习。
本书共分为8章,第1章简要介绍了Kubernetes架构的核心组件,以及每个核心组件在架构中的作用;第2章主要介绍了Kubernetes构建过程中的源码实现;第3章主要介绍了Kubernetes的核心数据结构定义及围绕资源展开的核心功能;第4章主要介绍了kubectl命令行交互工具的实现机制;第5章主要介绍了client-go编程式交互工具的实现机制;第6章主要介绍了Etcd存储的核心实现;第7章主要介绍了kube-apiserver组件的核心实现;第8章主要介绍了kube-scheduler组件的核心实现。
适读人群 :本书适合云计算领域的相关技术人员、Kubernetes开发者、Go语言开发者等阅读。 1 业内专家来炜、杨思杰、孙宏亮、宋净超联袂力荐。
2 这是一本从源码层面介绍Kubernetes的技术图书,从架构到源码,细致入微,全面详尽。
3 本书主要介绍了Kubernetes构建中的源码实现、Kubernetes核心数据结构、kubectl命令行交互工具、client-go编程式交互工具、Etcd存储、kube-apiserver组件和kube-scheduler组件的核心实现等内容。
4 本书适合云计算领域的相关技术人员、Kubernetes开发者、Go语言开发者等阅读。
前言
近几年,容器技术越来越普及。据Gartner预估,到2022年,全球将有75%的公司使用容器技术,而在2017年,这个比例还不到20%,这说明容器技术的发展非常迅速。容器技术的火热引发了容器编排技术的发展,目前最受欢迎的容器编排系统是Kubernetes,其引领着技术潮流,用于应对生产环境中编排容器所需的额外复杂度及成本。Kubernetes系统帮助企业加快了容器编排的速度,并实现了对多容器集群的大规模管理。它允许持续集成和交付、网络处理、服务发现及存储服务等,并具有在多云环境下进行操作的能力。
很多人都在说掌控了Kubernetes等于掌控了云计算的未来,这是为什么呢?在过去的几年里,Kubernetes发展飞速,社区也随之壮大,截至本书截稿时,Kubernetes项目在GitHub上已有接近6万个Star,拥有8万多次提交量。
Kubernetes系统已经越来越成熟,很多企业对它的应用从试水阶段逐步走向大规模落地阶段,但随着Kubernetes系统越来越稳定、成熟,代码的迭代能力逐渐变弱了。底层代码的成熟和健壮能够支撑更大的上层应用,这便让更多优秀的生态应用围绕着Kubernetes系统各自发展。这得益于Kubernetes系统的高扩展性,Kubernetes越来越像一个系统核心,对外提供通用接口,实现了众多标准化。另外,Kubernetes得到了许多云服务提供商(Cloud Provider)的支持,例如Google、Cisco、VMware、Microsoft、Amazon及许多其他大型公司。
建议读者在阅读Kubernetes源码的过程中,学习一些关于设计模式(Design Pattern)的知识,这样有助于大家理解源码的实现原理,而非只是泛泛地看代码。例如,在Go语言中常用NewXXX函数来实例化相关类,在设计模式中,其被称为简单工厂模式,该设计模式在Go语言中替代了其他语言中的构造函数功能。不同语言的设计模式原理基本相同,只是在语法实现方式上有所不同。对于Go语言的设计模式,大家可以参考Go Design Pattern(参见链接[1])。
学习Kubernetes代码库并不容易,它拥有大量的源码,学习过程会比较枯燥,但通过对源码的学习,我们一定会收益良多。本书将基于Kubernetes 1.14.0版本来深入研究和分析Kubernetes源码的关键部分,希望能对读者有所帮助。建议读者在阅读本书的同时参考Kubernetes源码文件,这样学习效果更佳。
最后,谨以此书献给我的爱人和我刚出世的女儿。
联系作者
由于作者时间与水平有限,因此书中难免出现遗漏或错误,如果读者发现相关问题,请及时与我联系,联系方式为shanhu5739@gmail.com。非常希望与大家共同学习和交流。
本书涉及的链接说明
为了保证书中涉及的相关链接可以实时更新,特地将“链接地址”文档放于博文视点官方网站,如书中标有“参见链接[1]”“参见链接[2]”等字样时,可在该文档中查询相关链接。读者可在http://www.broadview.com.cn/38914页面下载或通过“读者服务”中提供的方式获取 “链接地址”文档。
读者服务
扫码回复:38914
√获取博文视点学院20元付费内容抵扣券
√加入读者交流群,与更多读者互动
√获取本书配套下载文件(“链接地址”文档)
√获取免费增值资源
第1章Kubernetes架构1
1.1Kubernetes的发展历史1
1.2Kubernetes架构图2
1.3Kubernetes各组件的功能4
1.3.1kubectl5
1.3.2client-go5
1.3.3kube-apiserver5
1.3.4kube-controller-manager6
1.3.5kube-scheduler7
1.3.6kubelet7
1.3.7kube-proxy8
1.4KubernetesProjectLayout设计9
第2章Kubernetes构建过程13
2.1构建方式13
2.2本地环境构建15
2.2.1一切都始于Makefile16
2.2.2本地构建过程17
2.3容器环境构建18
2.4Bazel环境构建22
2.4.1使用Bazel构建和测试Kubernetes源码23
2.4.2Bazel的工作原理25
2.5代码生成器26
2.5.1Tags27
2.5.2deepcopy-gen代码生成器29
2.5.3defaulter-gen代码生成器30
2.5.4conversion-gen代码生成器32
2.5.5openapi-gen代码生成器34
2.5.6go-bindata代码生成器36
2.6代码生成过程37
2.7gengo代码生成核心实现40
2.7.1代码生成逻辑与编译器原理41
2.7.2收集Go包信息42
2.7.3代码解析45
2.7.4类型系统48
2.7.5代码生成51
第3章Kubernetes核心数据结构57
3.1Group、Version、Resource核心数据结构57
3.2ResourceList59
3.3Group62
3.4Version63
3.5Resource65
3.5.1资源外部版本与内部版本66
3.5.2资源代码定义68
3.5.3将资源注册到资源注册表中71
3.5.4资源首选版本71
3.5.5资源操作方法72
3.5.6资源与命名空间75
3.5.7自定义资源77
3.5.8资源对象描述文件定义78
3.6Kubernetes内置资源全图79
3.7runtime.Object类型基石83
3.8Unstructured数据85
3.9Scheme资源注册表87
3.9.1Scheme资源注册表数据结构87
3.9.2资源注册表注册方法91
3.9.3资源注册表查询方法92
3.10Codec编解码器92
3.10.1Codec编解码实例化94
3.10.2jsonSerializer与yamlSerializer序列化器95
3.10.3protobufSerializer序列化器98
3.11Converter资源版本转换器100
3.11.1Converter转换器数据结构101
3.11.2Converter注册转换函数102
3.11.3Converter资源版本转换原理104
第4章kubectl命令行交互111
4.1kubectl命令行参数详解111
4.2Cobra命令行参数解析114
4.3创建资源对象的过程119
4.3.1编写资源对象描述文件120
4.3.2实例化Factory接口120
4.3.3Builder构建资源对象121
4.3.4Visitor多层匿名函数嵌套122
第5章client-go编程式交互128
5.1client-go源码结构128
5.2Client客户端对象129
5.2.1kubeconfig配置管理130
5.2.2RESTClient客户端134
5.2.3ClientSet客户端137
5.2.4DynamicClient客户端139
5.2.5DiscoveryClient客户端141
5.3Informer机制144
5.3.1Informer机制架构设计145
5.3.2Reflector149
5.3.3DeltaFIFO154
5.3.4Indexer158
5.4WorkQueue162
5.4.1FIFO队列163
5.4.2延迟队列165
5.4.3限速队列166
5.5EventBroadcaster事件管理器170
5.6代码生成器176
5.6.1client-gen代码生成器176
5.6.2lister-gen代码生成器180
5.6.3informer-gen代码生成器182
5.7其他客户端185
第6章Etcd存储核心实现187
6.1Etcd存储架构设计187
6.2RESTStorage存储服务通用接口189
6.3RegistryStore存储服务通用操作190
6.4Storage.Interface通用存储接口192
6.5CacherStorage缓存层194
6.5.1CacherStorage缓存层设计195
6.5.2ResourceVersion资源版本号199
6.5.3watchCache缓存滑动窗口201
6.6UnderlyingStorage底层存储对象204
6.7Codec编解码数据206
6.8Strategy预处理209
6.8.1创建资源对象时的预处理操作209
6.8.2更新资源对象时的预处理操作211
6.8.3删除资源对象时的预处理操作212
6.8.4导出资源对象时的预处理操作213
第7章kube-apiserver核心实现214
7.1热身概念215
7.1.1go-restful核心原理215
7.1.2一次HTTP请求的完整生命周期218
7.1.3OpenAPI/Swagger核心原理219
7.1.4HTTPS核心原理222
7.1.5gRPC核心原理224
7.1.6go-to-protobuf代码生成器225
7.2kube-apiserver命令行参数详解231
7.3kube-apiserver架构设计详解243
7.4kube-apiserver启动流程244
7.4.1资源注册245
7.4.2Cobra命令行参数解析248
7.4.3创建APIServer通用配置249
7.4.4创建APIExtensionsServer257
7.4.5创建KubeAPIServer261
7.4.6创建AggregatorServer266
7.4.7创建GenericAPIServer269
7.4.8启动HTTP服务270
7.4.9启动HTTPS服务272
7.5权限控制272
7.6认证273
7.6.1BasicAuth认证276
7.6.2ClientCA认证277
7.6.3TokenAuth认证278
7.6.4BootstrapToken认证279
7.6.5RequestHeader认证281
7.6.6WebhookTokenAuth认证282
7.6.7Anonymous认证284
7.6.8OIDC认证285
7.6.9ServiceAccountAuth认证288
7.7授权291
7.7.1AlwaysAllow授权295
7.7.2AlwaysDeny授权296
7.7.3ABAC授权297
7.7.4Webhook授权298
7.7.5RBAC授权300
7.7.6Node授权309
7.8准入控制器310
7.8.1AlwaysPullImages准入控制器315
7.8.2PodNodeSelector准入控制器316
7.9进程信号处理机制318
7.9.1常驻进程实现318
7.9.2进程的优雅关闭319
7.9.3向systemd报告进程状态320
第8章kube-scheduler核心实现321
8.1kube-scheduler命令行参数详解321
8.2kube-scheduler架构设计详解324
8.3kube-scheduler组件的启动流程326
8.3.1内置调度算法的注册327
8.3.2Cobra命令行参数解析328
8.3.3实例化Scheduler对象329
8.3.4运行EventBroadcaster事件管理器331
8.3.5运行HTTP或HTTPS服务331
8.3.6运行Informer同步资源332
8.3.7领导者选举实例化332
8.3.8运行sched.Run调度器333
8.4优先级与抢占机制333
8.5亲和性调度335
8.5.1NodeAffinity336
8.5.2PodAffinity337
8.5.3PodAntiAffinity338
8.6内置调度算法339
8.6.1预选调度算法339
8.6.2优选调度算法340
8.7调度器核心实现342
8.7.1调度器运行流程342
8.7.2调度过程343
8.7.3Preempt抢占机制351
8.7.4bind绑定机制356
8.8领导者选举机制357
8.8.1资源锁358
8.8.2领导者选举过程360