Kubernetes Operator開(kāi)發(fā)進(jìn)階
定 價(jià):89 元
- 作者:胡濤編著
- 出版時(shí)間:2023/1/1
- ISBN:9787111716150
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類(lèi):TP316.85
- 頁(yè)碼:224
- 紙張:膠版紙
- 版次:1
- 開(kāi)本:16開(kāi)
本書(shū)詳細(xì)講解Operator開(kāi)發(fā)過(guò)程中所涉及的各個(gè)知識(shí)點(diǎn), 從簡(jiǎn)單的Operator示例應(yīng)用入手, 幫助讀者快速上手Operator的開(kāi)發(fā)流程, 接著深入分析client-go、Deployment控制器等的源碼, 通過(guò)一個(gè)進(jìn)階應(yīng)用的開(kāi)發(fā)過(guò)程詳細(xì)介紹Operator開(kāi)發(fā)的各方面知識(shí)。通過(guò)本書(shū)的學(xué)習(xí), 讀者能夠輕松掌握Operator的開(kāi)發(fā)技巧, 深入理解Operator的底層原理, 進(jìn)而在日常工作中更好地利用Operator實(shí)現(xiàn)各種復(fù)雜的應(yīng)用治理邏輯的開(kāi)發(fā)。
前 言
我不知道你是怎么發(fā)現(xiàn)這本書(shū)的,不過(guò)我相信有很大的概率是你關(guān)注了我的個(gè)人微信公眾號(hào)“胡說(shuō)云原生”,然后認(rèn)可我分享的技術(shù)文章,接著某一天從中得知我寫(xiě)了這本《Kubernetes Operator開(kāi)發(fā)進(jìn)階》,最后你決定支持一下這個(gè)默默寫(xiě)了好幾年技術(shù)文章的“博主”,于是在網(wǎng)上下單買(mǎi)了這本書(shū)。假如你是我的粉絲,在這里我想對(duì)你一直以來(lái)的認(rèn)可與支持表示最真誠(chéng)的感謝!
在2013年,劃時(shí)代的項(xiàng)目Docker正式發(fā)布,讓容器化技術(shù)進(jìn)入大眾的視野。接著在2014年Kubernetes開(kāi)源,2015年CNCF成立,云原生浪潮就此襲來(lái),容器編排和管理系統(tǒng)開(kāi)始蓬勃發(fā)展,進(jìn)而開(kāi)始了Kubernetes、Mesos、Swarm+Compose三分天下的局面。
我是在2016年下半年開(kāi)始工作的(巧的是第一個(gè)Operator項(xiàng)目也是在2016年下半年誕生的),也就是CNCF成立后一年。畢業(yè)那年我去了H3C的云計(jì)算部門(mén),有幸早早接觸到了Kubernetes,然后在云原生的世界里摸爬滾打,走了無(wú)數(shù)彎路,從小白逐漸成長(zhǎng)為一只“老鳥(niǎo)”,開(kāi)始承擔(dān)Kubernetes集群的維護(hù)、異常定位、優(yōu)化等工作。后來(lái)憑借著在云原生領(lǐng)域的技術(shù)積累,我在第二份工作中開(kāi)始參與整個(gè)云平臺(tái)從0到1的建設(shè)。眨眼間,從畢業(yè)到現(xiàn)在我已經(jīng)工作了6年,在這6年時(shí)間里,我的每一份工作都圍繞著云原生生態(tài)技術(shù)棧。仔細(xì)想來(lái),我在企業(yè)里落地以Kubernetes為核心的云原生生態(tài)技術(shù)棧,其實(shí)也是以Kubernetes為核心的云原生生態(tài)技術(shù)棧給了我“飯碗”。在可預(yù)見(jiàn)的很長(zhǎng)的職業(yè)生涯中,我都會(huì)圍繞著云原生、DevOps等技術(shù),想來(lái)也是和Kubernetes結(jié)緣頗深!
Kubernetes一詞來(lái)自希臘語(yǔ),意思是“舵手”。我們知道container這個(gè)單詞的意思是集裝箱,而Docker的LOGO是一只“馱”著集裝箱的鯨魚(yú),寓意著其“容器管理器”的定位。而Kubernetes以舵作為L(zhǎng)OGO,可見(jiàn)其野心是要做容器管理的“領(lǐng)路人”。事實(shí)上,Kubernetes確實(shí)已經(jīng)確立了“領(lǐng)路人”的地位,成為云原生時(shí)代的一個(gè)“云操作系統(tǒng)”,也成為容器編排領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。
伴隨著微服務(wù)理念的發(fā)展與流行,云上的應(yīng)用逐漸變得復(fù)雜起來(lái),在云上部署一個(gè)應(yīng)用所需要的配置越來(lái)越復(fù)雜,這給云原生應(yīng)用的運(yùn)維帶來(lái)了不小的挑戰(zhàn)。后來(lái)Helm和Kustomize的出現(xiàn)分別解決了云原生應(yīng)用的部署管理復(fù)雜性問(wèn)題和多環(huán)境差異化配置管理問(wèn)題等,在一定程度上簡(jiǎn)化了應(yīng)用上云的過(guò)程。但是復(fù)雜的分布式、有狀態(tài)應(yīng)用除了部署復(fù)雜之外,還有大量復(fù)雜的維護(hù)工作需要站點(diǎn)可靠性工程師(SRE)去操心,比如數(shù)據(jù)備份、故障恢復(fù)、有條件地?cái)U(kuò)/縮容等,這些技能往往是特定領(lǐng)域的運(yùn)維工程師擅長(zhǎng)的,而不是一類(lèi)應(yīng)用所共有的屬性。伴隨著云上應(yīng)用的復(fù)雜化,Operator應(yīng)運(yùn)而生,接著站點(diǎn)可靠性工程師便可以通過(guò)編寫(xiě)Operator類(lèi)型的運(yùn)維軟件來(lái)運(yùn)維自己的應(yīng)用,也就是將自己的領(lǐng)域運(yùn)維經(jīng)驗(yàn)代碼化,以代碼的形式管理應(yīng)用,通過(guò)代碼代替手動(dòng)的云上運(yùn)維操作來(lái)自動(dòng)化地實(shí)現(xiàn)特定應(yīng)用的運(yùn)維管理。
毫無(wú)疑問(wèn),Kubernetes的理念很酷,而Kubernetes里最酷的就是通過(guò)Operator模式實(shí)現(xiàn)的高度可拓展性。但是目前市面上很少有書(shū)籍介紹如何開(kāi)發(fā)Operator,以及Operator的底層原理等。尤其是專門(mén)講解Operator的書(shū)籍,更是少之又少。我自己在學(xué)習(xí)Operator的過(guò)程中也是一度感覺(jué)入門(mén)很困難,走了很多彎路。很多Operator的原理在網(wǎng)上幾乎找不到,要想深入學(xué)習(xí),只能自己深入源碼去摸索,而Kubernetes的源碼閱讀起來(lái)其實(shí)門(mén)檻不低。那時(shí)候我在網(wǎng)上以開(kāi)源的方式連載《k8s-1.13版本源碼分析》,這本電子書(shū)目前在我的GitHub(https://github.com/daniel-hutao)里標(biāo)星已經(jīng)接近1000了。后來(lái)我又在自己的個(gè)人博客(https://www.danielhu.cn)上連載《Kubernetes client-go源碼分析》,詳細(xì)分析Operator開(kāi)發(fā)所涉及的client-go底層模塊的源碼。所以有一天,機(jī)械工業(yè)出版社的編輯找到我,問(wèn)我是否有意向出版相關(guān)圖書(shū)時(shí),我便欣然答應(yīng)了。
在約稿后的大半年時(shí)間里,我?guī)缀鯖](méi)有周末和假期,在本就很忙碌的本職工作之外花費(fèi)了大量精力來(lái)編寫(xiě)本書(shū)。但是畢竟我個(gè)人的能力和精力有限,而Kubernetes又是一個(gè)龐大的“工程”,所以我再認(rèn)真也難免會(huì)出現(xiàn)一些紕漏。如果讀者朋友發(fā)現(xiàn)了書(shū)中的不妥之處,歡迎不吝指正,可以通過(guò)評(píng)論的方式將其留到本書(shū)對(duì)應(yīng)的博客(https://www.danielhu.cn/advanced-kubernetes-operator/)的評(píng)論區(qū),也可以通過(guò)我的博客或者GitHub等平臺(tái)反饋給我。讓我們互相學(xué)習(xí),一起玩轉(zhuǎn)Operator、玩轉(zhuǎn)云原生!
思碼逸DevOps專家 胡濤
目錄
推薦序1
推薦序2
前言
第一篇 入 門(mén)
第1章 了解Kubernetes 2
1.1 初識(shí)Kubernetes 2
1.2 Kubernetes集群的部署 3
1.2.1 Docker的安裝 4
1.2.2 Kind工具介紹 6
1.2.3 使用Kind快速搭建Kubernetes環(huán)境 6
1.2.4 使用Kind搭建多節(jié)點(diǎn)Kubernetes集群環(huán)境 7
1.2.5 Kind用法進(jìn)階 10
1.3 Kubernetes集群的基本操作 12
1.3.1 示例項(xiàng)目介紹 12
1.3.2 基礎(chǔ)操作演示 13
1.3.3 小結(jié) 18
1.4 Kubernetes的核心概念 18
1.4.1 節(jié)點(diǎn) 18
1.4.2 命名空間 19
1.4.3 容器組 21
1.4.4 副本集 22
1.4.5 部署 23
1.4.6 服務(wù) 24
1.5 Kubernetes的發(fā)展歷史 26
1.6 本章小結(jié) 27
第2章 開(kāi)始Operator開(kāi)發(fā) 28
2.1 理解控制器模式 28
2.1.1 生活中的控制器 28
2.1.2 Kubernetes中的控制器 29
2.2 理解Operator模式 30
2.3 Operator開(kāi)發(fā)環(huán)境準(zhǔn)備 31
2.4 Kubebuilder的安裝配置 31
2.5 從Application Operator Demo開(kāi)始 32
2.5.1 創(chuàng)建項(xiàng)目 33
2.5.2 添加API 35
2.5.3 CRD實(shí)現(xiàn) 38
2.5.4 CRD部署 39
2.5.5 CR部署 40
2.5.6 Controller實(shí)現(xiàn) 41
2.5.7 啟動(dòng)Controller 42
2.5.8 部署Controller 44
2.5.9 資源清理 46
2.6 Operator的發(fā)展歷史 46
2.6.1 Operator概念的提出 46
2.6.2 第一個(gè)Operator程序 47
2.6.3 Operator的崛起 47
2.7 本章小結(jié) 48
第二篇 進(jìn) 階
第3章 Kubernetes API介紹 50
3.1 認(rèn)識(shí)Kubernetes API 50
3.2 使用Kubernetes API 50
3.2.1 Curl方式訪問(wèn)API 50
3.2.2 kubectl raw方式訪問(wèn)API 53
3.3 理解GVK:組、版本與類(lèi)型 54
3.4 本章小結(jié) 54
第4章 理解client-go 55
4.1 client-go項(xiàng)目介紹 55
4.1.1 client-go的代碼庫(kù) 55
4.1.2 client-go的包結(jié)構(gòu) 56
4.1.3 client-go的版本規(guī)則 56
4.1.4 獲取client-go 57
4.2 client-go使用示例 57
4.2.1 client-go集群內(nèi)認(rèn)證配置 57
4.2.2 client-go集群外認(rèn)證配置 60
4.2.3 client-go操作Deployment 63
4.3 本章小結(jié) 67
第5章 client-go源碼分析 68
5.1 client-go源碼概覽 68
5.1.1 關(guān)于client-go源碼版本 68
5.1.2 client-go模塊概覽 69
5.2 WorkQueue源碼分析 71
5.2.1 普通隊(duì)列Queue的實(shí)現(xiàn) 71
5.2.2 延時(shí)隊(duì)列DelayingQueue的實(shí)現(xiàn) 74
5.2.3 限速隊(duì)列RateLimitingQueue的實(shí)現(xiàn) 79
5.2.4 小結(jié) 82
5.3 DeltaFIFO源碼分析 83
5.3.1 Queue接口與DeltaFIFO的實(shí)現(xiàn) 83
5.3.2 queueActionLocked()方法的邏輯 85
5.3.3 Pop()方法和Replace()方法的邏輯 86
5.4 Indexer和ThreadSafeStore 89
5.4.1 Indexer接口和cache的實(shí)現(xiàn) 89
5.4.2 ThreadSafeStore的實(shí)現(xiàn) 91
5.4.3 各種Index方法的實(shí)現(xiàn) 94
5.5 ListerWatcher 95
5.5.1 ListWatch對(duì)象的初始化 95
5.5.2 ListerWatcher接口 97
5.5.3 List-Watch與HTTP chunked 98
5.6 Reflector 102
5.6.1 Reflector的啟動(dòng)過(guò)程 102
5.6.2 核心方法:Reflector.ListAndWatch() 102
5.6.3 核心方法:Reflector.watchHandler() 106
5.6.4 Reflector的初始化 108
5.6.5 小結(jié) 108
5.7 Informer 109
5.7.1 Informer就是Controller 109
5.7.2 SharedIndexInformer對(duì)象 113
5.7.3 sharedProcessor對(duì)象 116
5.7.4 關(guān)于SharedInformerFactory 119
5.7.5 小結(jié) 121
5.8 本章小結(jié) 122
第6章 項(xiàng)目核心依賴包分析 123
6.1 API項(xiàng)目 123
6.2 apimachinery項(xiàng)目 124
6.3 controller-runtime項(xiàng)目 125
6.4 本章小結(jié) 126
第7章 Operator開(kāi)發(fā)進(jìn)階 127
7.1 進(jìn)階項(xiàng)目設(shè)計(jì) 127
7.2 準(zhǔn)備application-operator項(xiàng)目 127
7.2.1 創(chuàng)建新項(xiàng)目 127
7.2.2 項(xiàng)目基礎(chǔ)結(jié)構(gòu)分析 128
7.3 定義Application資源 132
7.3.1 添加新API 132
7.3.2 自定義新API 133
7.4 實(shí)現(xiàn)Application Controller 134
7.4.1 實(shí)現(xiàn)主調(diào)諧流程 134
7.4.2 實(shí)現(xiàn)Deployment調(diào)諧流程 137
7.4.3 實(shí)現(xiàn)Service調(diào)諧流程 140
7.4.4 設(shè)置RBAC權(quán)限 142
7.4.5 過(guò)濾調(diào)諧事件 146
7.4.6 資源別名 150
7.5 使用Webhook 151
7.5.1 Kubernetes API訪問(wèn)控制 151
7.5.2 Admission Webhook介紹 152
7.5.3 Admission Webhook的實(shí)現(xiàn) 152
7.5.4 cert-manager部署 154
7.5.5 Webhook部署運(yùn)行 155
7.5.6 Webhook測(cè)試 157
7.6 API多版本支持 159
7.6.1 實(shí)現(xiàn)V2版本API 159
7.6.2 多版本API部署