Kubernetes作為云原生領(lǐng)域容器編排的事實標(biāo)準(zhǔn)毋庸置疑,Kubernetes作為編排調(diào)度的指揮官,而真正的執(zhí)行者實際上是容器運行時。在云原生生態(tài)中,容器運行時作為云原生技術(shù)棧的基石,是至關(guān)重要的一環(huán)。本書旨在幫助讀者全面了解containerd的基本原理和概念。本書從云原生與容器運行時講起,內(nèi)容涵蓋云原生和容器的發(fā)展史,容器技術(shù)的Linux原理,containerd的架構(gòu)、原理、功能、部署、配置、插件擴(kuò)展開發(fā)等,并詳細(xì)介紹containerd生產(chǎn)實踐中的配置以及落地實踐,使讀者對containerd的概念、原理、實踐有比較清晰的了解。
本書適合作為云原生和容器技術(shù)的架構(gòu)師、研發(fā)工程師和運維工程師的參考資料,也適合作為希望了解云計算和容器技術(shù)的愛好者的自學(xué)用書和參考手冊。
本書由字節(jié)跳動火山引擎資深技術(shù)專家傾力撰寫,并獲得了來自CNCF、浙江大學(xué)計算機系SEL實驗室、火山引擎邊緣云、邊緣計算社區(qū)、Kata Containers架構(gòu)委員會等技術(shù)專家傾情力薦。這是首本詳細(xì)剖析容器運行時containerd原理與實戰(zhàn)的書,匯聚了作者十余年云原生工作中的經(jīng)驗總結(jié)與思考。
創(chuàng)作背景
近幾年,隨著Kubernetes和容器技術(shù)的崛起,云原生已成為當(dāng)下熱門的技術(shù)話題。而Kubernetes也毫無疑問地成為容器編排領(lǐng)域的事實標(biāo)準(zhǔn)。容器運行時作為Kubernetes運行容器的關(guān)鍵組件,承擔(dān)著管理進(jìn)程的使命。起初Kubernetes支持的容器運行時是Docker,Docker client通過代碼內(nèi)嵌的方式集成在kubelet中。之后Kubernetes重新設(shè)計了CRI標(biāo)準(zhǔn),使得各種容器運行時可以通過CRI協(xié)議接入Kubernetes。而之前通過硬編碼形式嵌入kubelet中的Docker client,則逐漸遷移到CRI標(biāo)準(zhǔn)下(dockershim),并在Kubernetes 1.24版本中被徹底移除。
CRI支持的容器運行時有很多,其中containerd作為從Docker項目中分離出來的項目,由于經(jīng)歷了Docker多年生產(chǎn)環(huán)境的磨煉,相比其他CRI運行時更加健壯、成熟。正如containerd官網(wǎng)所言,containerd是一個工業(yè)級標(biāo)準(zhǔn)的容器運行時,它強調(diào)簡單性、健壯性和可移植性。
Docker作為老牌的容器運行時,有很多相關(guān)的書籍和資料對其進(jìn)行介紹,而containerd作為一個新興的容器運行時,截至筆者著書之日,依然沒有系統(tǒng)介紹它的書籍。作為一名云原生以及容器技術(shù)的忠實粉絲,筆者很早就接觸到了containerd項目,并見證了containerd項目的發(fā)展,為containerd項目取得的成就感到驕傲,也對containerd項目充滿了信心。因此,希望通過這本書,更多的人可以了解containerd,體驗containerd帶來的價值。
目標(biāo)讀者
本書的目標(biāo)讀者包括:
云原生架構(gòu)師。
容器技術(shù)架構(gòu)師。
研發(fā)工程師。
運維工程師。
云計算和容器技術(shù)的愛好者。
本書內(nèi)容
本書作為一本系統(tǒng)介紹云原生容器運行時containerd的書,將通過深入淺出的方式一步步介紹containerd的發(fā)展歷史、依賴的技術(shù)背景、技術(shù)架構(gòu)和原理等。
本書內(nèi)容共分8章,每章的知識點如下。
第1章:講解云原生與容器運行時,介紹什么是云原生,云原生有什么價值,云原生與容器運行時有什么關(guān)系,以及Docker與Kubernetes的發(fā)展歷史等,帶讀者了解containerd容器技術(shù)的發(fā)展與歷史。
第2章:講解容器運行時的概念,從容器技術(shù)及其發(fā)展歷史出發(fā),為讀者介紹容器的發(fā)展史,容器所依賴的Linux基礎(chǔ),容器運行時以及當(dāng)前的容器運行時規(guī) 范等。
第3章:講解如何使用containerd,內(nèi)容包括containerd的安裝和部署,以及如何通過ctr和nerdctl兩種cli工具操作containerd。
第4章:講解containerd與CRI,內(nèi)容包括Kubernetes中的CRI機制及其演進(jìn)、containerd中的CRI Plugin架構(gòu)和配置,以及CRI客戶端工具crictl的使用等。
第5章:講解containerd中的容器網(wǎng)絡(luò),主要從CNI規(guī)范、常見的CNI網(wǎng)絡(luò)插件,以及如何在containerd中指定容器網(wǎng)絡(luò)創(chuàng)建容器等方面展開介紹。
第6章:講解containerd和容器存儲,重點介紹containerd是如何通過snapshotter管理容器鏡像的。
第7章:講解containerd的核心組件,對containerd的架構(gòu)進(jìn)行剖析,根據(jù)containerd架構(gòu)講解組成containerd的各個模塊,如API、Core以及Backend層的多個模塊。
第8章:講解containerd生產(chǎn)與實踐中的一些操作,如如何配置containerd的監(jiān) 控,如何基于containerd做二次開發(fā)等。
讀者服務(wù)
讀者可以通過掃碼訪問本書專享資源官網(wǎng),獲取示例代碼,加入讀者群,下載最新學(xué)習(xí)資源或反饋書中的問題。
勘誤和支持
由于筆者水平有限,書中難免會有疏漏和不妥之處,懇請廣大讀者批評指正。
致謝
本書從構(gòu)思、形成初稿,直到出版問世,得到了許多人的幫助。
首先要感謝的是我的妻子對我的支持,使我有足夠的時間投入本書的寫作中,并在寫作的過程中給了我很大的鼓勵和支持。
本書的大量內(nèi)容源于我所參與的項目實踐。諸多業(yè)務(wù)合作伙伴在使用我們的容器平臺的過程中向我們提出了許多富有挑戰(zhàn)的問題,是他們孜孜不倦的追求,深化了我對容器技術(shù)、containerd的理解,進(jìn)而豐富了本書的內(nèi)容。對此,向曾經(jīng)一起合作的團(tuán)隊成員表示感謝。
最后,衷心感謝清華大學(xué)出版社王秋陽老師對本書進(jìn)行細(xì)致的審閱和策劃,讓本書的架構(gòu)更加完備,內(nèi)容更加完整,并最終得以順利出版。
筆者
趙吉壯,碩士畢業(yè)于浙江大學(xué)控制科學(xué)與工程學(xué)院,字節(jié)跳動火山引擎云計算架構(gòu)師,Kubernetes、Knative 等開源社區(qū)成員。具備多年云原生領(lǐng)域架構(gòu)設(shè)計與研發(fā)經(jīng)驗,主導(dǎo)火山引擎邊緣容器完成從0 到1的建設(shè)。專注于 kubernetes、Serverless、容器等技術(shù)的研究,譯作有《Knative 最佳實踐》和《Knative 快速入門與實踐》等書籍。
張明月,新華三資深網(wǎng)絡(luò)技術(shù)專家,多年企業(yè)網(wǎng)實踐經(jīng)驗,對數(shù)據(jù)中心網(wǎng)絡(luò)、園區(qū)網(wǎng)絡(luò)、傳統(tǒng)二三層交換機、數(shù)據(jù)傳輸設(shè)備,從管理面到協(xié)議控制面,都有著深刻的理解。
第1章 云原生與容器運行時 1
1.1 云原生概述 1
1.1.1 云原生的定義 1
1.1.2 云原生應(yīng)用的價值 3
1.1.3 云原生應(yīng)用與傳統(tǒng)應(yīng)用對比 3
1.2 云原生技術(shù)棧與容器運行時 4
1.2.1 云原生技術(shù)棧 4
1.2.2 容器運行時 5
1.3 Docker與Kubernetes的發(fā)展史 7
1.3.1 Docker的發(fā)展歷史及與容器世界的關(guān)聯(lián) 7
1.3.2 Docker架構(gòu)的發(fā)展 13
1.4 containerd概述 15
第2章 初識容器運行時 18
2.1 容器技術(shù)的發(fā)展史 19
2.2 容器Linux基礎(chǔ) 25
2.2.1 容器是如何運行的 25
2.2.2 namespace 27
2.2.3 Cgroups 46
2.2.4 chroot和pivot_root 52
2.3 容器運行時概述 54
2.3.1 什么是容器運行時 54
2.3.2 OCI規(guī)范 55
2.3.3 低級容器運行時 70
2.3.4 高級容器運行時 71
第3章 使用containerd 73
3.1 containerd的安裝與部署 74
3.1.1 containerd的安裝 74
3.1.2 配置containerd.service 76
3.2 ctr的使用 78
3.2.1 ctr的安裝 78
3.2.2 namespace 80
3.2.3 鏡像操作 82
3.2.4 容器操作 85
3.3 nerdctl的使用 89
3.3.1 nerdctl的設(shè)計初衷 89
3.3.2 安裝和部署nerdctl 90
3.3.3 nerdctl的命令行使用 92
3.3.4 運行容器 95
3.3.5 構(gòu)建鏡像 96
第4章 containerd與云原生生態(tài) 99
4.1 Kubernetes與CRI 99
4.1.1 Kubernetes概述 99
4.1.2 CRI與containerd在Kubernetes生態(tài)中的演進(jìn) 101
4.1.3 CRI概述 104
4.1.4 幾種CRI實現(xiàn)及其概述 110
4.2 containerd與CRI Plugin 115
4.2.1 containerd中的CRI Plugin 115
4.2.2 CRI Plugin中的重要配置 117
4.2.3 CRI Plugin中的配置項全解 130
4.3 crictl的使用 138
4.3.1 crictl概述 138
4.3.2 crictl的安裝和配置 139
4.3.3 crictl使用說明 142
第5章 containerd與容器網(wǎng)絡(luò) 153
5.1 容器網(wǎng)絡(luò)接口 153
5.1.1 CNI概述 153
5.1.2 CNI配置文件的格式 155
5.1.3 容器運行時對CNI插件的調(diào)用 157
5.1.4 CNI插件的執(zhí)行流程 160
5.1.5 CNI插件的委托調(diào)用 166
5.1.6 CNI插件接口的輸出格式 167
5.1.7 手動配置容器網(wǎng)絡(luò) 169
5.2 CNI插件介紹 181
5.2.1 main類插件 182
5.2.2 ipam類插件 197
5.2.3 meta類插件 203
5.3 containerd中CNI的使用 209
5.3.1 containerd中CNI的安裝與部署 209
5.3.2 nerdctl使用CNI 210
5.3.3 CRI使用CNI 214
5.3.4 ctr使用CNI 215
第6章 containerd與容器存儲 216
6.1 containerd中的數(shù)據(jù)存儲 216
6.1.1 理解容器鏡像 216
6.1.2 containerd中的存儲目錄 219
6.1.3 containerd中的鏡像存儲 222
6.1.4 containerd中的content 223
6.1.5 containerd中的snapshot 230
6.2 containerd鏡像存儲插件
snapshotter 234
6.2.1 Docker中的鏡像存儲管理
graphdriver 235
6.2.2 graphdriver與snapshotter 237
6.2.3 snapshotter概述 238
6.2.4 containerd中如何使用snapshotter 243
6.3 containerd支持的snapshotter 246
6.3.1 native snapshotter 246
6.3.2 overlayfs snapshotter 250
6.3.3 devmapper snapshotter 258
第7章 containerd核心組件解析 272
7.1 containerd架構(gòu)總覽 272
7.2 containerd API和Core 274
7.2.1 GRPC API 275
7.2.2 Services 289
7.2.3 Metadata 290
7.3 containerd Backend 293
7.3.1 containerd中的proxy plugins 294
7.3.2 containerd中的Runtime和shim 297
7.3.3 containerd shim規(guī)范 300
7.3.4 shim工作流程解析 306
7.4 containerd與NRI 309
7.4.1 NRI概述 310
7.4.2 NRI插件原理 311
7.4.3 containerd中啟用NRI插件 319
7.4.4 containerd NRI插件示例 320
7.4.5 NRI插件的應(yīng)用 322
第8章 containerd生產(chǎn)與實踐 323
8.1 containerd監(jiān)控實踐 323
8.1.1 安裝Prometheus 323
8.1.2 Prometheus上containerd的指標(biāo)
采集配置 326
8.1.3 Grafana監(jiān)控配置 330
8.1.4 配置containerd面板 330
8.2 基于containerd開發(fā)自己的
容器客戶端 332
8.2.1 初始化Client 333
8.2.2 拉取鏡像 334
8.2.3 創(chuàng)建OCI Spec 334
8.2.4 創(chuàng)建task 334
8.2.5 啟動task 335
8.2.6 停止task 335
8.2.7 運行示例 336
8.3 開發(fā)自己的NRI插件 337
8.3.1 插件定義與接口實現(xiàn) 337
8.3.2 插件實例化與啟動 339
8.3.3 插件的運行演示 339