本書主要內(nèi)容有:學(xué)習(xí)如何在Kubernetes集群上部署操作器。從使用到實(shí)現(xiàn),全面探索操作器。探索操作器框架:操作器SDK、操作器生命周期管理器以及操作器度量。利用SDK的Go編程語言支持構(gòu)建、打包和運(yùn)行操作器。利用現(xiàn)有的Helm和Ansible資產(chǎn)打包和部署操作器。學(xué)習(xí)如何在Kubernetes集群上分發(fā)操作器。學(xué)習(xí)如何利用操作器實(shí)現(xiàn)網(wǎng)站可靠性工程實(shí)踐。
本書展示了如何通過構(gòu)建操作器來擴(kuò)展Kubernetes的控制平面和API,幫助運(yùn)維團(tuán)隊(duì)和應(yīng)用程序開發(fā)人員可靠地部署和管理關(guān)鍵的服務(wù)及組件。
操作器是一種打包、部署與管理Kubernetes應(yīng)用程序的方式。操作器能夠?yàn)镵ubernetes添加應(yīng)用程序特有的技術(shù),從而降低自動(dòng)化復(fù)雜的有狀態(tài)應(yīng)用程序的難度。本書通過鮮活生動(dòng)的例子向讀者展示了操作器的工作方式,以及如何使用操作器框架和SDK構(gòu)建操作器。
操作器非常熟悉應(yīng)用程序的內(nèi)部狀態(tài),能夠協(xié)調(diào)應(yīng)用程序的安裝與升級(jí),修復(fù)故障,并自動(dòng)化充滿重復(fù)性或精心策劃的維護(hù)工作。本書向讀者展示了如何通過構(gòu)建操作器來擴(kuò)展Kubernetes的控制平面和API,幫助運(yùn)維團(tuán)隊(duì)和應(yīng)用程序開發(fā)人員可靠地部署和管理關(guān)鍵的服務(wù)及組件。
Kubernetes已然成為世界上功能強(qiáng)大的容器編排平臺(tái),但其真正的力量隱藏在可擴(kuò)展API及自動(dòng)化框架的背后,它們將重新定義未來平臺(tái)的構(gòu)建與操作方式。而本書正是我們?nèi)鄙俚氖謨?cè)。
Kelsey Hightower
Google云技術(shù)專家
前言
Kubernetes 是一款流行的容器編排器。它將許多計(jì)算機(jī)整合成一個(gè)大型計(jì)算資源,并建立了一種通過Kubernetes 應(yīng)用程序編程接口(API)尋址資源的方法。Kubernetes 是起源于Google 的開源軟件,在云原生計(jì)算基金會(huì)(Cloud Native Computing Foundation,CNCF)的帶領(lǐng)下,通過眾多合作者過去五年的努力開發(fā)而成。
操作器擴(kuò)展了Kubernetes,能夠自動(dòng)化特定應(yīng)用程序整個(gè)生命周期的管理。操作器不僅可以作為Kubernetes 上分發(fā)應(yīng)用程序的打包機(jī)制,而且還可以監(jiān)視、維護(hù)、恢復(fù)和升級(jí)部署的軟件。
本書面向的讀者對(duì)象
如果你有在Kubernetes 集群上部署應(yīng)用程序的經(jīng)驗(yàn),那么一定很熟悉構(gòu)建操作器模式所面臨的難題和訴求。如果你有在編排集群之外維護(hù)基礎(chǔ)服務(wù)(如數(shù)據(jù)庫(kù)和文件系統(tǒng))的經(jīng)歷,并且渴望將其帶入社區(qū),那么本書一定非常適合你。
本書的主要內(nèi)容
本書介紹了什么是操作器,以及如何利用操作器擴(kuò)展Kubernetes API。書中展示了如何部署和使用現(xiàn)有的操作器,以及如何使用紅帽的操作器框架為你的應(yīng)用程序創(chuàng)建和分發(fā)操作器。此外,本書還介紹了有關(guān)設(shè)計(jì)、構(gòu)建和分發(fā)操作器的良好實(shí)踐,以及將網(wǎng)站可靠性工程(SRE)原則運(yùn)用到操作器的理念。第1 章首先介紹了操作器及其概念。接下來,介紹了一些獲得訪問Kubernetes集群的方法,以供在后續(xù)章節(jié)的練習(xí)中使用。在成功運(yùn)行集群之后,本章介紹了操作器的部署,并觀察應(yīng)用程序發(fā)生故障、擴(kuò)展或升級(jí)到新版本時(shí)操作器的行為。
在接下來的幾章中,我們將探索操作器SDK,并向你展示如何利用SDK 來構(gòu)建操作器,以幫助示例應(yīng)用程序成為Kubernetes 的一流公民。在對(duì)實(shí)踐基礎(chǔ)有了基本了解之后,我們還將討論操作器所應(yīng)用的SRE 理念及其共同目標(biāo),即降低運(yùn)維的工作量和成本,提高服務(wù)可靠性,將團(tuán)隊(duì)從日復(fù)一日地維護(hù)工作中解脫出來,激勵(lì)團(tuán)隊(duì)成員的創(chuàng)新。
操作器框架與SDK
操作器模式源自CoreOS(https://coreos.com),這是一種自動(dòng)化Kubernetes集群上日益復(fù)雜的應(yīng)用程序的方法,包括管理Kubernetes 本身及其核心的etcd 鍵值存儲(chǔ)(https://github.com/coreos/etcd)。在被紅帽收購(gòu)后,操作器一直在不斷發(fā)展,終于2018 年發(fā)布了開源的操作器框架和SDK。本書的示例使用了紅帽的操作器SDK,以及操作器框架所結(jié)合的分發(fā)機(jī)制。
其他操作器工具
操作器的社區(qū)在不斷地發(fā)展,單是紅帽分發(fā)頻道就容納了對(duì)應(yīng)于眾多供應(yīng)商和項(xiàng)目應(yīng)用程序的一百多個(gè)操作器。除此之外,還有其他幾種操作器的構(gòu)建工具。雖然本書沒有詳細(xì)討論這些工具,但是在你閱讀完本書之后,可以將它們與操作器SDK 和框架進(jìn)行比較。其他可用于構(gòu)建操作器的開源工具包括Python 版的Kopf(https://oreil.ly/JCL-S)、面向Kubernetes 項(xiàng)目的Kubebuilder(https://oreil.ly/8zdbj)以及Java 版的操作器SDK(https://oreil.ly/yXhVg)。
排版約定
本書使用了下述排版約定。
斜體(Italic)
表示新術(shù)語、URL、電子郵件地址、文件名和擴(kuò)展名。
等寬字體(Constant Width)
表示程序片段,以及正文中出現(xiàn)的變量、函數(shù)名、數(shù)據(jù)庫(kù)、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字等。
加粗等寬字體(constant width bold)
表示應(yīng)該由用戶輸入的命令或其他文本。
等寬斜體(constant width italic)
表示應(yīng)該由用戶輸入的值或根據(jù)上下文確定的值替換的文本。
使用代碼示例
你可以通過如下鏈接下載本書的補(bǔ)充材料(代碼示例,練習(xí)等):https://github.com/kubernetes-operators-book/
如果你對(duì)本書代碼示例的使用有任何技術(shù)問題或困難,請(qǐng)發(fā)送電子郵件到:bookquestions@oreilly.com
本書的目的是幫助你完成工作。一般來說,你可以在自己的程序或者文檔中使用本書附帶的示例代碼。你無需聯(lián)系我們獲得使用許可,除非你要復(fù)制大量的代碼。例如,使用本書中的多個(gè)代碼片段編寫程序就無需獲得許可。但以CD-ROM 的形式銷售或者分發(fā)OReilly 書中的示例代碼則需要獲得許可。回答問題時(shí)援引本書內(nèi)容以及書中示例代碼,無需獲得許可。在你自己的項(xiàng)目文檔中使用本書大量的示例代碼時(shí),則需要獲得許可。
我們不強(qiáng)制要求署名,但如果你這么做我們將深表感激。署名一般包括書名、作者、出版社和國(guó)際標(biāo)準(zhǔn)書號(hào)。例如:Kubernetes Operators by Jason Dobies and Wood (OReilly). Copyright 2020 Red Hat, Inc.,978-1-492-04805-3。
如果你覺得自身情況不在合理使用或上述允許的范圍內(nèi),請(qǐng)通過郵件和我們聯(lián)系,地址是 permissions@oreilly.com。
如果你對(duì)本書有一些評(píng)論或技術(shù)上的建議, 請(qǐng)發(fā)送電子郵件到:
bookquestions@oreilly.com。
要了解OReilly 圖書、培訓(xùn)課程、會(huì)議和新聞的更多信息,請(qǐng)?jiān)L問我們的網(wǎng)站,
地址是:http://www.oreilly.com。
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的Youtube:http://www.youtube.com/oreillymedia。
致謝
本書得以付梓,我們要感謝紅帽以及OpenShift Advocacy 團(tuán)隊(duì)的大力支
持,特別是Ryan Jarvinen 給予的全方面協(xié)助。感謝Anish Asthana、Evan
Cordell、Michael Gasch、Michael Hausenblas、Shawn Hurley 和Jess Males,
感謝你們?yōu)楸緯膶徍恕z查、建議以及其他工作所付出的努力,本書的內(nèi)
容才更加完善和連貫。
Jason Dobies是紅帽的開發(fā)推廣工程師,美國(guó)維拉諾瓦大學(xué)軟件工程與高級(jí)項(xiàng)目的兼職教授。 Wood是紅帽的開發(fā)推廣工程師,主要從事使用開源軟件構(gòu)建實(shí)用程序計(jì)算的工作。
目錄
前言 . 1
第1 章 操作器為Kubernetes 帶來的創(chuàng)新 7
1.1 Kubernetes 的工作方式 .8
1.2 示例:無狀態(tài)Web 服務(wù)器 10
1.3 有狀態(tài)的應(yīng)用程序 11
1.4 操作器是軟件SRE 11
1.5 操作器的工作原理 12
1.6 如何創(chuàng)建操作器 13
1.7 示例:etcd 操作器 14
1.8 操作器面向的對(duì)象 15
1.9 整裝待發(fā) 16
第2 章 運(yùn)行操作器 . 17
2.1 建立操作器實(shí)驗(yàn)室 17
2.1.1 集群版本要求 18
2.1.2 授權(quán)要求18
2.1.3 標(biāo)準(zhǔn)的工具和技術(shù) 19
2.1.4 建議的集群配置 20
2.1.5 檢查集群的版本 22
2.2 運(yùn)行一個(gè)簡(jiǎn)單的操作器 .22
2.2.1 常見的示例 .23
2.2.2 獲取etcd 操作器的清單 24
2.2.3 CR:自定義API 端點(diǎn) 24
2.2.4 我是誰:定義操作器的服務(wù)賬號(hào) 25
2.2.5 部署etcd 操作器 29
2.2.6 聲明etcd 集群 30
2.2.7 練習(xí)使用etcd 32
2.2.8 擴(kuò)展etcd 集群 33
2.2.9 故障與自動(dòng)恢復(fù) 34
2.2.10 升級(jí)etcd 集群 36
2.2.11 清理 .39
2.3 小結(jié) .39
第3 章 構(gòu)建在Kubernetes 接口上的操作器 . 41
3.1 標(biāo)準(zhǔn)伸縮:副本集資源 .41
3.2 自定義資源 43
3.3 自定義控制器 .43
3.4 操作器的范圍 .44
3.4.1 命名空間范圍 44
3.4.2 集群范圍的操作器 45
3.5 授權(quán) .45
3.5.1 服務(wù)賬號(hào)45
3.5.2 角色 46
3.5.3 角色綁定47
3.5.4 集群角色與集群角色綁定 47
3.6 小結(jié) .47
第4 章 操作器框架 . 49
4.1 操作器框架的起源 49
4.2 操作器成熟度模型 50
4.3 操作器SDK .51
4.4 操作器生命周期管理器 .52
4.5 操作器度量 53
4.6 小結(jié) .54
第5 章 示例應(yīng)用程序:訪客網(wǎng)站 55
5.1 應(yīng)用概況 56
5.2 使用清單安裝 .57
5.2.1 部署MySQL 58
5.2.2 后端 60
5.2.3 前端 63
5.3 部署清單 65
5.4 訪問訪客網(wǎng)站 .65
5.5 清理 .66
5.6 小結(jié) .66
第6 章 適配器操作器 . 67
6.1 Helm 操作器 69
6.1.1 構(gòu)建操作器 .70
6.1.2 完善CRD 75
6.1.3 檢查操作器的權(quán)限 75
6.1.4 運(yùn)行Helm 操作器 75
6.2 Ansible 操作器 76
6.2.1 構(gòu)建操作器 .77
6.2.2 完善CRD 80
6.2.3 檢查操作器的權(quán)限 80
6.2.4 運(yùn)行Ansible 操作器 80
6.3 測(cè)試操作器 81
6.4 小結(jié) .82
6.5 補(bǔ)充閱讀 82
第7 章 使用操作器SDK 構(gòu)建Go 語言的操作器 . 83
7.1 初始化操作器 .84
7.2 操作器的范圍 .85
7.3 自定義資源定義 87
7.3.1 定義Go 類型 .88
7.3.2 CRD 清單 90
7.4 操作器權(quán)限 90
7.5 控制器 91
7.6 編寫操作器的技巧 94
7.6.1 檢索資源94
7.6.2 創(chuàng)建子資源 .96
7.6.3 刪除子資源 .99
7.6.4 子資源的命名 .101
7.6.5 冪等性 101
7.6.6 操作器的影響 .102
7.7 在本地運(yùn)行操作器 .103
7.8 訪客網(wǎng)站示例 104
7.9 小結(jié) 105
7.10 補(bǔ)充閱讀 106
第8 章 操作器生命周期管理器 107
8.1 OLM 自定義資源 108
8.1.1 集群服務(wù)版本 .108
8.1.2 目錄源 109
8.1.3 訂閱 .109
8.1.4 安裝計(jì)劃 110
8.1.5 操作器組 110
8.2 安裝OLM 111
8.3 使用OLM 113
8.3.1 探索操作器 119
8.3.2 刪除操作器 121
8.4 OLM 捆綁包的元數(shù)據(jù)文件 121
8.4.1 自定義資源定義 122
8.4.2 集群服務(wù)版本文件 122
8.4.3 包清單文件 123
8.5 編寫集群服務(wù)版本文件 123
8.5.1 生成文件的骨架 123
8.5.2 元數(shù)據(jù) 125
8.5.3 操作器擁有的CRD .127
8.5.4 操作器依賴的CRD .131
8.5.5 安裝模式132
8.5.6 版本和更新 133
8.6 編寫包清單文件 .134
8.7 本地運(yùn)行 .135
8.7.1 前提條件135
8.7.2 構(gòu)建OLM 捆綁包 .140
8.7.3 通過OLM 安裝操作器 142
8.7.4 測(cè)試正在運(yùn)行的操作器 .144
8.8 訪客網(wǎng)站操作器示例 144
8.9 小結(jié) 145
8.10 補(bǔ)充閱讀 145
第9 章 操作器的理念 147
9.1 每個(gè)應(yīng)用程序的SRE 147
9.2 不勞而獲 .148
9.2.1 自動(dòng)化:計(jì)算機(jī)自動(dòng)工作 148
9.2.2 徒勞無功:沒有持久價(jià)值的工作 .149
9.2.3 擴(kuò)展的痛點(diǎn):隨著系統(tǒng)擴(kuò)展不斷加重的工作 .149
9.3 操作器:Kubernetes 應(yīng)用程序可靠性工程 150
9.3.1 管理應(yīng)用程序的狀態(tài) 151
9.3.2 發(fā)送到軟件的黃金信號(hào) .151
9.4 高度成功的操作器的七個(gè)習(xí)慣 153
9.5 小結(jié) 155
第10 章 親身參與 . 157
10.1 功能請(qǐng)求和報(bào)告錯(cuò)誤 .158
10.2 貢獻(xiàn)代碼 159
10.3 共享操作器 .159
10.4 小結(jié) 160
附錄A 作為集群內(nèi)部的部署運(yùn)行操作器 . 161
附錄B 自定義資源驗(yàn)證 163
附錄C 基于角色的訪問控制 . 167
作者介紹 171
封面介紹 171