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