超越預期:Containerd 如何成為 Kubernetes 的首選容器執行時

kubesphere發表於2024-06-06
> 作者:尹珉,KubeSphere Ambassado,rKubeSphere Contributor,KubeSphere 社群使用者委員會杭州站站長。 

踏上 Containerd 技術之旅

容器技術已經成為現代軟體開發和部署的核心工具。透過容器,開發者可以建立輕量級、便攜的執行環境,從而簡化應用程式的開發、測試和部署流程。在容器技術的生態系統中,容器執行時扮演著至關重要的角色。本篇文章將探討低階和高階容器執行時的區別,並解釋為什麼 Kubernetes 選擇 containerd 作為其預設的容器執行時。此外,我們還將介紹三種與 containerd 相關的 CLI 工具:ctr、crictl 和 nerdctl。

containerd 架構及說明

containerd 是一個高效、可靠的開源容器執行時,它被設計為從開發到生產環境的核心容器管理解決方案。containerd 的架構主要分為三個部分:生態系統(Ecosystem)、平臺(Platform)和客戶端(Client)。每個部分在整個系統中扮演著不同的角色,協同工作以提供全面的容器管理功能。

file

生態系統(Ecosystem)

containerd 的生態系統包括一系列與其整合的工具和元件,這些工具和元件擴充套件了 containerd 的功能並增強了其適用性。

  • CRI 外掛:與 Kubernetes 緊密整合,透過實現 Container Runtime Interface (CRI),使 Kubernetes 能夠管理容器。
  • CNI 外掛:使用 Container Network Interface (CNI)外掛進行網路管理,提供容器的網路連線。
  • CSI 外掛:Container Storage Interface (CSI)外掛用於儲存管理,允許容器掛載和管理儲存卷。
  • 映象管理:支援 Docker 映象和 OCI 映象規範,提供從映象倉庫拉取、儲存和管理容器映象的能力。
  • 外掛機制:允許透過外掛擴充套件 containerd 的功能,滿足特定的需求。

平臺(Platform)

containerd 的平臺層是整個系統的核心,負責管理和排程容器執行時的所有基本操作。這個層次的主要元件包括:

  • 守護程序:containerd 守護程序負責處理所有的容器管理請求,並維護容器的生命週期。
  • gRPC API:透過 gRPC API 與外部客戶端通訊,提供標準化的介面以執行容器操作。
  • 任務管理:管理容器的建立、啟動、停止和刪除任務,確保容器按照預期執行。
  • 快照管理:使用快照(Snapshot)機制管理容器檔案系統,實現高效的儲存操作。
  • 事件監控:實時監控容器事件,提供日誌記錄和事件通知功能,便於運維人員進行故障排查和系統監控。

客戶端(Client)

containerd 的客戶端提供使用者與 containerd 平臺互動的方式。主要的客戶端工具包括:

  • ctr:containerd 自帶的命令列工具,用於直接與 containerd 進行互動。雖然功能強大,但主要用於開發和除錯場景。
  • crictl:專為 Kubernetes 設計的命令列工具,透過 CRI 介面與 containerd 進行互動,適用於 Kubernetes 叢集的運維和管理。
  • nerdctl:一個 Docker 相容的 CLI 工具,提供類似 Docker 的使用者體驗,使使用者無需重新學習即可使用 containerd 管理容器。

瞭解 OCI 標準的影響

OCI 規範的由來

開放容器倡議(Open Container Initiative,OCI)是一個旨在制定開放標準的行業組織。它由 Docker 公司於 2015 年 6 月提出,並在 Linux 基金會的支援下成立。OCI 的主要目標是透過定義標準化的容器格式和執行時,促進容器技術的互操作性和一致性。
在容器技術快速發展的過程中,不同的容器執行時和格式逐漸湧現,導致了相容性和互操作性問題。為了應對這些挑戰,OCI 提出了一套統一的標準,確保不同容器工具和平臺之間的相容性和互操作性。

OCI 規範三個核心部分

映象規範(Image Specification)
執行時規範(Runtime Specification)
分發規範(Distribution Specification)

映象規範(Image Specification)

映象規範定義了容器映象的格式和內容,確保映象可以在不同的容器執行時和平臺上相容使用。映象規範的主要內容包括:

  • 映象配置:定義映象的後設資料,如映象的建立時間、作者、版本等。
  • 檔案系統層:描述映象的檔案系統層次結構,包括基礎層和增量層。
  • 分發格式:定義映象的打包和傳輸格式,確保映象可以在不同的映象倉庫和執行時之間傳輸。

