本書介紹了以下模式類型:
基礎(chǔ)模式涵蓋構(gòu)建基于容器的云原生應(yīng)用程序的核心原則和實(shí)踐。
行為模式詳細(xì)介紹管理容器和平臺(tái)交互的概念。
結(jié)構(gòu)化模式教你如何通過在Pod中組織容器解決特定的用例。
配置模式講述如何處理Kubernetes中應(yīng)用程序的配置。
高級(jí)模式涵蓋更復(fù)雜的主題,例如操作器和自動(dòng)伸縮等。
隨著微服務(wù)和容器的發(fā)展,開發(fā)人員設(shè)計(jì)、構(gòu)建和運(yùn)行軟件的方式已經(jīng)發(fā)生了明顯的變化。這些現(xiàn)代體系結(jié)構(gòu)提供了新的分布式原語,開發(fā)人員、技術(shù)負(fù)責(zé)人和架構(gòu)師在實(shí)現(xiàn)這些原語時(shí)也需要采用一套不同的實(shí)踐。本書重點(diǎn)介紹在Kubernetes上設(shè)計(jì)和實(shí)現(xiàn)云原生應(yīng)用程序時(shí)所需的通用且可重用的模式和原理。
本書中的每個(gè)模式都包含問題描述和特定于Kubernetes的解決方案。所有模式均提供具體的代碼示例以及演示。本書主要面向熟悉Kubernetes基本概念的開發(fā)人員和架構(gòu)師,幫助他們學(xué)習(xí)如何使用久經(jīng)考驗(yàn)的設(shè)計(jì)模式解決常見的云原生難題。
前言
近年來,隨著微服務(wù)和容器的發(fā)展,設(shè)計(jì)、開發(fā)和運(yùn)行軟件的方式發(fā)生了重大變化。如今的應(yīng)用程序在可擴(kuò)展性、彈性、故障和變化速度方面都得到了優(yōu)化。在新原則的驅(qū)動(dòng)下,這些現(xiàn)代架構(gòu)需要不同的模式和實(shí)踐。本書旨在幫助開發(fā)人員將Kubernetes 作為運(yùn)行時(shí)平臺(tái)創(chuàng)建云原生應(yīng)用程序。首先,簡(jiǎn)要介紹一下本書的兩個(gè)主要部分:Kubernetes 和設(shè)計(jì)模式。
Kubernetes
Kubernetes 是一個(gè)容器編排平臺(tái)。Kubernetes 起源于谷歌的某個(gè)數(shù)據(jù)中心,谷歌的內(nèi)部容器編排平臺(tái)Borg 也誕生于此。多年來谷歌一直通過Borg 來運(yùn)行應(yīng)用程序。2014 年,谷歌決定利用Borg 的經(jīng)驗(yàn)建立一個(gè)名為“Kubernetes”(希臘語為“舵手”或“飛行員”)的新開源項(xiàng)目。2015 年該項(xiàng)目成為首個(gè)捐贈(zèng)給新成立的云原生計(jì)算基金會(huì)(Cloud Native Computing Foundation,CNCF)的項(xiàng)目。
Kubernetes 自創(chuàng)建之初就贏得了一個(gè)完整的用戶社區(qū),而且貢獻(xiàn)者的數(shù)量以驚人的速度增長。如今,Kubernetes 成為GitHub 上最活躍的項(xiàng)目之一。在編寫本書之際,Kubernetes 已是最常用且功能最豐富的容器編排平臺(tái)。此外,許多其他平臺(tái)也都構(gòu)建于Kubernetes 之上。在這些平臺(tái)即服務(wù)的系統(tǒng)中,最為突出的是紅帽的OpenShift,它為Kubernetes 提供了各種附加功能,包括各種在平臺(tái)內(nèi)構(gòu)建應(yīng)用程序的方法。這些只是我們選擇Kubernetes 作為本書云原生模式參考平臺(tái)的部分原因。
你需要具備一定的Kubernetes 基本知識(shí)才能閱讀本書。第1 章概括了Kubernetes 的核心概念,并為后續(xù)各個(gè)模式奠定了基礎(chǔ)。
設(shè)計(jì)模式
設(shè)計(jì)模式的概念可以追溯到20 世紀(jì)70 年代的建筑領(lǐng)域。建筑師及系統(tǒng)理論家Christopher Alexander 與其團(tuán)隊(duì)于1977 年發(fā)表了開創(chuàng)性的《建筑模式語言》(牛津大學(xué)出版),其中描述了建立城鎮(zhèn)、大樓和其他建筑項(xiàng)目的建筑模式。后來,這個(gè)想法被新興的軟件業(yè)采用。該領(lǐng)域最著名的書籍《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》由Erich Gamma、Richard Helm、Ralph Johnson與John Vlissides 四人合著,后以“四人組”著稱。我們談?wù)摰闹膯卫J、工廠方法或委托模式正是來自這本書。從那以后,許多優(yōu)秀的模式書籍紛紛問世,針對(duì)各個(gè)領(lǐng)域從不同程度上進(jìn)行了講解,比如Gregor Hohpe 和BobbyWoolf 的《企業(yè)集成模式》,以及Martin Fowler 的《企業(yè)應(yīng)用架構(gòu)模式》。簡(jiǎn)而言之,模式描述了問題的可復(fù)用解決方案注1。模式不同于配方,因?yàn)槟J讲粫?huì)提供解決問題的步驟說明,只提供了解決某一類問題的大概思路。例如,Alexander 的模式“啤酒館”描述了如何建造公共的飲酒場(chǎng)所,“陌生人和朋友都可以在這種地方結(jié)伴飲酒”,不再做一只“孤獨(dú)的錨”。所有依據(jù)這種模式建造的場(chǎng)所都會(huì)有所不同,但它們也有共同之處,例如可容納4~8 人的隔間,以及可供百人飲酒、聽音樂,以及其他活動(dòng)的場(chǎng)所。
然而,模式不僅限于提供解決方案,它還關(guān)系到一種語言的形成。獨(dú)特的模式名稱形成了一種緊湊、以名詞為中心的語言,其中每個(gè)模式都帶有唯一的名稱。在這種語言建立后,當(dāng)人們談?wù)撨@些模式時(shí),這些名稱會(huì)自動(dòng)讓人們聯(lián)想到類似的表征。例如,當(dāng)我們談?wù)撘粡堊雷訒r(shí),我們會(huì)假設(shè)我們談?wù)摰氖怯兴臈l腿的一塊木頭,而且可以在上面放東西。軟件工程也同樣,例如當(dāng)我們談?wù)摗肮S”時(shí),在面向?qū)ο蟮木幊陶Z言上下文中,我們會(huì)立即將“工廠”與生成其他對(duì)象的對(duì)象相關(guān)聯(lián)。由于我們會(huì)立刻想起模式背后的解決方案,因此就可以節(jié)約時(shí)間來處理尚未解決的問題。
模式語言還有其他特征。各個(gè)模式之間相互關(guān)聯(lián)且可以重疊,因此很多模式加在一起就可以解決大部分問題。此外,正如《建筑模式語言》中描述的那樣,模式?jīng)]有統(tǒng)一的詳細(xì)程度和范圍。寬泛的模式可以涵蓋更廣泛的問題,并為如何解決問題提供粗略的指導(dǎo)。詳細(xì)度模式有一個(gè)非常具體的解決方案,但無法廣泛適用。本書包含所有類型的模式,其中許多模式都引用了其他模式,甚至可能將其他模式作為解決方案的一部分。
模式的另一個(gè)特征是它們都遵循嚴(yán)格的格式。然而,每個(gè)作者都定義了不同的格式,但我們沒有統(tǒng)一的標(biāo)準(zhǔn)規(guī)定模式。Martin Fowler 在《WritingSoftware Patterns》中概述了模式語言的格式。
本書的組織結(jié)構(gòu)
我們?yōu)楸緯x擇了一種簡(jiǎn)單的模式格式。我們不遵循任何特定的模式描述語言。針對(duì)每個(gè)模式,我們使用以下結(jié)構(gòu):
名稱
每個(gè)模式都帶有一個(gè)名稱,這也是章節(jié)的標(biāo)題。名稱是模式語言的中心。
問題
本節(jié)描述了背景信息,并詳細(xì)描述了模式的應(yīng)用范圍。
解決方案
本節(jié)介紹了模式以Kubernetes 特有的方式解決問題的方法。本節(jié)還給出與當(dāng)前模式相關(guān)、或是當(dāng)前模式的一部分的其他模式的引用。
討論
本節(jié)討論了針對(duì)給定上下文的解決方案的優(yōu)缺點(diǎn)。
參考資料
最后一節(jié)包含了與模式相關(guān)的其他信息來源。
我們按照如下結(jié)構(gòu)介紹了本書中的模式:
?? 第一部分 基礎(chǔ)模式,涵蓋了 Kubernetes 的核心概念。本章介紹了構(gòu)建基于容器的云原生應(yīng)用程序的基本原則和實(shí)踐。
?? 第二部分 行為模式,描述了基礎(chǔ)模式之上的模式,并詳細(xì)介紹了管理各種類型的容器和平臺(tái)交互的概念。
?? 第三部分 結(jié)構(gòu)化模式,涵蓋了與在 Pod 內(nèi)組織容器相關(guān)的模式,Pod 是Kubernetes 平臺(tái)的基本組成單位。
?? 第四部分 配置模式,深入講解在 Kubernetes 中處理應(yīng)用程序配置的各種方法。本部分中的模式涉及很多細(xì)節(jié),包括將應(yīng)用程序連接到配置的具體方案。
?? 第五部分 高級(jí)模式,包括很多高級(jí)概念,例如擴(kuò)展平臺(tái)本身的方式,以及在集群內(nèi)直接構(gòu)建容器鏡像的方式。
有的模式可能不僅適合于一個(gè)類別。根據(jù)上下文不同,同一個(gè)模式可能也可以適用于多個(gè)類別。每個(gè)模式章節(jié)都是獨(dú)立的,你可以按照任意順序單獨(dú)閱讀各個(gè)章節(jié)。
本書面向的讀者對(duì)象
本書面向希望Kubernetes 平臺(tái)設(shè)計(jì)和開發(fā)云原生應(yīng)用程序的開發(fā)人員。如果你對(duì)容器和Kubernetes 的概念有基本的了解,并希望提升自身的水平,那么本書非常適合你。你無需了解Kubernetes 的底層知識(shí)也可以理解書中的用例和模式。架構(gòu)師、技術(shù)顧問和開發(fā)人員都可以從本書中描述的可復(fù)用模式中受益。
本書的內(nèi)容以實(shí)際項(xiàng)目中的用例和經(jīng)驗(yàn)教訓(xùn)為基礎(chǔ)。我們希望幫助你創(chuàng)建更好的云原生應(yīng)用程序,而不是重新發(fā)明輪子。
內(nèi)容提要
本書有很多值得探索的地方。有些模式看起來可能像Kubernetes 手冊(cè)中的摘錄,但仔細(xì)觀察后,你就會(huì)發(fā)現(xiàn)這些模式是從概念的角度呈現(xiàn)的,這是其他書籍中從未出現(xiàn)過的角度。有些模式通過不同的方法進(jìn)行了解釋,并針對(duì)具體的問題提供了詳細(xì)的指導(dǎo),如第四部分中的“配置模式”。
無論模式呈現(xiàn)的細(xì)節(jié)多少,你都可以通過大量示例針對(duì)這些概念的說明,了解Kubernetes 為每種特定模式提供的所有內(nèi)容。書中所有的示例都經(jīng)過了測(cè)試,你可以通過后續(xù)“使用代碼示例”一節(jié)中介紹的方式獲取完整的源代碼。
在深入學(xué)習(xí)之前,首先讓我們簡(jiǎn)要地看一看這本書不包含的內(nèi)容:
?? 本書不是關(guān)于如何設(shè)置 Kubernetes 集群的指南。每個(gè)模式和每個(gè)示例的前提都是你已有啟動(dòng)并運(yùn)行Kubernetes。你可以通過多種方式嘗試這些示例。如果你有興趣學(xué)習(xí)如何設(shè)置Kubernetes 集群,那么我們建議你閱讀Brendan Burns 和Craig Tracey 的著作《管理Kubernetes》。另外,Michael Hausenblas 與SébastienGoasguen 合著的《Kubernetes 經(jīng)典實(shí)例》一書中介紹了大量設(shè)置Kubernetes 集群的方法。
?? 本書不是有關(guān) Kubernetes 的介紹,也不是參考手冊(cè)。我們介紹了大量Kubernetes 的功能,并給出了詳細(xì)的解釋,但我們關(guān)注的是這些功能背后的概念。第1 章簡(jiǎn)要介紹了Kubernetes 的基礎(chǔ)知識(shí)。如果你需要有關(guān)Kubernetes 使用方面的綜合性書籍,那么我們強(qiáng)烈推薦MarkoLuk??a 的著作《Kubernetes in Action》。
本書的寫作風(fēng)格非常輕松,各章均可單獨(dú)閱讀。
內(nèi)容約定
如上所述,模式形成了一種簡(jiǎn)單、彼此關(guān)聯(lián)的語言。為了強(qiáng)調(diào)這種模式的關(guān)聯(lián),每種模式都用斜體字來表示(例如,Sidecar)。當(dāng)模式根據(jù)Kubernetes 的核心概念(如初始化容器或控制器)命名時(shí),我們僅在直接引用模式本身時(shí)才使用這種特定的格式。如果有必要,我們還會(huì)給出相應(yīng)的章節(jié)。
此外,本書還采用下述約定:
?? 凡是可以在 shell 或編輯器中鍵入的內(nèi)容都以固定寬度的字體顯示。
?? Kubernetes 資源的名稱始終以大寫形式呈現(xiàn)(如 Pod)。如果資源采用了組合名稱(如ConfigMap),我們也會(huì)采用這種形式,因?yàn)檫@種形式可以更為清晰地表示“config map”,而且還表明它指代Kubernetes 概念。
?? 有時(shí),Kubernetes 的資源名稱與“服務(wù)”或“節(jié)點(diǎn)”等常見概念相同。在這些情況下,我們僅在引用資源本身時(shí)使用資源名稱格式。
使用代碼示例
本書中的每個(gè)模式都有完整的可執(zhí)行示例支持,你可以通過本書的主頁找到這些示例(地址:https://k8spatterns.io/)。你還可以在每章末尾“參考資料”一節(jié)中找到每個(gè)模式示例的鏈接。
“參考資料”小節(jié)還包含許多指向與模式相關(guān)信息的鏈接。我們會(huì)通過示例代碼庫更新參考資料的列表,同時(shí)還會(huì)通過推特發(fā)布這些鏈接的變更。
Kubernetes 使用方面的綜合性書籍,那么我們強(qiáng)烈推薦MarkoLuk??a 的著作《Kubernetes in Action》。
本書的寫作風(fēng)格非常輕松,各章均可單獨(dú)閱讀。
內(nèi)容約定
如上所述,模式形成了一種簡(jiǎn)單、彼此關(guān)聯(lián)的語言。為了強(qiáng)調(diào)這種模式的關(guān)聯(lián),每種模式都用斜體字來表示(例如,Sidecar)。當(dāng)模式根據(jù)Kubernetes 的核心概念(如初始化容器或控制器)命名時(shí),我們僅在直接引用模式本身時(shí)才使用這種特定的格式。如果有必要,我們還會(huì)給出相應(yīng)的章節(jié)。
此外,本書還采用下述約定:
?? 凡是可以在 shell 或編輯器中鍵入的內(nèi)容都以固定寬度的字體顯示。
?? Kubernetes 資源的名稱始終以大寫形式呈現(xiàn)(如 Pod)。如果資源采用了組合名稱(如ConfigMap),我們也會(huì)采用這種形式,因?yàn)檫@種形式可以更為清晰地表示“config map”,而且還表明它指代Kubernetes 概念。
?? 有時(shí),Kubernetes 的資源名稱與“服務(wù)”或“節(jié)點(diǎn)”等常見概念相同。在這些情況下,我們僅在引用資源本身時(shí)使用資源名稱格式。
使用代碼示例
本書中的每個(gè)模式都有完整的可執(zhí)行示例支持,你可以通過本書的主頁找到這些示例(地址:https://k8spatterns.io/)。你還可以在每章末尾“參考資料”一節(jié)中找到每個(gè)模式示例的鏈接。
“參考資料”小節(jié)還包含許多指向與模式相關(guān)信息的鏈接。我們會(huì)通過示例代碼庫更新參考資料的列表,同時(shí)還會(huì)通過推特發(fā)布這些鏈接的變更。
Bilgin Ibryam(@bibryam)是紅帽的首席架構(gòu)師,阿帕奇軟件基金會(huì)的成員,他曾向多個(gè)開源項(xiàng)目貢獻(xiàn)代碼。
RolandHuß(@ro14nd)是紅帽的首席軟件工程師,也是Knative無服務(wù)器團(tuán)隊(duì)的成員。
目錄
序 .1
前言 .3
第1 章 引言 13
1.1 云原生之路 . 13
1.2 分布式原語 . 15
1.2.1 容器 17
1.2.2 Pod. 18
1.2.3 服務(wù) 20
1.2.4 標(biāo)簽 20
1.2.5 注釋 22
1.2.6 命名空間. 22
1.3 討論 24
1.4 參考資料 25
第一部分 基礎(chǔ)模式
第2 章 可預(yù)測(cè)的需求 .29
2.1 問題 29
2.2 解決方案 30
2.2.1 運(yùn)行時(shí)依賴 30
2.2.2 資源配置文件 33
2.2.3 Pod 優(yōu)先級(jí) 34
2.2.4 項(xiàng)目資源. 37
2.2.5 容量規(guī)劃. 38
2.3 討論 39
2.4 參考資料 39
第3 章 聲明式部署 .41
3.1 問題 41
3.2 解決方案 42
3.2.1 滾動(dòng)部署. 43
3.2.2 固定部署. 46
3.2.3 藍(lán)綠發(fā)布. 46
3.2.4 金絲雀發(fā)布 48
3.3 討論 48
3.4 參考資料 50
第4 章 健康檢測(cè) 51
4.1 問題 51
4.2 解決方案 52
4.2.1 進(jìn)程健康檢查 52
4.2.2 存活探針. 52
4.2.3 就緒探針. 54
4.3 討論 55
4.4 參考資料 56
第5 章 生命周期管理 .59
5.1 問題 59
5.2 解決方案 60
5.2.1 SIGTERM 信號(hào) 60
5.2.2 SIGKILL 信號(hào) . 61
5.2.3 postStart 鉤子 61
5.2.4 preStop 鉤子 . 62
5.2.5 其他生命周期控制 . 63
5.3 討論 64
5.4 參考資料 65
第6 章 自動(dòng)放置 67
6.1 問題 67
6.2 解決方案 68
6.2.1 可利用的節(jié)點(diǎn)資源 . 68
6.2.2 容器資源需求 69
6.2.3 放置策略. 69
6.2.4 調(diào)度的過程 70
6.2.5 節(jié)點(diǎn)親和性 72
6.2.6 Pod 親和性和反親和性 73
6.2.7 污點(diǎn)和容忍 75
6.3 討論 79
6.4 參考資料 81
第二部分 行為模式
第7 章 批處理作業(yè) .85
7.1 問題 85
7.2 解決方案 86
7.3 討論 89
7.4 參考資料 90
第8 章 定期作業(yè) 91
8.1 問題 91
8.2 解決方案 92
8.3 討論 94
8.4 參考資料 94
第9 章 守護(hù)進(jìn)程服務(wù) .95
9.1 問題 95
9.2 解決方案 96
9.3 討論 99
9.4 參考資料 99
第10 章 單例服務(wù) . 101
10.1 問題 101
10.2 解決方案 . 102
10.2.1 應(yīng)用程序外鎖定 102
10.2.2 應(yīng)用程序內(nèi)鎖定 105
10.2.3 Pod 中斷預(yù)算 107
10.3 討論 108
10.4 參考資料 . 108
第11 章 有狀態(tài)服務(wù) . 111
11.1 問題 111
11.1.1 存儲(chǔ) . 112
11.1.2 網(wǎng)絡(luò) . 113
11.1.3 標(biāo)識(shí) . 113
11.1.4 序數(shù) . 114
11.1.5 其他需求 114
11.2 解決方案 . 114
11.2.1 存儲(chǔ) . 116
11.2.2 網(wǎng)絡(luò) . 117
11.2.3 標(biāo)識(shí) . 119
11.2.4 序數(shù) . 119
11.2.5 其他特性 120
11.3 討論 122
11.4 參考資料 . 123
第12 章 服務(wù)發(fā)現(xiàn) . 125
12.1 問題 125
12.2 解決方案 . 126
12.2.1 內(nèi)部服務(wù)發(fā)現(xiàn) . 127
12.2.2 手動(dòng)服務(wù)發(fā)現(xiàn) . 131
12.2.3 集群外部的服務(wù)發(fā)現(xiàn) 134
12.2.4 應(yīng)用層服務(wù)發(fā)現(xiàn) 138
12.3 討論 141
12.4 參考資料 . 142
第13 章 自我意識(shí) . 145
13.1 問題 145
13.2 解決方案 . 146
13.3 討論 149
13.4 參考資料 . 149
第三部分 結(jié)構(gòu)化模式
第14 章 初始化容器 153
14.1 問題 153
14.2 解決方案 . 154
14.3 討論 159
14.4 參考資料 . 159
第15 章 Sidecar 161
15.1 問題 161
15.2 解決方案 . 162
15.3 討論 164
15.4 參考資料 . 165
第16 章 適配器 . 167
16.1 問題 167
16.2 解決方案 . 167
16.3 討論 170
16.4 參考資料 . 171
第17 章 外交官 . 173
17.1 問題 173
17.2 解決方案 . 174
17.3 討論 176
17.4 參考資料 . 176
第四部分 配置模式
第18 章 環(huán)境變量配置 179
18.1 問題 179
18.2 解決方案 . 179
18.3 討論 183
18.4 參考資料 . 184
第19 章 配置資源 . 185
19.1 問題 185
19.2 解決方案 . 185
19.3 討論 190
19.4 參考資料 . 191
第20 章 不可變配置 193
20.1 問題 193
20.2 解決方案 . 193
20.2.1 Docker 卷 194
20.2.2 Kubernetes 初始化容器 195
20.2.3 OpenShift 模板 198
20.3 討論 199
20.4 參考資料 . 200
第21 章 配置模板 . 203
21.1 問題 203
21.2 解決方案 . 204
21.3 討論 209
21.4 參考資料 . 210
第五部分 高級(jí)模式
第22 章 控制器 . 213
22.1 問題 213
22.2 解決方案 . 214
22.3 討論 226
22.4 參考資料 . 226
第23 章 操作器 . 229
23.1 問題 229
23.2 解決方案 . 230
23.2.1 自定義資源定義 230
23.2.2 控制器和操作器的分類 . 233
23.2.3 操作器的開發(fā)與部署 236
23.2.4 示例 . 239
23.3 討論 243
23.4 參考資料 . 244
第24 章 彈性伸縮 . 247
24.1 問題 247
24.2 解決方案 . 248
24.2.1 手動(dòng)水平伸縮 . 248
24.2.2 Pod 水平自動(dòng)伸縮 250
24.2.3 Pod 垂直自動(dòng)伸縮 255
24.2.4 集群自動(dòng)伸縮 . 259
24.2.5 伸縮級(jí)別 262
24.3 討論 264
24.4 參考資料 . 265
第25 章 鏡像構(gòu)建 . 267
25.1 問題 267
25.2 解決方案 . 269
25.2.1 OpenShift Build . 269
25.2.2 Knative Build 277
25.3 討論 282
25.4 參考資料 . 283
后記 285
作者介紹 287
封面介紹 287