- 介紹了Kubernetes API的基礎(chǔ)知識(shí)并深入講解API服務(wù)器的內(nèi)部結(jié)構(gòu)。
- 學(xué)習(xí)Go語(yǔ)言的Kubernetes編程接口,包括Kubernetes API對(duì)象。
- 學(xué)習(xí)自定義資源,它是Kubernetes生態(tài)系統(tǒng)中核心的擴(kuò)展工具。
- 使用代碼標(biāo)簽控制Kubernetes代碼生成器為自定義資源生成代碼時(shí)的行為。
- 編寫自定義的控制器和Operator,并為部署到生產(chǎn)環(huán)境中做好準(zhǔn)備。
- 通過(guò)自定義API服務(wù)器,擴(kuò)展Kubernetes的API層。
如果你打算開(kāi)發(fā)原生Kubernetes應(yīng)用,本書將成為你好的向?qū)。本書面向開(kāi)發(fā)者和應(yīng)用運(yùn)維管理員介紹如何構(gòu)建原生Kubernetes應(yīng)用程序,這類應(yīng)用可直接通過(guò)API服務(wù)器查詢或更新資源的狀態(tài)。AWS開(kāi)發(fā)倡導(dǎo)者M(jìn)ichael Hausenblas和Red Hat首席軟件工程師Stefan Schimanski將介紹這類應(yīng)用的特性并向你展示如何編寫Kubernetes程序來(lái)構(gòu)建它們。
你將學(xué)到Kubernetes的基礎(chǔ)構(gòu)件,包括client-go API庫(kù)以及自定義資源。你只需要具備一些初級(jí)的開(kāi)發(fā)知識(shí)和系統(tǒng)管理工具和實(shí)踐經(jīng)驗(yàn)(包括包管理、Go語(yǔ)言和Git)即可上手。
前言
歡迎來(lái)到Kubernetes 編程的世界, 感謝你選擇本書與我們一同探索Kubernetes 編程的奧秘。在開(kāi)始深入討論之前,我們先要解決一些管理和組織方面的問(wèn)題,還將與你分享一些編寫本書時(shí)的心得和體會(huì)。
目標(biāo)讀者
如果你是一位即將進(jìn)行云原生(Cloud-Native)應(yīng)用開(kāi)發(fā)的開(kāi)發(fā)人員,或是想從Kubernetes 中獲得收益的應(yīng)用管理員或運(yùn)維人員。由于Kubernetes 原生配置和功能無(wú)法滿足你的需求,所以你想要學(xué)習(xí)如何對(duì)其進(jìn)行擴(kuò)展。那很好,你就是本書的目標(biāo)讀者。
為何編寫本書
本書的兩位作者都是從2015 年初開(kāi)始使用Kubernetes 的, 同時(shí)還教授Kubernetes 課程,進(jìn)行相關(guān)的寫作并向社區(qū)作貢獻(xiàn)。我們?yōu)镵ubernetes 開(kāi)發(fā)了一些工具和應(yīng)用,并多次開(kāi)設(shè)Kubernetes 相關(guān)的研討班。有一天,我們問(wèn)自己,為什么不寫一本書呢?通過(guò)寫書可以讓更多的人在不同的地方按自己的進(jìn)度來(lái)學(xué)習(xí)Kubernetes 編程。因此,我們就創(chuàng)作了本書。希望你能在讀書的過(guò)程中收獲快樂(lè),就像我們?cè)趯懽鲿r(shí)所收獲的快樂(lè)一樣。
生態(tài)系統(tǒng)
總體來(lái)說(shuō),我們現(xiàn)在所處的時(shí)代仍是Kubernetes 生態(tài)的早期。2018 年初,Kubernetes 逐漸成為容器(及其生命周期)管理領(lǐng)域的工業(yè)標(biāo)準(zhǔn),但是仍然缺少一些基于實(shí)踐經(jīng)驗(yàn)的指導(dǎo)去指引開(kāi)發(fā)者編寫原生Kubernetes 應(yīng)用。雖然一些基本的組件,比如client-go、自定義資源(Custom Resource)和云原生編程語(yǔ)言都已經(jīng)出現(xiàn)了,但是相關(guān)的知識(shí)仍然十分零碎,它們存在于人們的經(jīng)驗(yàn)中,分散在各種Slack 頻道和StackOverflow 的回答中。
本書寫作之時(shí),Kubernetes 的版本是1.15。書中例子的代碼是基于1.14的庫(kù)來(lái)編寫的,編譯后應(yīng)該可以在低版本(但不低于1.12)的Kubernetes 上運(yùn)行。部分CRD 相關(guān)的高級(jí)功能需要1.13 或1.14 版本的Kubernetes 才能正常運(yùn)行,第9 章介紹的CRD 轉(zhuǎn)換在1.15 版本的Kubernetes 上才能運(yùn)行。如果你沒(méi)有足夠新的集群用于測(cè)試,我們強(qiáng)烈推薦你在本地運(yùn)行Minikube或kind 來(lái)進(jìn)行測(cè)試。
你需要了解的技術(shù)
本書是一本中等難度的技術(shù)書籍,閱讀本書需要理解很多開(kāi)發(fā)和系統(tǒng)管理的概念。在深入具體內(nèi)容之前,你需要先復(fù)習(xí)以下知識(shí)。
包管理
本書中用到工具常常需要你安裝一些軟件包才能滿足其依賴。了解你所使用的操作系統(tǒng)中的包管理模式是的技能。比如Ubuntu/Debian 系統(tǒng)中的apt、CentOS/RHEL 系統(tǒng)中的yum、macOS 上的port 或brew。不管是哪一種,你都需要了解如何使用它們對(duì)軟件包進(jìn)行安裝、升級(jí)或卸載操作。
Git
Git 已經(jīng)成為分布式版本控制的標(biāo)準(zhǔn)。如果你熟悉CVS 和SVN,但還沒(méi)用過(guò)Git,那么你還需要重新學(xué)習(xí)Git。Jon Loeliger 和Matthew McCullough所著的Version Control with Git(OReilly)是一本很好的入門書。與Git 配套的還有GitHub 網(wǎng)站,在上面你可以托管自己的Git 倉(cāng)庫(kù)。有關(guān)GitHub 你還可以參考其培訓(xùn)課程和交互式教程。
Go 語(yǔ)言
Kubernetes 是用Go 語(yǔ)言(http://golang.org)來(lái)編寫的。在過(guò)去的幾年中,Go 成為了很多創(chuàng)業(yè)公司和系統(tǒng)相關(guān)的開(kāi)源項(xiàng)目的新型開(kāi)發(fā)語(yǔ)言。本書不會(huì)教授Go 語(yǔ)言本身的知識(shí),但會(huì)介紹如何用Go 語(yǔ)言來(lái)開(kāi)發(fā)Kubernetes 應(yīng)用。有很多渠道可以學(xué)習(xí)Go,比如Go 語(yǔ)言網(wǎng)站上的在線文檔、博客文章、演講和各種圖書。
排版約定
在本書中,使用以下排版約定:
斜體(Italic)
表示新名詞、URL、電子郵件地址、文件名以及文件擴(kuò)展名。
等寬字體(Constant width)
表示程序代碼,以及在正文中引用變量、函數(shù)名稱、數(shù)據(jù)類型、環(huán)境變量、語(yǔ)句、關(guān)鍵字等代碼中的元素。還用于展示命令和命令行的輸出。
粗體等寬字體(Constant width bold)
表示需要用戶輸入的命令或其他文本。
斜體等寬字體(Constant width italic)
表示需要替換成用戶自定義的值或根據(jù)上下文決定的值。
使用示例代碼
本書的目的是幫助你完成工作。本書中使用的示例代碼可以從GitHub(https://github.com/programming-kubernetes)中找到。
總的來(lái)說(shuō),你可以在自己的程序或文檔中使用本書所提供的示例代碼。如果不是對(duì)這些代碼進(jìn)行大規(guī)模的分發(fā),就不需要聯(lián)系我們獲取授權(quán)。比如,編寫一個(gè)程序,使用了本書中幾段示例代碼是不需要授權(quán)的。出售或分發(fā)包含OReilly 圖書完整示例代碼的CD-ROM 則需要授權(quán)。引用書中的部分內(nèi)容或示例代碼來(lái)回答問(wèn)題不需要授權(quán)。在你的產(chǎn)品文檔中包含本書中大量的示例代碼則需要授權(quán)。
我們不強(qiáng)制要求署名,但如果你這么做,我們深表感激。署名一般包括書名、作者、出版社和書號(hào)(ISBN)。例如:Programming Kubernetes by Michael Hausenblas and Stefan Schimanski (OReilly). Copyright 2019 Michael Hausenblas and Stefan Schimanski. 。
如果你覺(jué)得對(duì)示例代碼的使用超出了合理的方式或上述許可范圍,可以與我們聯(lián)系:permissions@oreilly.com。
Kubernetes 清單文件、代碼示例和其他在本書中使用的腳本都可以從GitHub獲取。你可以復(fù)制這些代碼倉(cāng)庫(kù),按照不同的章節(jié)和內(nèi)容,直接使用這些代碼。
OReilly 在線學(xué)習(xí)平臺(tái)(OReilly Online Learning)
近40 年來(lái),OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見(jiàn)解,來(lái)幫助眾多公司取得成功。
我們擁有獨(dú)一無(wú)二的專家和革新者組成的龐大網(wǎng)絡(luò),他們通過(guò)圖書、文章、會(huì)議和我們的在線學(xué)習(xí)平臺(tái)分享他們的知識(shí)和經(jīng)驗(yàn)。OReilly 的在線學(xué)習(xí)平臺(tái)允許你按需訪問(wèn)現(xiàn)場(chǎng)培訓(xùn)課程、深入的學(xué)習(xí)路徑、交互式編程環(huán)境,以及OReilly 和200 多家其他出版商提供的大量文本和視頻資源。有關(guān)的更多信息,請(qǐng)?jiān)L問(wèn)http://oreilly.com。
聯(lián)系我們
請(qǐng)將有關(guān)本書的建議和問(wèn)題發(fā)送給出版社:
美國(guó):
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國(guó):
北京市西城區(qū)西直門南大街2號(hào)成銘大廈C座807室(100035)
奧萊利技術(shù)咨詢(北京)有限公司
我們?yōu)楸緯峁┝艘粋(gè)網(wǎng)頁(yè),上面有勘誤表、示例和其他相關(guān)的信息,請(qǐng)?jiān)L問(wèn):https://oreil.ly/pr-kubernetes。
有關(guān)本書的建議或者技術(shù)問(wèn)題,請(qǐng)發(fā)郵件到 bookquestions@oreilly.com。
相關(guān)其他圖書、講座、會(huì)議、新聞的信息,請(qǐng)?jiān)L問(wèn)我們的網(wǎng)站:http://www.oreilly.com。
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的YouTube:http://www.youtube.com/oreillymedia。
致謝
先要感謝的是Kubernetes 社區(qū),是他們創(chuàng)造了如此出色的軟件。Kubernetes社區(qū)中的人都非常出色,他們對(duì)任何事都有著開(kāi)放的心態(tài)、對(duì)人親切,并樂(lè)于助人。還要感謝本書的技術(shù)審閱者:Ahmed Belgana、Michael Gasch、Dimitris Gkanatsios、Mingding Han、Jess Males、Max Neunhffer、Ewout Prangsma 和Adrien Trouillaud。你們提供了非常有價(jià)值且易于實(shí)施的建議,從而使本書更易讀、對(duì)讀者也更有用。感謝你們所花費(fèi)的時(shí)間和付出的努力。Michael 想深深地感謝一直支持著他的棒的家庭: 聰明有趣的妻子Anneliese,孩子們Saphira、Ranya 和Iannis,還有小狗Snoopy。
Stefan 想感謝他的妻子Clelia 在寫作本書時(shí)對(duì)他的支持和鼓勵(lì)。沒(méi)有她的支持,這本書就不可能完成。如果在書中發(fā)現(xiàn)錯(cuò)別字,那很有可能是我的兩只可愛(ài)的小貓Nino 和Kira 所貢獻(xiàn)的。
后,還要特別感謝OReilly 的團(tuán)隊(duì),尤其是Virginia Wilson 在本書出版過(guò)程中對(duì)我們的激勵(lì),保證了本書能夠保質(zhì)保量按時(shí)出版。
Michael Hausenblas是Amazon Web Service容器開(kāi)發(fā)領(lǐng)域的倡導(dǎo)者。他擁有大規(guī)模數(shù)據(jù)處理和容器編排方面的經(jīng)驗(yàn),在倡導(dǎo)和實(shí)施W3C和IETF標(biāo)準(zhǔn)化方面有著豐富的經(jīng)驗(yàn)。
Stefan Schimanski是Red Hat的Go、Kubernetes和Open-Shift首席軟件工程師,他專注于Kubernetes API服務(wù)器及其在自定義資源定義、API Machinery方面的實(shí)現(xiàn),以及Kubernetes預(yù)發(fā)布倉(cāng)庫(kù)的管理。
目錄
前言 .1
第1 章 概論 .7
1.1 什么是Kubernetes 編程? .7
1.2 一個(gè)實(shí)際的例子 10
1.3 擴(kuò)展模式 11
1.4 控制器和Operator 12
1.4.1 控制循環(huán). 13
1.4.2 事件 14
1.4.3 邊沿觸發(fā)與水平觸發(fā) 17
1.4.4 改變集群對(duì)象或外部系統(tǒng)狀態(tài) 20
1.4.5 樂(lè)觀并發(fā). 23
1.4.6 Operator 26
1.5 小結(jié) 28
第2 章 Kubernetes API 基礎(chǔ) .30
2.1 API 服務(wù)器 30
2.1.1 API 服務(wù)器的HTTP 接口 31
2.1.2 API 術(shù)語(yǔ) . 33
2.1.3 Kubernetes API 版本 . 36
2.1.4 聲明式狀態(tài)管理 . 37
2.2 通過(guò)命令行使用API . 38
2.3 API 服務(wù)器是如何處理請(qǐng)求的 43
2.4 小結(jié) 47
第3 章 client-go 基礎(chǔ) 49
3.1 代碼倉(cāng)庫(kù) 49
3.1.1 客戶端庫(kù). 49
3.1.2 Kubernetes API 類型 . 51
3.1.3 API Machinery . 52
3.1.4 創(chuàng)建并使用客戶端對(duì)象 53
3.1.5 版本與兼容性 56
3.1.6 API 版本與兼容性保證 59
3.2 Go 語(yǔ)言中的Kubernetes 對(duì)象 62
3.2.1 TypeMeta 63
3.2.2 ObjectMeta 67
3.2.3 規(guī)格與狀態(tài) 68
3.3 客戶端集合 . 68
3.3.1 狀態(tài)子資源:UpdateStatus 71
3.3.2 列表與刪除 71
3.3.3 Watch 72
3.3.4 客戶端擴(kuò)展 73
3.3.5 客戶端選項(xiàng) 73
3.4 Informer 和緩存 75
3.5 深入API Machinery 83
3.5.1 型別 83
3.5.2 資源 83
3.5.3 REST 映射 . 84
3.5.4 Scheme 86
3.6 Vendor 機(jī)制 88
3.6.1 glide 88
3.6.2 dep . 89
3.6.3 Go 模塊 90
3.7 小結(jié) 92
第4 章 使用自定義資源 93
4.1 服務(wù)發(fā)現(xiàn)信息 95
4.2 類型定義 97
4.3 自定義資源的高級(jí)功能 . 100
4.3.1 自定義資源合法性驗(yàn)證 100
4.3.2 短名字與類別 103
4.3.3 打印列 104
4.3.4 子資源 106
4.4 開(kāi)發(fā)者眼中的自定義資源 . 111
4.4.1 動(dòng)態(tài)客戶端 . 112
4.4.2 強(qiáng)類型客戶端 114
4.4.3 Operator SDK 和Kubebuilder 的controller-runtime 客戶端 121
4.5 小結(jié) . 123
第5 章 自動(dòng)代碼生成 124
5.1 為何需要代碼生成器 124
5.2 調(diào)用代碼生成器 125
5.3 通過(guò)標(biāo)簽控制代碼生成器行為 127
5.3.1 全局標(biāo)簽 128
5.3.2 局部標(biāo)簽 129
5.3.3 deepcopy-gen 標(biāo)簽 131
5.3.4 runtime.Object 與DeepCopyObject 131
5.3.5 client-gen 標(biāo)簽 133
5.3.6 informer-gen 和lister-gen 135
5.4 小結(jié) . 136
第6 章 編寫Operator 的方案 137
6.1 準(zhǔn)備工作 138
6.2 基于sample-controller 138
6.2.1 引導(dǎo) 139
6.2.2 業(yè)務(wù)邏輯 140
6.3 Kubebuilder . 148
6.3.1 引導(dǎo) 149
6.3.2 業(yè)務(wù)邏輯 155
6.4 Operator SDK . 160
6.4.1 引導(dǎo) 161
6.4.2 業(yè)務(wù)邏輯 163
6.5 其他方案 167
6.6 應(yīng)用和未來(lái)的方向 168
6.7 小結(jié) . 169
第7 章 發(fā)布控制器和Operator 170
7.1 生命周期管理和打包 170
7.1.1 打包:挑戰(zhàn) . 171
7.1.2 Helm 172
7.1.3 Kustomize 174
7.1.4 其他打包方法 176
7.1.5 打包的實(shí)踐 177
7.1.6 生命周期管理 178
7.2 準(zhǔn)生產(chǎn)部署 179
7.2.1 將權(quán)限設(shè)置正確 179
7.2.2 自動(dòng)構(gòu)建與測(cè)試 183
7.2.3 自定義控制器和可觀測(cè)性 184
7.3 小結(jié) . 187
第8 章 自定義API 服務(wù)器 . 189
8.1 自定義API 服務(wù)器的適用場(chǎng)景 189
8.2 示例:一個(gè)披薩店 192
8.3 架構(gòu):聚合 193
8.3.1 API 服務(wù) 195
8.3.2 自定義API 服務(wù)器的內(nèi)部結(jié)構(gòu) 198
8.3.3 委托身份認(rèn)證和信任機(jī)制 200
8.3.4 委托授權(quán) 201
8.4 開(kāi)發(fā)自定義API 服務(wù)器 . 204
8.4.1 選項(xiàng)、配置模式和啟動(dòng)基礎(chǔ)設(shè)施 204
8.4.2 次啟動(dòng) . 213
8.4.3 內(nèi)部類型和轉(zhuǎn)換 214
8.4.4 編寫API 類型 218
8.4.5 轉(zhuǎn)換 220
8.4.6 默認(rèn)值處理 . 224
8.4.7 雙程測(cè)試 226
8.4.8 驗(yàn)證 228
8.4.9 注冊(cè)表與策略 231
8.4.10 安裝API 237
8.4.11 準(zhǔn)入 . 242
8.5 部署自定義API 服務(wù)器 . 253
8.5.1 部署清單文件 254
8.5.2 設(shè)置RBAC . 257
8.5.3 不安全地運(yùn)行自定義API 服務(wù)器 259
8.5.4 證書與信任 . 262
8.5.5 共享etcd 265
8.6 小結(jié) . 266
第9 章 自定義資源進(jìn)階 . 268
9.1 自定義資源版本 268
9.1.1 改進(jìn)披薩餐廳 269
9.1.2 轉(zhuǎn)換Webhook 架構(gòu) 273
9.1.3 實(shí)現(xiàn)轉(zhuǎn)換Webhook . 277
9.1.4 搭建HTTPS 服務(wù)器 278
9.1.5 部署轉(zhuǎn)換Webhook . 285
9.1.6 觀察實(shí)際轉(zhuǎn)換過(guò)程 286
9.2 準(zhǔn)入Webhook . 290
9.2.1 餐館示例中的準(zhǔn)入需求 291
9.2.2 準(zhǔn)入Webhook 架構(gòu) 292
9.2.3 注冊(cè)準(zhǔn)入Webhook . 295
9.2.4 實(shí)現(xiàn)準(zhǔn)入Webhook . 296
9.2.5 準(zhǔn)入Webhook 實(shí)戰(zhàn) 302
9.3 結(jié)構(gòu)化Schema 與CRD 的未來(lái) . 304
9.3.1 結(jié)構(gòu)化Schema . 305
9.3.2 剪裁或保留不能識(shí)別的字段 307
9.3.3 控制剪裁 308
9.3.4 IntOrString 和RawExtensions 310
9.3.5 默認(rèn)值 311
9.4 小結(jié) . 313
附錄 資源 . 315
作者介紹 319
封面介紹 319