執行時規範(Runtime Specification)

執行時規範定義了容器的執行環境和行為,確保容器可以在不同的容器執行時上以一致的方式執行。執行時規範的主要內容包括:

  • 配置檔案:定義容器的配置檔案,包括容器的名稱空間、cgroups、掛載點、環境變數等。
  • 生命週期管理:描述容器的生命週期管理,包括容器的建立、啟動、停止和刪除等操作。
  • 程序管理:定義容器內程序的管理和隔離,包括程序的啟動引數、資源限制和隔離機制。

分發規範(Distribution Specification)

分發規範定義了容器映象的分發方法和協議,確保映象可以高效、安全地在不同的登錄檔和客戶端之間傳輸。分發規範的主要內容包括:

  • 內容地址:使用內容定址機制確保映象和其他內容的完整性和一致性。
  • 分層結構:定義分層映象格式,以便高效儲存和傳輸映象。
  • API 定義:提供標準的 API 介面,用於上傳、下載、查詢和管理映象。

什麼是低階和高階容器執行時

瞭解了 OCI 規範後,我們再來看看什麼是低階和高階容器執行時的區別。瞭解這些區別有助於我們更好地理解容器執行時的選擇和最佳化,確保在不同的應用場景中能夠選擇最合適的工具,從而提高系統效能和管理效率。

低階容器執行時

低階容器執行時(low-level container runtime)是指那些直接與作業系統核心互動,負責建立和管理容器程序的執行時。它們通常提供最基本的容器管理功能,例如啟動、停止和刪除容器。低階執行時的一個典型例子是 runc。
低階容器執行時的主要特點包括:

  • 輕量級:僅包含最核心的功能,減少了系統資源的消耗。
  • 高效能:由於其簡潔的設計,低階執行時通常具有更高的執行效率。
  • 穩定性和安全性:直接與核心互動,減少了中間層的複雜性,提高了系統的穩定性和安全性。

高階容器執行時

高階容器執行時(high-level container runtime)在低階執行時之上構建,提供更豐富的功能和更高層次的抽象。例如,它們可以管理容器映象、網路、儲存等方面。containerd 是一個典型的高階容器執行時。
高階容器執行時的主要特點包括:

  • 功能豐富:除了基本的容器管理功能外,還提供映象構建、網路配置、儲存管理等高階功能。
  • 易用性:高階執行時通常附帶友好的 CLI 和 API 介面,方便開發者和運維人員使用。
  • 整合性:與各類開發工具和平臺緊密整合,提供端到端的容器管理解決方案。

低階和高階執行時的區別及應用場景

低階和高階容器執行時的主要區別在於其功能的廣度和抽象層次。低階執行時更貼近系統底層,提供基本的容器管理功能,適合需要精細控制和最佳化的場景。高階執行時則提供更豐富的功能,簡化了容器管理和操作,適合開發和運維人員使用,幫助他們專注於應用程式本身,而不必關注底層的實現細節。

Kubernetes 選用 containerd 的背後考量

Kubernetes 與 containerd 的關係

Kubernetes 是一個用於自動化部署、擴充套件和管理容器化應用程式的開源平臺。在其早期版本中,Kubernetes 主要使用 Docker 作為容器執行時。然而,隨著容器生態系統的發展,Kubernetes 社群決定採用更為專用和輕量級的 containerd 作為預設的容器執行時。

containerd 的優點及其在 Kubernetes 中的應用

containerd 是一個工業級的容器執行時,專為效能和穩定性設計。它提供了核心的容器管理功能,如映象管理、容器執行和儲存管理。containerd 的設計目標是簡單、高效和與 Kubernetes 的深度整合。其主要優點包括:

  • 輕量級:containerd 是一個專注於核心功能的輕量級執行時,避免了不必要的複雜性。
  • 效能高:containerd 在啟動速度和資源使用方面表現出色,非常適合在高併發和大規模環境中使用。
  • 穩定性:containerd 經過了廣泛的測試和驗證,具有很高的可靠性和穩定性。

Kubernetes 選擇 containerd 的原因分析

