- 創(chuàng)建和運行一個簡單的集群,了解Kubernetes的基本工作原理。
- 深入了解使用Kubernetes、Pod、服務、Ingress,以及副本集部署應用程序的細節(jié)。
- 將存儲集成到Kubernetes的容器化微服務中。
- 學習Kubernetes中的專用對象,例如守護進程集、作業(yè)、ConfigMap,以及Secret等。
- 掌握在Kubernetes中開發(fā)和部署應用程序的實戰(zhàn)經驗。
Kubernetes的時代已然到來。在短短幾年內,這款容器編排器從根本上改變了開發(fā)人員和運維人員在云中構建、部署,以及維護應用程序的方式。無論你是分布式系統(tǒng)的新手,還是多年來一直在部署云原生應用程序的老手,Kubernetes都可以幫助你在速度、敏捷性、可靠性,以及效率等方面更上一層樓。
本書作者長期致力于Kubernetes的概念抽象以及構建實踐,他們將通過本書向你展示怎樣將Kubernetes完美地融入分布式應用程序的生命周期。你將學習如何使用各種工具以及API來實現(xiàn)可擴展分布式系統(tǒng)的自動化,無論你的系統(tǒng)是在線服務、機器學習應用程序,還是樹莓派計算機集群。
前言
Kubernetes:獻辭
Kubernetes 要感謝所有在凌晨三點醒來重啟進程的系統(tǒng)管理員。感謝所有將代碼推送到生產環(huán)境,卻發(fā)現(xiàn)代碼沒有像在筆記本電腦上那樣運行的開發(fā)人員。感謝所有由于未能更新主機名而錯誤地將負載測試指向生產服務的系統(tǒng)架構師。當然,這些經歷非常痛苦、讓人摸不著頭腦,但正是受到了這些奇怪的錯誤的啟發(fā),Kubernetes 才得以發(fā)展。用一句話來總結就是:Kubernetes的目的是從根本上簡化構建、部署和維護分布式系統(tǒng)的任務。它的靈感來自幾十年來人們?yōu)闃嫿ǹ煽康南到y(tǒng)而積累的經驗。Kubernetes 的設計目標就是讓那些痛苦的經歷變成愉悅(甚至欣喜)。希望你喜歡這本書!
本書面向的讀者對象
無論你是分布式系統(tǒng)的新手,還是多年來一直在部署云原生應用程序的老手,Kubernetes 都可以幫助你在速度、敏捷性、可靠性以及效率等方面更上一層樓。本書介紹了Kubernetes 集群編排器,以及如何利用其工具和API 來改善分布式應用程序的開發(fā)、交付和維護。盡管本書不要求讀者有Kubernetes 方面的經驗,但為了充分理解本書,希望讀者熟悉基于服務器的應用程序的構建和部署。好能夠熟悉負載均衡以及網(wǎng)絡存儲等知識,但不是必需的。同樣,擁有Linux、Linux 容器以及Docker 方面的經驗能夠幫助你充分理解本書。
本書的創(chuàng)作原因
從Kubernetes 問世到現(xiàn)在,我們一直在跟它打交道。我們見證了它從好奇心驅使下的實驗,逐步蛻變成關鍵性的生產級基礎設施,為從機器學習到在線服務等各個領域的大規(guī)模生產應用程序提供動力。隨著這種轉變的發(fā)生,我們越來越明顯地感覺到,如果能夠編寫一本書涵蓋Kubernetes 核心概念的使用方法,同時又能介紹這些概念開發(fā)背后的動機,那么就是對云原生應用程序開發(fā)做出的重大貢獻。我們希望,通過閱讀本書,你不僅可以學習如何在Kubernetes 之上構建可靠、可擴展的應用程序,而且還可以洞悉分布式系統(tǒng)所面臨的核心挑戰(zhàn),因為正是這些挑戰(zhàn)促進了分布式系統(tǒng)的發(fā)展。
本書更新至第二版的原因
自從本書版發(fā)行以來,在過去的幾年里,Kubernetes 生態(tài)系統(tǒng)蓬勃發(fā)展。Kubernetes 本身已經發(fā)布了許多版本,而且許多使用Kubernetes 的工具和模式也成為事實上的標準。在更新本書時,我們添加了有關HTTP 負載均衡、基于角色的訪問控制(RBAC)、擴展Kubernetes API,以及如何在源代碼管理中組織應用程序等內容。此外,我們還更新了所有現(xiàn)有章節(jié),以反映自版以來Kubernetes 的發(fā)展與演變。隨著Kubernetes 的不斷發(fā)展,我們希望幾年后再次修訂本書。
當前云原生應用程序簡介
從門編程語言問世到面向對象編程,再到虛擬化和云基礎設施的發(fā)展,計算機科學的歷史就是一部抽象發(fā)展史,抽象不僅可以隱藏復雜性,還可以賦予你構建更復雜的應用程序的能力。盡管如此,可靠的、可擴展的應用程序的開發(fā)仍然面臨著許多重大挑戰(zhàn)。近年來,事實證明,像Kubernetes 這樣的容器以及容器編排API 已成為一個重要的抽象,它能從根本上簡化可靠的、可擴展的分布式系統(tǒng)的開發(fā)。盡管容器和編排器尚未完全成為主流,但它們已經能夠讓開發(fā)人員以快速、靈活和可靠的方式構建和部署應用程序,這放在幾年前簡直就是科幻小說。
本書的主要內容
本書的組織結構如下。第1 章概述了Kubernetes 的各種優(yōu)點,但我們不會深入細節(jié)。如果你是Kubernetes 新手,好從這一章開始閱讀,從而了解本書后續(xù)章節(jié)的大致內容。
第2 章詳細介紹了容器以及容器化應用程序開發(fā)。如果你以前從未真正接觸過Docker,那么本章將是一個不錯的入門。如果你已是Docker 專家,那么也可以溫習一下大部分內容。
第3 章介紹了如何部署Kubernetes。雖然本書的大部分內容都側重于Kubernetes 的使用方式,但在開始使用之前,你首先需要建立并運行一個集群。盡管運行生產集群的知識不在本書的討論范圍內,但本章介紹了幾種簡單的創(chuàng)建集群的方法,為的是方便你了解如何使用Kubernetes。第4 章涵蓋了與Kubernetes 集群交互時常用的一系列命令。
從第5 章開始,我們將深入探討使用Kubernetes 部署應用程序的細節(jié)。我們介紹了Pod(第5 章)、標簽和注釋(第6 章)、服務(第7 章)、Ingress(第8 章)和副本集(第9 章)。這些構成了在Kubernetes 中部署服務所需的核心基礎。接下來,我們還介紹了部署(第10 章),它將整個應用程序的生命周期聯(lián)系在一起。
在這些章節(jié)之后,我們將介紹Kubernetes 中的一些更專業(yè)的對象:守護進程集(第11 章)、作業(yè)(第12 章)、ConfigMap 與Secret(第13 章)。雖然這些章節(jié)對于許多生產應用程序來說必不可少,但如果只是為了學習Kubernetes,那么可以暫時跳過,等到以后積累到更多經驗和專業(yè)知識之后,再回過頭來閱讀。
接下來,我們介紹將存儲集成到Kubernetes(第15 章)。我們還將在第16章中討論擴展Kubernetes。后,我們還會通過一些例子來說明如何利用Kubernetes 來開發(fā)和部署實際應用程序(第17 章),并討論如何在源代碼控制中組織應用程序(第18 章)。
在線資源
你需要安裝Docker,可能還需要熟悉一下相關的Docker 文檔。
同樣,你還需要安裝kubectl 命令行工具。你也可以加入Kubernetes Slack 頻道(地址:http://slack.kubernetes.io/),這是一個龐大的用戶社區(qū),每天都有很多人在其中探討和回答問題。
后,隨著你獲得的相關技術知識不斷增多,將來可能還想涉足GitHub 上的開源Kubernetes 代碼庫(地址:https://github.com/kubernetes/kubernetes)。
排版約定
本書使用了下述排版約定。
斜體(Italic)
表示新術語、URL、示例電子郵件地址、文件名和擴展名。
等寬字體(Constant Width)
表示程序片段,以及正文中出現(xiàn)的變量、函數(shù)名、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關鍵字等。
加粗等寬字體(constant width bold)
表示應該由用戶輸入的命令或其他文本。
等寬斜體(constant width italic)
表示應該由用戶輸入的值或根據(jù)上下文確定的值替換的文本。
使用代碼示例
你可以通過如下鏈接下載本書的補充材料(代碼示例,練習等):https://github.com/kubernetes-up-and-running/examples.
本書的目的是幫助你完成工作。一般來說,你可以在自己的程序或者文檔中使用本書附帶的示例代碼。你無需聯(lián)系我們獲得使用許可,除非你要復制大量的代碼。例如,使用本書中的多個代碼片段編寫程序就無需獲得許可。但以CD-ROM 的形式銷售或者分發(fā)OReilly 書中的示例代碼則需要獲得許可;卮饐栴}時援引本書內容以及書中示例代碼,無需獲得許可。在你自己的項目文檔中使用本書大量的示例代碼時,則需要獲得許可。
我們不強制要求署名,但如果你這么做,我們深表感激。署名一般包括書名、作者、出版社和國際標準圖書編號。例如:Kubernetes: Up and Running,2nd edition, by Brendan Burns, Joe Beda, and Kelsey Hightower (OReilly).Copyright 2019 Brendan Burns, Joe Beda, and Kelsey Hightower, 978-1-492-04653-0。
如果你覺得自身情況不在合理使用或上述允許的范圍內,請通過郵件和我們聯(lián)系,地址是:permissions@oreilly.com。
OReilly 在線學習平臺(OReilly Online Learning)
近40 年來,OReilly Media 致力于提供技術和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。
我們擁有獨一無二的專家和革新者組成的龐大網(wǎng)絡,他們通過圖書、文章、會議和我們的在線學習平臺分享他們的知識和經驗。OReilly 的在線學習平臺允許你按需訪問現(xiàn)場培訓課程、深入的學習路徑、交互式編程環(huán)境,以及OReilly 和200 多家其他出版商提供的大量文本和視頻資源。有關的更多信息,請訪問http://oreilly.com。
意見和疑問
請把你對本書的意見和疑問發(fā)給出版社:
美國:
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035)
奧萊利技術咨詢(北京)有限公司
這本書有專屬網(wǎng)頁,你可以在那里找到本書的勘誤、示例和其他信息。地址是:https://www.oreilly.com/library/view/kubernetes-up-and/9781492046523/。
如果你對本書有一些評論或技術上的建議, 請發(fā)送電子郵件到:bookquestions@oreilly.com。
要了解OReilly 圖書、培訓課程、會議和新聞的更多信息,請訪問我們的網(wǎng)站,地址是:http://www.oreilly.com
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的Youtube:http://www.youtube.com/oreillymedia。
致謝
本書得以付梓,我們要感謝所有幫助我們編寫本書的人。其中包括我們的編輯Virginia Wilson 和OReilly 全體工作人員,以及技術評審員,他們提供了大量的反饋意見,對我們更好地完成本書的創(chuàng)作給予了極大的幫助。后,我們要感謝所有版的讀者,你們報告的勘誤已在第二版中得到了修正。
謝謝你們!我們非常感謝。
Brendan Burns是Kubernetes的合伙創(chuàng)始人,微軟Azure的杰出工程師,負責領導開發(fā)運維、開源,以及微服務等團隊。
Joe Beda是Kubernetes的合伙創(chuàng)始人,VMware的首席工程師。他曾是Heptio的合伙創(chuàng)始人,直到該公司被VMware收購前一直擔任CTO之職。他在VMware公司范圍內推動了Kubernetes戰(zhàn)略的實施。
Kelsey Hightower是Google云平臺的首席開發(fā),他曾在科技職業(yè)生涯中出任多個職位,主要領導軟件的發(fā)行工作
目錄
前言 .1
第1 章 概述 .9
1.1 速度 10
1.1.1 不可變性的價值 . 11
1.1.2 聲明式配置 13
1.1.3 自我修復系統(tǒng) 13
1.2 擴展服務和團隊 14
1.2.1 解耦 15
1.2.2 輕松擴展應用程序和集群 . 15
1.2.3 通過微服務擴展開發(fā)團隊 . 16
1.2.4 一致性與擴展性的關注點分離 17
1.3 抽象基礎設施 19
1.4 效率 20
1.5 小結 21
第2 章 創(chuàng)建和運行容器 22
2.1 容器鏡像 24
2.2 使用Docker 構建應用程序鏡像 26
2.2.1 Dockerfiles 26
2.2.2 優(yōu)化鏡像的大小 . 28
2.2.3 鏡像安全. 30
2.3 多階段鏡像構建 30
2.4 將鏡像存儲到遠程倉庫 32
2.5 Docker 容器運行時 . 34
2.5.1 通過Docker 運行容器 . 34
2.5.2 探索kuard 應用程序. 34
2.5.3 限制資源使用 35
2.6 清理 36
2.7 小結 37
第3 章 部署Kubernetes 集群 38
3.1 在公共云上安裝Kubernetes 39
3.1.1 Google Kubernetes Engine . 39
3.1.2 使用Azure Kubernetes 服務安裝Kubernetes 40
3.1.3 在Amazon Web Services 上安裝Kubernetes 41
3.2 使用minikube 在本地安裝Kubernetes . 41
3.3 在Docker 中運行Kubernetes 42
3.4 在樹莓派上運行Kubernetes 43
3.5 Kubernetes 客戶端 43
3.5.1 檢查集群狀態(tài) 43
3.5.2 列出Kubernetes 的工作節(jié)點 44
3.6 集群組件 47
3.6.1 Kubernetes 代理 47
3.6.2 Kubernetes DNS . 48
3.6.3 Kubernetes 用戶界面 48
3.7 小結 49
第4 章 常用的kubectl 命令 .50
4.1 命名空間 50
4.2 上下文 50
4.3 查看Kubernetes API 對象 51
4.4 創(chuàng)建、更新和銷毀Kubernetes 對象 52
4.5 給對象添加標簽和注釋 54
4.6 調試命令 54
4.7 自動補齊命令 56
4.8 查看集群的其他方法 . 57
4.9 小結 57
第5 章 Pod 58
5.1 Kubernetes 中的Pod 59
5.2 Pod 的應用思路 60
5.3 Pod 清單 61
5.3.1 創(chuàng)建Pod . 62
5.3.2 創(chuàng)建Pod 清單 62
5.4 運行Pod 63
5.4.1 查詢Pod 列表 63
5.4.2 Pod 的詳細信息 64
5.4.3 刪除Pod . 66
5.5 訪問Pod 66
5.5.1 使用端口轉發(fā) 66
5.5.2 通過日志獲取更多信息 67
5.5.3 使用exec 在容器中運行命令 68
5.5.4 在容器之間復制文件 68
5.6 健康檢查 69
5.6.1 存活探針. 69
5.6.2 就緒探針. 71
5.6.3 健康檢查的類型 . 71
5.7 資源管理 71
5.7.1 資源請求:所需的少資源量 72
5.7.2 通過約束限制資源使用量 . 74
5.8 利用卷持久保存數(shù)據(jù) . 75
5.8.1 在Pod 中使用卷 . 75
5.8.2 Pod 中卷的不同使用方式 76
5.8.3 使用遠程磁盤持久保存數(shù)據(jù) . 77
5.9 綜合討論 78
5.10 小結 . 79
第6 章 標簽與注釋 .80
6.1 標簽 80
6.1.1 應用標簽. 82
6.1.2 修改標簽. 83
6.1.3 標簽選擇器 84
6.1.4 API 對象中的標簽選擇器 86
6.1.5 Kubernetes 架構中的標簽 87
6.2 注釋 88
6.3 清理 89
6.4 小結 90
第7 章 服務發(fā)現(xiàn) 91
7.1 什么是服務發(fā)現(xiàn)? 91
7.2 服務對象 92
7.2.1 DNS 服務 93
7.2.2 就緒檢查. 95
7.3 向外公開集群服務 97
7.4 云集成 98
7.5 高級集成 99
7.5.1 端點 99
7.5.2 手動發(fā)現(xiàn)服務 101
7.5.3 kube-proxy 與集群IP 102
7.5.4 集群IP 環(huán)境變量 . 103
7.6 連接到其他環(huán)境 104
7.7 清理 . 104
7.8 小結 . 105
第8 章 Ingress 的HTTP 負載均衡 106
8.1 Ingress 的規(guī)范與Ingress 控制器 107
8.2 安裝Contour 108
8.2.1 配置DNS. 109
8.2.2 配置本地的hosts 文件 109
8.3 使用Ingress . 110
8.3.1 簡單的用法 111
8.3.2 使用主機名 . 112
8.3.3 使用路徑 114
8.3.4 清理 115
8.4 Ingress 的高級話題和技巧 115
8.4.1 運行多個Ingress 控制器 . 115
8.4.2 多個Ingress 對象 . 116
8.4.3 Ingress 與命名空間 . 116
8.4.4 改寫路徑 117
8.4.5 提供TLS . 117
8.5 Ingress 的其他實現(xiàn) 119
8.6 Ingress 的未來 119
8.7 小結 . 120
第9 章 副本集 121
9.1 協(xié)調循環(huán) 122
9.2 Pod 與副本集的關聯(lián) 123
9.2.1 采用現(xiàn)有的容器 123
9.2.2 隔離容器 124
9.3 副本集的設計思想 124
9.4 副本集的規(guī)范 . 124
9.4.1 Pod 模板 125
9.4.2 標簽 125
9.5 創(chuàng)建副本集 126
9.6 檢查副本集 126
9.6.1 根據(jù)Pod 查找副本集 . 127
9.6.2 查找副本集管理的Pod 集合 . 127
9.7 副本集的伸縮 . 128
9.7.1 副本集的命令式伸縮:kubectl scale . 128
9.7.2 副本集的聲明式伸縮:kubectl apply 129
9.7.3 自動伸縮副本集 130
9.8 刪除副本集 131
9.9 小結 . 132
第10 章 部署 . 133
10.1 個部署 134
10.2 創(chuàng)建部署 . 136
10.3 管理部署 . 138
10.4 更新部署 . 139
10.4.1 擴展部署 139
10.4.2 更新容器鏡像 . 140
10.4.3 推出的歷史記錄 142
10.5 部署策略 . 145
10.5.1 重建策略 145
10.5.2 滾動更新策略 . 145
10.5.3 放慢部署速度以確保服務健康 149
10.6 刪除部署 . 151
10.7 監(jiān)控部署 . 151
10.8 小結 152
第11 章 守護進程集 . 153
11.1 守護進程集調度器 . 154
11.2 創(chuàng)建守護進程集 155
11.3 將守護進程集限制到特定節(jié)點 157
11.3.1 向節(jié)點添加標簽 . 157
11.3.2 節(jié)點選擇器 158
11.4 更新守護進程集 159
11.5 刪除守護進程集 161
11.6 小結 161
第12 章 作業(yè) . 162
12.1 作業(yè)對象 . 162
12.2 作業(yè)模式 . 163
12.2.1 一次性作業(yè) 163
12.2.2 并行性 168
12.2.3 工作隊列 170
12.3 定時作業(yè) . 175
12.4 小結 176
第13 章 ConfigMap 與Secret 177
13.1 ConfigMap . 177
13.1.1 創(chuàng)建ConfigMap . 178
13.1.2 使用ConfigMap . 179
13.2 Secret 182
13.2.1 創(chuàng)建Secret 183
13.2.2 消費Secret 184
13.2.3 私有Docker 倉庫 186
13.3 命名約束 . 187
13.4 管理ConfigMap 和Secret 188
13.4.1 顯示列表 188
13.4.2 創(chuàng)建 . 189
13.4.3 更新 . 190
13.5 小結 192
第14 章 基于角色的訪問控制 193
14.1 基于角色的訪問控制 194
14.1.1 Kubernetes 中的身份 194
14.1.2 角色和角色綁定 195
14.1.3 Kubernetes 中的角色和角色綁定 196
14.2 RBAC 的管理技巧 . 199
14.2.1 使用can-i 測試授權 . 199
14.2.2 通過源代碼控制管理RBAC 199
14.3 高級主題 . 200
14.3.1 聚合ClusterRoles . 200
14.3.2 使用組進行綁定 201
14.4 小結 203
第15 章 存儲解決方案與Kubernetes 的集成 204
15.1 導入外部服務 205
15.1.1 沒有選擇器的服務 207
15.1.2 外部服務的局限性:健康檢查 209
15.2 運行可靠的單例 209
15.2.1 運行MySQL 單例服務 209
15.2.2 動態(tài)卷供應 214
15.3 利用狀態(tài)集實現(xiàn)Kubernetes 原生存儲 215
15.3.1 狀態(tài)集的屬性 . 215
15.3.2 利用狀態(tài)集手動復制MongoDB 216
15.3.3 自動化MongoDB 集群的創(chuàng)建 219
15.3.4 持久卷與狀態(tài)集 222
15.3.5 后一步:存活探針 223
15.4 小結 224
第16 章 擴展Kubernetes . 225
16.1 擴展Kubernetes 意味著什么 226
16.2 可擴展點 . 226
16.3 定制資源的模式 236
16.3.1 僅有數(shù)據(jù) 236
16.3.2 編譯器 237
16.3.3 操作器 237
16.3.4 如何入門 238
16.4 小結 238
第17 章 部署實際應用程序 239
17.1 Jupyter . 239
17.2 Parse . 241
17.2.1 前提條件 242
17.2.2 構建Parse 服務器 . 242
17.2.3 部署parse-server 242
17.2.4 測試Parse . 244
17.3 Ghost. 244
17.4 Redis . 248
17.4.1 配置Redis 249
17.4.2 創(chuàng)建Redis 服務 . 251
17.4.3 部署Redis 251
17.4.4 使用Redis 集群 . 253
17.5 小結 254
第18 章 組織應用程序 256
18.1 我們的指導原則 256
18.1.1 以文件為準 257
18.1.2 代碼審查的作用 257
18.1.3 特性門控 258
18.2 在源代碼管理中管理應用程序 259
18.2.1 文件系統(tǒng)的布局 259
18.2.2 管理周期性的版本 260
18.3 為開發(fā)、測試與部署組織應用程序的結構 262
18.3.1 目標 . 262
18.3.2 發(fā)布的進展 263
18.4 使用模板為應用程序添加參數(shù) 264
18.4.1 使用Helm 和模板實現(xiàn)參數(shù)化 265
18.4.2 在文件系統(tǒng)布局中使用參數(shù) 266
18.5 部署全球性的應用程序 266
18.5.1 全球部署架構 . 267
18.5.2 實現(xiàn)全球部署 . 268
18.5.3 面向全球部署的儀表板和監(jiān)視 270
18.6 小結 270
附錄 利用樹莓派搭建Kubernetes 集群 271
作者介紹 281
封面介紹 281