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