本書主要分析了Kubernetes核心功能的實(shí)現(xiàn)原理,是一本幫助讀者了解Kubernetes架構(gòu)設(shè)計(jì)及內(nèi)部原理實(shí)現(xiàn)的書。由于Kubernetes代碼量較大,源碼不容易理解,所以本書將梳理相關(guān)知識(shí)點(diǎn),幫助讀者快速學(xué)習(xí)。
本書共分為8章,第1章簡(jiǎn)要介紹了Kubernetes架構(gòu)的核心組件,以及每個(gè)核心組件在架構(gòu)中的作用;第2章主要介紹了Kubernetes構(gòu)建過程中的源碼實(shí)現(xiàn);第3章主要介紹了Kubernetes的核心數(shù)據(jù)結(jié)構(gòu)定義及圍繞資源展開的核心功能;第4章主要介紹了kubectl命令行交互工具的實(shí)現(xiàn)機(jī)制;第5章主要介紹了client-go編程式交互工具的實(shí)現(xiàn)機(jī)制;第6章主要介紹了Etcd存儲(chǔ)的核心實(shí)現(xiàn);第7章主要介紹了kube-apiserver組件的核心實(shí)現(xiàn);第8章主要介紹了kube-scheduler組件的核心實(shí)現(xiàn)。
適讀人群 :本書適合云計(jì)算領(lǐng)域的相關(guān)技術(shù)人員、Kubernetes開發(fā)者、Go語言開發(fā)者等閱讀。 1 業(yè)內(nèi)專家來煒、楊思杰、孫宏亮、宋凈超聯(lián)袂力薦。
2 這是一本從源碼層面介紹Kubernetes的技術(shù)圖書,從架構(gòu)到源碼,細(xì)致入微,全面詳盡。
3 本書主要介紹了Kubernetes構(gòu)建中的源碼實(shí)現(xiàn)、Kubernetes核心數(shù)據(jù)結(jié)構(gòu)、kubectl命令行交互工具、client-go編程式交互工具、Etcd存儲(chǔ)、kube-apiserver組件和kube-scheduler組件的核心實(shí)現(xiàn)等內(nèi)容。
4 本書適合云計(jì)算領(lǐng)域的相關(guān)技術(shù)人員、Kubernetes開發(fā)者、Go語言開發(fā)者等閱讀。
前言
近幾年,容器技術(shù)越來越普及。據(jù)Gartner預(yù)估,到2022年,全球?qū)⒂?5%的公司使用容器技術(shù),而在2017年,這個(gè)比例還不到20%,這說明容器技術(shù)的發(fā)展非常迅速。容器技術(shù)的火熱引發(fā)了容器編排技術(shù)的發(fā)展,目前最受歡迎的容器編排系統(tǒng)是Kubernetes,其引領(lǐng)著技術(shù)潮流,用于應(yīng)對(duì)生產(chǎn)環(huán)境中編排容器所需的額外復(fù)雜度及成本。Kubernetes系統(tǒng)幫助企業(yè)加快了容器編排的速度,并實(shí)現(xiàn)了對(duì)多容器集群的大規(guī)模管理。它允許持續(xù)集成和交付、網(wǎng)絡(luò)處理、服務(wù)發(fā)現(xiàn)及存儲(chǔ)服務(wù)等,并具有在多云環(huán)境下進(jìn)行操作的能力。
很多人都在說掌控了Kubernetes等于掌控了云計(jì)算的未來,這是為什么呢?在過去的幾年里,Kubernetes發(fā)展飛速,社區(qū)也隨之壯大,截至本書截稿時(shí),Kubernetes項(xiàng)目在GitHub上已有接近6萬個(gè)Star,擁有8萬多次提交量。
Kubernetes系統(tǒng)已經(jīng)越來越成熟,很多企業(yè)對(duì)它的應(yīng)用從試水階段逐步走向大規(guī)模落地階段,但隨著Kubernetes系統(tǒng)越來越穩(wěn)定、成熟,代碼的迭代能力逐漸變?nèi)趿。底層代碼的成熟和健壯能夠支撐更大的上層應(yīng)用,這便讓更多優(yōu)秀的生態(tài)應(yīng)用圍繞著Kubernetes系統(tǒng)各自發(fā)展。這得益于Kubernetes系統(tǒng)的高擴(kuò)展性,Kubernetes越來越像一個(gè)系統(tǒng)核心,對(duì)外提供通用接口,實(shí)現(xiàn)了眾多標(biāo)準(zhǔn)化。另外,Kubernetes得到了許多云服務(wù)提供商(Cloud Provider)的支持,例如Google、Cisco、VMware、Microsoft、Amazon及許多其他大型公司。
建議讀者在閱讀Kubernetes源碼的過程中,學(xué)習(xí)一些關(guān)于設(shè)計(jì)模式(Design Pattern)的知識(shí),這樣有助于大家理解源碼的實(shí)現(xiàn)原理,而非只是泛泛地看代碼。例如,在Go語言中常用NewXXX函數(shù)來實(shí)例化相關(guān)類,在設(shè)計(jì)模式中,其被稱為簡(jiǎn)單工廠模式,該設(shè)計(jì)模式在Go語言中替代了其他語言中的構(gòu)造函數(shù)功能。不同語言的設(shè)計(jì)模式原理基本相同,只是在語法實(shí)現(xiàn)方式上有所不同。對(duì)于Go語言的設(shè)計(jì)模式,大家可以參考Go Design Pattern(參見鏈接[1])。
學(xué)習(xí)Kubernetes代碼庫(kù)并不容易,它擁有大量的源碼,學(xué)習(xí)過程會(huì)比較枯燥,但通過對(duì)源碼的學(xué)習(xí),我們一定會(huì)收益良多。本書將基于Kubernetes 1.14.0版本來深入研究和分析Kubernetes源碼的關(guān)鍵部分,希望能對(duì)讀者有所幫助。建議讀者在閱讀本書的同時(shí)參考Kubernetes源碼文件,這樣學(xué)習(xí)效果更佳。
最后,謹(jǐn)以此書獻(xiàn)給我的愛人和我剛出世的女兒。
聯(lián)系作者
由于作者時(shí)間與水平有限,因此書中難免出現(xiàn)遺漏或錯(cuò)誤,如果讀者發(fā)現(xiàn)相關(guān)問題,請(qǐng)及時(shí)與我聯(lián)系,聯(lián)系方式為shanhu5739@gmail.com。非常希望與大家共同學(xué)習(xí)和交流。
本書涉及的鏈接說明
為了保證書中涉及的相關(guān)鏈接可以實(shí)時(shí)更新,特地將“鏈接地址”文檔放于博文視點(diǎn)官方網(wǎng)站,如書中標(biāo)有“參見鏈接[1]”“參見鏈接[2]”等字樣時(shí),可在該文檔中查詢相關(guān)鏈接。讀者可在http://www.broadview.com.cn/38914頁面下載或通過“讀者服務(wù)”中提供的方式獲取 “鏈接地址”文檔。
讀者服務(wù)
掃碼回復(fù):38914
√獲取博文視點(diǎn)學(xué)院20元付費(fèi)內(nèi)容抵扣券
√加入讀者交流群,與更多讀者互動(dòng)
√獲取本書配套下載文件(“鏈接地址”文檔)
√獲取免費(fèi)增值資源
第1章Kubernetes架構(gòu)1
1.1Kubernetes的發(fā)展歷史1
1.2Kubernetes架構(gòu)圖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設(shè)計(jì)9
第2章Kubernetes構(gòu)建過程13
2.1構(gòu)建方式13
2.2本地環(huán)境構(gòu)建15
2.2.1一切都始于Makefile16
2.2.2本地構(gòu)建過程17
2.3容器環(huán)境構(gòu)建18
2.4Bazel環(huán)境構(gòu)建22
2.4.1使用Bazel構(gòu)建和測(cè)試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代碼生成核心實(shí)現(xiàn)40
2.7.1代碼生成邏輯與編譯器原理41
2.7.2收集Go包信息42
2.7.3代碼解析45
2.7.4類型系統(tǒng)48
2.7.5代碼生成51
第3章Kubernetes核心數(shù)據(jù)結(jié)構(gòu)57
3.1Group、Version、Resource核心數(shù)據(jù)結(jié)構(gòu)57
3.2ResourceList59
3.3Group62
3.4Version63
3.5Resource65
3.5.1資源外部版本與內(nèi)部版本66
3.5.2資源代碼定義68
3.5.3將資源注冊(cè)到資源注冊(cè)表中71
3.5.4資源首選版本71
3.5.5資源操作方法72
3.5.6資源與命名空間75
3.5.7自定義資源77
3.5.8資源對(duì)象描述文件定義78
3.6Kubernetes內(nèi)置資源全圖79
3.7runtime.Object類型基石83
3.8Unstructured數(shù)據(jù)85
3.9Scheme資源注冊(cè)表87
3.9.1Scheme資源注冊(cè)表數(shù)據(jù)結(jié)構(gòu)87
3.9.2資源注冊(cè)表注冊(cè)方法91
3.9.3資源注冊(cè)表查詢方法92
3.10Codec編解碼器92
3.10.1Codec編解碼實(shí)例化94
3.10.2jsonSerializer與yamlSerializer序列化器95
3.10.3protobufSerializer序列化器98
3.11Converter資源版本轉(zhuǎn)換器100
3.11.1Converter轉(zhuǎn)換器數(shù)據(jù)結(jié)構(gòu)101
3.11.2Converter注冊(cè)轉(zhuǎn)換函數(shù)102
3.11.3Converter資源版本轉(zhuǎn)換原理104
第4章kubectl命令行交互111
4.1kubectl命令行參數(shù)詳解111
4.2Cobra命令行參數(shù)解析114
4.3創(chuàng)建資源對(duì)象的過程119
4.3.1編寫資源對(duì)象描述文件120
4.3.2實(shí)例化Factory接口120
4.3.3Builder構(gòu)建資源對(duì)象121
4.3.4Visitor多層匿名函數(shù)嵌套122
第5章client-go編程式交互128
5.1client-go源碼結(jié)構(gòu)128
5.2Client客戶端對(duì)象129
5.2.1kubeconfig配置管理130
5.2.2RESTClient客戶端134
5.2.3ClientSet客戶端137
5.2.4DynamicClient客戶端139
5.2.5DiscoveryClient客戶端141
5.3Informer機(jī)制144
5.3.1Informer機(jī)制架構(gòu)設(shè)計(jì)145
5.3.2Reflector149
5.3.3DeltaFIFO154
5.3.4Indexer158
5.4WorkQueue162
5.4.1FIFO隊(duì)列163
5.4.2延遲隊(duì)列165
5.4.3限速隊(duì)列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存儲(chǔ)核心實(shí)現(xiàn)187
6.1Etcd存儲(chǔ)架構(gòu)設(shè)計(jì)187
6.2RESTStorage存儲(chǔ)服務(wù)通用接口189
6.3RegistryStore存儲(chǔ)服務(wù)通用操作190
6.4Storage.Interface通用存儲(chǔ)接口192
6.5CacherStorage緩存層194
6.5.1CacherStorage緩存層設(shè)計(jì)195
6.5.2ResourceVersion資源版本號(hào)199
6.5.3watchCache緩存滑動(dòng)窗口201
6.6UnderlyingStorage底層存儲(chǔ)對(duì)象204
6.7Codec編解碼數(shù)據(jù)206
6.8Strategy預(yù)處理209
6.8.1創(chuàng)建資源對(duì)象時(shí)的預(yù)處理操作209
6.8.2更新資源對(duì)象時(shí)的預(yù)處理操作211
6.8.3刪除資源對(duì)象時(shí)的預(yù)處理操作212
6.8.4導(dǎo)出資源對(duì)象時(shí)的預(yù)處理操作213
第7章kube-apiserver核心實(shí)現(xiàn)214
7.1熱身概念215
7.1.1go-restful核心原理215
7.1.2一次HTTP請(qǐng)求的完整生命周期218
7.1.3OpenAPI/Swagger核心原理219
7.1.4HTTPS核心原理222
7.1.5gRPC核心原理224
7.1.6go-to-protobuf代碼生成器225
7.2kube-apiserver命令行參數(shù)詳解231
7.3kube-apiserver架構(gòu)設(shè)計(jì)詳解243
7.4kube-apiserver啟動(dòng)流程244
7.4.1資源注冊(cè)245
7.4.2Cobra命令行參數(shù)解析248
7.4.3創(chuàng)建APIServer通用配置249
7.4.4創(chuàng)建APIExtensionsServer257
7.4.5創(chuàng)建KubeAPIServer261
7.4.6創(chuàng)建AggregatorServer266
7.4.7創(chuàng)建GenericAPIServer269
7.4.8啟動(dòng)HTTP服務(wù)270
7.4.9啟動(dòng)HTTPS服務(wù)272
7.5權(quán)限控制272
7.6認(rèn)證273
7.6.1BasicAuth認(rèn)證276
7.6.2ClientCA認(rèn)證277
7.6.3TokenAuth認(rèn)證278
7.6.4BootstrapToken認(rèn)證279
7.6.5RequestHeader認(rèn)證281
7.6.6WebhookTokenAuth認(rèn)證282
7.6.7Anonymous認(rèn)證284
7.6.8OIDC認(rèn)證285
7.6.9ServiceAccountAuth認(rèn)證288
7.7授權(quán)291
7.7.1AlwaysAllow授權(quán)295
7.7.2AlwaysDeny授權(quán)296
7.7.3ABAC授權(quán)297
7.7.4Webhook授權(quán)298
7.7.5RBAC授權(quán)300
7.7.6Node授權(quán)309
7.8準(zhǔn)入控制器310
7.8.1AlwaysPullImages準(zhǔn)入控制器315
7.8.2PodNodeSelector準(zhǔn)入控制器316
7.9進(jìn)程信號(hào)處理機(jī)制318
7.9.1常駐進(jìn)程實(shí)現(xiàn)318
7.9.2進(jìn)程的優(yōu)雅關(guān)閉319
7.9.3向systemd報(bào)告進(jìn)程狀態(tài)320
第8章kube-scheduler核心實(shí)現(xiàn)321
8.1kube-scheduler命令行參數(shù)詳解321
8.2kube-scheduler架構(gòu)設(shè)計(jì)詳解324
8.3kube-scheduler組件的啟動(dòng)流程326
8.3.1內(nèi)置調(diào)度算法的注冊(cè)327
8.3.2Cobra命令行參數(shù)解析328
8.3.3實(shí)例化Scheduler對(duì)象329
8.3.4運(yùn)行EventBroadcaster事件管理器331
8.3.5運(yùn)行HTTP或HTTPS服務(wù)331
8.3.6運(yùn)行Informer同步資源332
8.3.7領(lǐng)導(dǎo)者選舉實(shí)例化332
8.3.8運(yùn)行sched.Run調(diào)度器333
8.4優(yōu)先級(jí)與搶占機(jī)制333
8.5親和性調(diào)度335
8.5.1NodeAffinity336
8.5.2PodAffinity337
8.5.3PodAntiAffinity338
8.6內(nèi)置調(diào)度算法339
8.6.1預(yù)選調(diào)度算法339
8.6.2優(yōu)選調(diào)度算法340
8.7調(diào)度器核心實(shí)現(xiàn)342
8.7.1調(diào)度器運(yùn)行流程342
8.7.2調(diào)度過程343
8.7.3Preempt搶占機(jī)制351
8.7.4bind綁定機(jī)制356
8.8領(lǐng)導(dǎo)者選舉機(jī)制357
8.8.1資源鎖358
8.8.2領(lǐng)導(dǎo)者選舉過程360