Kubernetes 選擇 containerd 作為預設的容器執行時有幾個主要原因:

  1. 專注於核心功能:containerd 專注於容器管理的核心功能,避免了過多的功能堆積,保持了執行時的輕量和高效。
  2. 深度整合:containerd 與 Kubernetes 的深度整合,使得 Kubernetes 可以更加高效地管理容器和映象。
  3. 社群支援:containerd 由 CNCF(Cloud Native Computing Foundation)託管,得到了廣泛的社群支援和貢獻,確保了其長期的維護和發展。
  4. 獨立性:與 Docker 相比,containerd 更加獨立,不依賴於其他工具或平臺,減少了系統複雜性。

containerd 安裝指南

containerd 官網

https://containerd.io/

下載 containerd release 包

[root@anolis89 containerd]# wget https://github.com/containerd/containerd/releases/download/v1.7.14/containerd-1.7.14-linux-amd64.tar.gz

解壓 release 包

[root@anolis89 containerd]# tar -zxvf cri-containerd-1.7.14-linux-amd64.tar.gz -C /

生成 containerd 預設配置檔案

[root@anolis89 containerd]# mkdir /etc/containerd/
[root@anolis89 containerd]# containerd congfig default > /etc/containerd/config.toml

啟動 containerd 服務

[root@anolis89 containerd]# systemctl start containerd && systemctl enable containerd

驗證 containerd 服務

[root@anolis89 containerd]# ctr version

file

containerd CLI 工具推薦

file

ctr

  • 定義和功能: ctr 是一個用於測試和除錯 containerd 的輕量級 CLI 工具。它提供了一些基本的命令,可以用於快速驗證 containerd 的功能。
  • 使用場景及例項: ctr 主要用於開發和測試環境,例如開發者需要驗證 containerd 是否正確安裝和配置時,可以使用 ctr 執行一些基本的測試命令。
ctr version
ctr images pull docker.io/library/busybox:latest
ctr run -t --rm docker.io/library/busybox:latest busybox sh

crictl

  • 定義和功能: crictl 是一個用於與 Kubernetes CRI(Container Runtime Interface)互動的 CLI 工具。它提供了一組命令,可以用於檢查和管理透過 CRI 執行的容器和映象。
  • 使用場景及例項: crictl 主要用於 Kubernetes 環境下的容器管理。例如,管理員可以使用 crictl 檢視當前執行的容器、檢查容器日誌或執行容器操作。
crictl ps
crictl logs <container_id>
crictl exec <container_id> <command>

nerdctl(推薦)

  • 定義和功能: nerdctl 是專為 Containerd 設計的輕量級命令列工具,它的誕生旨在為那些從 Docker 轉向 Containerd 的使用者提供一個熟悉的操作介面。
  • 使用場景及例項: nerdctl 適合那些熟悉 Docker CLI 但希望使用 containerd 的使用者。例如,開發者可以使用 nerdctl 來構建和執行容器,而不需要學習全新的命令集合。

nerdctl 與 Docker 的區別:

  • 底層與上層之別: 最本質的區別在於,Docker 是一個包含了完整容器生命週期管理的平臺,包含了 Docker daemon 等多個元件。而 nerdctl 是一個純粹的命令列工具,專注於與 Containerd 互動,後者作為低層級執行時,處理容器和映象的實際操作。
  • 相容與創新: nerdctl 雖然相容 Docker 的 CLI 習慣,但並不意味著它是 Docker 的簡單複製品。它在相容基礎上引入了新功能,如延遲拉取映象(lazy-pulling)和映象加密等,這些是 Docker 本身不具備的。
  • 效能與效率: 由於直接操作 Containerd,避免了 Docker daemon 這一層的額外開銷,nerdctl 在某些場景下能提供更好的效能和資源利用率。
  • 定位差異: Docker 適合需要一站式解決方案的使用者,而 nerdctl+Containerd 組合更適合那些追求輕量、高效能及與 Kubernetes 緊密整合的環境。
nerdctl run -d --name nginx -p 80:80 nginx
nerdctl build -t myimage .
nerdctl network create mynetwork

結語與展望

containerd 作為一個輕量級、高效能和穩定的容器執行時,已經成為 Kubernetes 的首選。透過專注於核心功能和深度整合,containerd 為容器管理提供了高效的解決方案。ctr、crictl 和 nerdctl 等 CLI 工具進一步豐富了 containerd 的功能,幫助開發者和運維人員更好地管理和除錯容器。

展望未來,containerd 有望繼續在容器技術領域發揮重要作用,推動容器生態系統的發展和創新。

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章