【本書特色】
• 雲端原生的價值與容器執行時期的關係。
• Docker與Kubernetes的發展歷史介紹。
• 容器技術發展史及其依賴的Linux基礎。
• containerd的安裝與部署及CLI工具操作。
• Kubernetes中的CRI機制及containerd中的CRI Plugin架構。
• containerd中的CNI規範與網路外掛程式。
• containerd透過snapshotter管理容器鏡像的方法。
• containerd的核心元件架構與各個模組剖析。
本書共分為八章,第一章講解雲端原生與容器執行時期,介紹什麼是雲端原生,探討其價值以及它與容器執行時期的關係,了解Docker與Kubernetes及containerd容器技術的發展歷史。
第二章深入探討容器執行時期的概念,從容器技術及介紹容器,容器所依賴的Linux基礎,當前的容器執行時期規範等。
第三章則專注於如何使用containerd,內容涵蓋containerd的安裝和部署,以及如何透過ctr和nerdctl兩種CLI工具操作containerd。
第四章講解containerd與CRI的關係,介紹Kubernetes中的CRI機制及其演進,containerd中的CRI Plugin架構和設定,以及CRI使用者端工具crictl的使用方法。
第五章主要講解containerd中的容器網路,介紹CNI規範、常見的CNI網路外掛程式,以及如何在containerd中指定容器網路建立容器等。
第六章介紹containerd和容器儲存,詳細說明containerd是如何透過snapshotter管理容器鏡像的。
第七章對containerd的核心元件進行剖析,根據containerd的架構講解組成containerd的各個模組,如API、Core以及Backend層的多個模組。第八章探討containerd在生產與實踐中的一些操作,包括如何設定containerd的監控,如何基於containerd做延伸開發等。 作者
趙吉壯
碩士畢業於浙江大學控制科學與工程學院,字節跳動火山引擎雲計算架構師,Kubernetes、Knative等開源社區成員。具備多年雲原生領域架構設計與研發經驗,主導火山引擎邊緣容器完成從0到1的建設。專注於Kubernetes、Serverless、容器等技術的研究,譯作有《Knative最佳實踐》和《Knative快速入門與實踐》等書籍。
張明月
新華三資深網路技術專家,多年企業網實踐經驗,對數據中心網路、園區網路、傳統二三層交換機、數據傳輸設備,從管理面到協議控制面,都有著深刻的理解。
目錄
CHAPTER 1 雲端原生與容器執行時期
1.1 雲端原生概述
1.1.1 雲端原生的定義
1.1.2 雲端原生應用的價值
1.1.3 雲端原生應用與傳統應用對比
1.2 雲端原生技術堆疊與容器執行時期
1.2.1 雲端原生技術堆疊
1.2.2 容器執行時期
1.3 Docker 與Kubernetes 的發展史
1.3.1 Docker 的發展歷史及與容器世界的連結
1.3.2 Docker 架構的發展
1.4 containerd 概述
CHAPTER 2 初識容器執行時期
2.1 容器技術的發展史
2.2 容器Linux 基礎
2.2.1 容器是如何執行的
2.2.2 namespace
2.2.3 Cgroups
2.2.4 chroot 和pivot_root
2.3 容器執行時期概述
2.3.1 什麼是容器執行時期
2.3.2 OCI 規範
2.3.3 低級容器執行時期
2.3.4 高級容器執行時期
CHAPTER 3 使用containerd
3.1 containerd 的安裝與部署
3.1.1 containerd 的安裝
3.1.2 設定containerd.service
3.2 ctr 的使用
3.2.1 ctr 的安裝
3.2.2 namespace
3.2.3 鏡像操作
3.2.4 容器操作
3.3 nerdctl 的使用
3.3.1 nerdctl 的設計初衷
3.3.2 安裝和部署nerdctl
3.3.3 nerdctl 的命令行使用
3.3.4 執行容器
3.3.5 建構鏡像
CHAPTER 4 containerd 與雲端原生生態
4.1 Kubernetes 與CRI
4.1.1 Kubernetes 概述
4.1.2 CRI 與containerd 在Kubernetes 生態中的演進
4.1.3 CRI 概述
4.1.4 幾種CRI 實現及其概述
4.2 containerd 與CRI Plugin
4.2.1 containerd 中的CRI Plugin
4.2.2 CRI Plugin 中的重要設定
4.2.3 CRI Plugin 中的設定項全解
4.3 crictl 的使用
4.3.1 crictl 概述
4.3.2 crictl 的安裝和設定
4.3.3 crictl 使用說明
CHAPTER 5 containerd 與容器網路
5.1 容器網路介面
5.1.1 CNI 概述
5.1.2 CNI 設定檔的格式
5.1.3 容器執行時期對CNI 外掛程式的呼叫
5.1.4 CNI 外掛程式的執行流程
5.1.5 CNI 外掛程式的委託呼叫
5.1.6 CNI 外掛程式介面的輸出格式
5.1.7 手動設定容器網路
5.2 CNI 外掛程式介紹
5.2.1 main 類外掛程式
5.2.2 ipam 類外掛程式
5.2.3 meta 類外掛程式
5.3 containerd 中CNI 的使用
5.3.1 containerd 中CNI 的安裝與部署
5.3.2 nerdctl 使用CNI
5.3.3 CRI 使用CNI
5.3.4 ctr 使用CNI
CHAPTER 6 containerd 與容器儲存
6.1 containerd 中的資料儲存
6.1.1 理解容器鏡像
6.1.2 containerd 中的儲存目錄
6.1.3 containerd 中的鏡像儲存
6.1.4 containerd 中的content
6.1.5 containerd 中的snapshot
6.2 containerd 鏡像儲存外掛程式snapshotter
6.2.1 Docker 中的鏡像儲存管理graphdriver
6.2.2 graphdriver 與snapshotter
6.2.3 snapshotter 概述
6.2.4 containerd 中如何使用snapshotter
6.3 containerd 支援的snapshotter
6.3.1 native snapshotter
6.3.2 overlayfs snapshotter
6.3.3 devmapper snapshotter
CHAPTER 7 containerd 核心元件解析
7.1 containerd 架構總覽
7.2 containerd API 和Core
7.2.1 GRPC API
7.2.2 Services
7.2.3 Metadata
7.3 containerd Backend
7.3.1 containerd 中的proxy plugins
7.3.2 containerd 中的Runtime 和shim
7.3.3 containerd shim 規範
7.3.4 shim 工作流程解析
7.4 containerd 與NRI
7.4.1 NRI 概述
7.4.2 NRI 外掛程式原理
7.4.3 containerd 中啟用NRI 外掛程式
7.4.4 containerd NRI 外掛程式範例
7.4.5 NRI 外掛程式的應用
CHAPTER 8 containerd 生產與實踐
8.1 containerd 監控實踐
8.1.1 安裝Prometheus
8.1.2 Prometheus 上containerd 的指標擷取設定
8.1.3 Grafana 監控設定
8.1.4 設定containerd 面板
8.2 基於containerd 開發自己的容器使用者端
8.2.1 初始化Client
8.2.2 拉取鏡像
8.2.3 建立OCI Spec
8.2.4 建立task
8.2.5 啟動task
8.2.6 停止task
8.2.7 執行範例
8.3 開發自己的NRI 外掛程式
8.3.1 外掛程式定義與介面實現
8.3.2 外掛程式實例化與啟動
8.3.3 外掛程式的執行演示
序/導讀
前言
創作背景
近幾年,隨著Kubernetes 和容器技術的崛起,雲端原生已成為當下熱門的技術話題。而Kubernetes 也毫無疑問地成為容器編排領域的事實標準。容器執行時期作為Kubernetes 執行容器的關鍵元件,承擔著管理處理程序的使命。起初Kubernetes 支援的容器執行時期是Docker,Docker client 透過程式內嵌的方式整合在kubelet 中。之後Kubernetes 重新設計了CRI 標準,使得各種容器執行時期可以透過CRI 協定連線Kubernetes。而之前透過超強程式開發形式嵌入kubelet 中的Docker client,則逐漸遷移到CRI 標準下(dockershim),並在Kubernetes 1.24 版本中被徹底移除。
CRI 支援的容器執行時期有很多,其中containerd 作為從Docker 專案中分離出來的專案,由於經歷了Docker 多年生產環境的磨煉,相比其他CRI 執行時期更加穩固、成熟。正如containerd 官網所言,「containerd 是一個工業級標準的容器執行時期,它強調簡單性、穩固性和可攜性」。
Docker 作為老牌的容器執行時期,有很多相關的書籍和資料對其介紹,而containerd 作為一個新興的容器執行時期,截至筆者著書之日,依然沒有系統介紹它的書籍。作為一名雲端原生以及容器技術的忠實粉絲,筆者很早就接觸到了containerd 專案,並見證了containerd 專案的發展,為containerd 專案取得的成就感到驕傲,也對containerd 專案充滿了信心。因此,希望透過這本書,更多的人可以了解containerd,體驗containerd 帶來的價值。
目標讀者
本書的目標讀者包括:
• 雲端原生架構師。
• 容器技術架構師。
• 研發工程師。
• 運行維護工程師。
• 雲端運算和容器技術的同好。
本書內容
本書作為一本系統介紹雲端原生容器執行時期containerd 的書,將透過深入淺出的方式一步步介紹containerd 的發展歷史、依賴的技術背景、技術架構和原理等。
本書內容共分8 章,每章的基礎知識如下。
• 第1 章:講解雲端原生與容器執行時期,介紹什麼是雲端原生,雲端原生有什麼價值,雲端原生與容器執行時期有什麼關係,以及Docker 與Kubernetes 的發展歷史等,帶讀者了解containerd 容器技術的發展與歷史。
• 第2 章:講解容器執行時期的概念,從容器技術及其發展歷史出發,為讀者介紹容器的發展史,容器所依賴的Linux 基礎,容器執行時期以及當前的容器執行時期規範等。
• 第3 章:講解如何使用containerd,內容包括containerd 的安裝和部署,以及如何透過ctr 和nerdctl 兩種cli 工具操作containerd。
• 第4 章:講解containerd 與CRI,內容包括Kubernetes 中的CRI 機制及其演進、containerd 中的CRI Plugin 架構和設定,以及CRI 使用者端工具crictl 的使用等。
• 第5 章:講解containerd 中的容器網路,主要從CNI 規範、常見的CNI網路外掛程式,以及如何在containerd 中指定容器網路建立容器等方面展開介紹。
• 第6 章:講解containerd 和容器儲存,重點介紹containerd 是如何透過snapshotter 管理容器鏡像的。
• 第7 章:講解containerd 的核心元件,對containerd 的架構進行剖析,根據containerd 架構講解組成containerd 的各個模組,如API、Core 以及Backend 層的多個模組。
• 第8 章:講解containerd 生產與實踐中的一些操作,如如何設定containerd的監控,如何基於containerd 做延伸開發等。
勘誤和支援
由於筆者水準有限,書中難免會有疏漏和不妥之處,懇請讀者們批評指正。
致謝
本書從構思、形成初稿,直到出版問世,獲得了許多人的幫助。
首先要感謝的是我的妻子對我的支援,使我有足夠的時間投入本書的寫作中,並在寫作的過程中給了我很大的鼓勵和支援。
本書的大量內容來源於我所參與的專案實踐。諸多業務合作夥伴在使用我們的容器平臺的過程中向我們提出了許多富有挑戰的問題,是他們孜孜不倦的追求,深化了我對容器技術、containerd 的理解,進而豐富了本書的內容。對此,向曾經一起合作的團隊成員表示感謝。
最後,衷心感謝清華大學出版社王秋陽老師對本書進行細緻的審閱和策劃,讓本書的架構更加完備,內容更加完整,並最終得以順利出版。
筆者