Container

目錄

一、Containerd 概述

1. 什么是 Containerd

主要特點和功能:

2. Containerd 的起源與背景

二、Containerd 架構

1. 架構概述

2. 核心組件解析

(1)Storage(存儲)

(2)Metadata(元數據)

(3)Runtime(運行時)

三、安裝配置 Containerd

1. 安裝 Containerd

2. 配置 Containerd

(1)生成配置文件

(2)配置鏡像加速

(3)啟動服務

四、Containerd 基本操作

1. 鏡像類操作

(1)拉取鏡像

(2)查看鏡像

(3)檢測本地鏡像

(4)重新打標簽

(5)刪除鏡像

(6)鏡像掛載到主機目錄

(7)鏡像從主機目錄卸載

(8)鏡像導出

(9)鏡像導入

2. 容器類操作

(1)創建容器

(2)列出容器

(3)查看容器詳細信息

(4)刪除容器

3. 任務類操作

(1)啟動容器

(2)查看容器

(3)進入容器

(4)暫停容器

(5)恢復容器

(6)殺死容器

(7)刪除任務

(8)刪除容器

(9)獲取容器資源使用情況0

(10)查看容器進程在宿主機的 PID

4. 其他操作

(1)插件

(2)命名空間

五、總結

六、Containerd 插件機制詳解

1. 插件體系結構概述

2. 常見插件類型及功能

(1)Shim 插件

(2)Snapshotter 插件

(3)Task 插件

(4)Image 插件

(5)Content Store 插件

3. 插件管理命令實踐

(1)查看系統已加載插件

(2)配置 Snapshotter 插件

(3)自定義插件加載

七、Linux 命名空間在 Containerd 中的應用

1. 命名空間隔離機制

2. 主要命名空間類型及作用

(1)PID 命名空間

(2)Network 命名空間

(3)Mount 命名空間

(4)UTS 命名空間

(5)IPC 命名空間

(6)User 命名空間

3. 命名空間操作實踐

(1)查看系統命名空間

(2)創建自定義命名空間

(3)在指定命名空間操作容器

(4)命名空間資源隔離驗證

八、Containerd 與 Kubernetes 集成

1. 集成架構概述

2. 集成配置步驟

(1)配置 CRI 插件

(2)配置 Kubelet 使用 Containerd

(3)驗證集成狀態

3. CRI 接口與 Containerd 的映射關系

九、Containerd 安全機制深度解析

1. 容器隔離增強措施

(1)Seccomp 配置

(2)AppArmor/SELinux 支持

2. 資源限制與監控

(1)CPU 和內存限制

(2)PIDS 限制

3. 安全審計與日志

(1)事件日志收集

(2)審計日志配置

十、Containerd 性能優化實踐

1. 存儲性能優化

(1)選擇高效 Snapshotter

(2)啟用塊設備快照

2. 網絡性能優化

(1)配置高性能網絡插件

(2)啟用 TCP 參數優化

3. 系統參數調優

(1)內核參數優化

(2)Cgroup v2 配置

十一、Containerd 故障排查與維護

1. 常見問題診斷

(1)Containerd 服務啟動失敗

(2)鏡像拉取失敗

(3)容器啟動失敗

2. 性能問題排查

(1)CPU 性能瓶頸分析

(2)內存泄漏排查

(3)磁盤 I/O 性能問題

3. 日志收集與分析

(1)Containerd 服務日志

(2)容器運行日志

4. 版本升級與回滾

(1)升級 Containerd

(2)回滾 Containerd 版本

十二、Containerd 高級應用場景

1. 多架構容器部署

(1)構建多平臺鏡像

(2)跨架構部署容器

2. 容器鏡像分層優化

(1)分析鏡像分層

(2)優化鏡像分層

3. 容器持久化存儲

(1)使用快照管理持久化數據

(2)配置持久化存儲卷

十三、Containerd 與其他容器技術對比

1. Containerd vs Docker

(1)架構差異

(2)功能對比

(3)遷移指導

2. Containerd vs CRI-O

(1)設計目標

(2)性能對比

(3)場景選擇

十四、Containerd 生態工具鏈

1. 鏡像管理工具

(1)Skopeo

(2)Dive

2. 容器運行時工具

(1)CRI-tools

(2)nerdctl

3. 監控與管理工具

(1)Prometheus + ctr metrics

(2)Grafana 儀表盤


一、Containerd 概述

1. 什么是 Containerd

Containerd(Container Daemon)是一個開源的容器運行時,提供了標準化的方式來管理容器的生命周期。它最初由 Docker 開發團隊創建,后來成為 CNCF(云原生計算基金會)的孵化項目。

主要特點和功能:
  • 容器生命周期管理:涵蓋容器的創建、運行、暫停、恢復、停止和銷毀等操作。
  • 標準化接口:提供標準化的容器運行時接口,可與 Kubernetes、Docker Compose 等多種容器編排系統和工具集成。
  • 鏡像管理:支持容器鏡像的拉取、推送、保存和加載等操作,遵循 OCI(Open Container Initiative)規范。
  • 插件體系結構:具備可擴展的插件體系結構,允許通過插件擴展功能,如存儲驅動、網絡插件等。
  • 跨平臺支持:可在不同操作系統上運行,提供跨平臺支持。
  • 與 Kubernetes 集成:作為 Kubernetes 的默認容器運行時,與 Kubernetes 緊密集成。
  • 安全性和隔離:實現嚴格的容器隔離和安全性措施,確保容器之間及對主機系統的安全。

2. Containerd 的起源與背景

Containerd 的起源可追溯到 Docker 項目。隨著 Docker 的發展,其架構變得復雜,包含鏡像構建、服務編排等眾多功能。為了更好地組織和管理這些功能,Docker 團隊決定將 Docker 引擎拆分成多個組件,Containerd 就是其中關鍵的組件,被定位為 Docker 的核心容器運行時。

之后,Docker 團隊將 Containerd 的代碼捐贈給 CNCF,使其成為 CNCF 的孵化項目。Containerd 的設計遵循 OCI 規范,可與符合 OCI 規范的其他容器工具和運行時互操作,不僅服務于 Docker 生態系統,還作為獨立的容器運行時,與多個容器編排系統和工具集成。

二、Containerd 架構

1. 架構概述

Containerd 采用 C/S 架構,服務端通過 Unix Domain Socket 暴露低層的 gRPC API,客戶端通過這些 API 管理節點上的容器。每個 Containerd 只負責一臺機器,承擔拉取鏡像、容器操作(啟動、停止等)、網絡和存儲等任務,具體運行容器由 runc 負責。

為了實現解耦,Containerd 將系統劃分為不同組件,每個組件由一個或多個模塊協作完成,這些模塊以插件形式集成到 Containerd 中,體現了模塊化和可擴展性的設計理念。

2. 核心組件解析

Containerd 組件主要分為 Storage、Metadata 和 Runtime 三個方面:

(1)Storage(存儲)
  • Content(內容):存儲容器鏡像的實際數據,包括文件系統層和元數據,用于創建和管理容器的基礎文件系統。
  • Snapshot(快照):存儲容器的快照數據,每個容器可以有一個或多個快照,實現相同文件系統層的共享,提高效率。
  • Diff(差異):存儲容器文件系統層之間的差異,當容器運行時修改文件系統時,在已有文件系統層上創建差異層保存變更。
(2)Metadata(元數據)
  • Images(鏡像):存儲容器鏡像的元數據,如鏡像標簽、大小、創建時間等,支持對鏡像的管理和操作。
  • Containers(容器):有效管理容器的生命周期。
(3)Runtime(運行時)
  • Tasks(任務):包含容器內的進程組,每個容器運行時都有關聯的 Task,負責管理容器內的所有進程,與 Shim 一起維護容器狀態。
  • Events(事件):記錄容器的各種事件,如創建、啟動、停止等,用于監控和日志記錄。

三、安裝配置 Containerd

1. 安裝 Containerd

# Step2: 添加軟件源信息
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo# 列出可用版本
yum list containerd.io --showduplicates# 安裝containerd
yum -y install containerd.io

2. 配置 Containerd

(1)生成配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 或
containerd config default > /etc/containerd/config.toml
(2)配置鏡像加速
vim /etc/containerd/config.toml
# 首先修改配置文件
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"  # 添加mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /etc/containerd/certs.d/registry.k8s.iocat <<EOF | sudo tee /etc/containerd/certs.d/docker.io/hosts.toml
server = "docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOFcat <<EOF | sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml
server = "registry.k8s.io"
[host."https://registry.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
(3)啟動服務
systemctl restart containerd
systemctl status containerd# 查看版本
ctr version

四、Containerd 基本操作

1. 鏡像類操作

(1)拉取鏡像
# 全平臺拉取鏡像
ctr images pull docker.io/library/nginx:latest --all-platforms --hosts-dir=/etc/containerd/certs.d/# 指定平臺拉取鏡像
ctr images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/
(2)查看鏡像
# 查看本地鏡像(默認查default命名空間)
ctr images ls# 查看crictl拉取的鏡像
ctr -n k8s.io images ls
(3)檢測本地鏡像
ctr images check
(4)重新打標簽
ctr images tag 當前鏡像名稱 新鏡像名稱
# 示例
ctr images tag docker.io/library/nginx:latest nginx:v1
ctr images tag docker.io/library/nginx:latest nginx:v2
(5)刪除鏡像
ctr images rm 鏡像名稱:[鏡像標簽]
# 示例
ctr images rm nginx:v2
(6)鏡像掛載到主機目錄
ctr images mount 鏡像 掛載點
# 示例
ctr images mount nginx:v1 /mnt
(7)鏡像從主機目錄卸載
ctr images unmount 掛載點
# 示例
ctr images unmount /mnt/
(8)鏡像導出
# 全平臺導出
ctr images export --all-platforms 文件名 鏡像名稱:[鏡像標簽]
# 示例
ctr images export --all-platforms nginx_latest.tar docker.io/library/nginx:latest# 指定平臺導出
ctr images export --platform linux/amd64 文件名 鏡像名稱:[鏡像標簽]
(9)鏡像導入
# 全平臺導入
ctr images import 文件名# 指定平臺導入
ctr images import --platform linux/amd64 文件名

2. 容器類操作

(1)創建容器
ctr containers create 鏡像名稱 容器名稱
# 示例
ctr containers create nginx:v1 nginx
(2)列出容器
ctr containers ls
(3)查看容器詳細信息
ctr containers info 容器名稱
(4)刪除容器
ctr containers rm 容器名稱

3. 任務類操作

(1)啟動容器
# 先創建容器
ctr containers create nginx:v1 nginx# 啟動任務(-d放入后臺)
ctr task start -d 容器名稱
(2)查看容器
ctr task ls
(3)進入容器
ctr task exec --exec-id 自定義ID -t 容器名稱 sh
(4)暫停容器
ctr task pause 容器名稱
(5)恢復容器
ctr task resume 容器名稱
(6)殺死容器
ctr task kill 容器名稱
(7)刪除任務
ctr task rm 容器名稱
(8)刪除容器
ctr task kill 容器名稱
ctr container rm 容器名稱
(9)獲取容器資源使用情況0
# 先創建并啟動容器
ctr containers create nginx:v1 nginx
ctr task start -d nginx# 獲取 metrics
ctr task metrics nginx
(10)查看容器進程在宿主機的 PID
# 啟動容器
ctr task start -d nginx# 查看容器進程PID
ctr task ps nginx# 在宿主機查看進程
ps -ef | grep PID

4. 其他操作

(1)插件
  • 列出當前所有插件
ctr plugins ls
(2)命名空間
  • 查看命名空間
ctr ns ls

  • 創建命名空間
ctr ns create 命名空間名稱

  • 刪除命名空間
ctr ns rm 命名空間名稱

  • 在指定命名空間操作
# 示例:在test命名空間拉取鏡像
ctr -n test images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/# 示例:在test命名空間打標簽
ctr -n test images tag docker.io/library/nginx:latest nginx:v1# 示例:在test命名空間創建容器
ctr -n test containers create nginx:v1 nginx03# 示例:在test命名空間啟動容器
ctr -n test task start -d nginx03# 示例:在test命名空間查看任務
ctr -n test task ls

五、總結

Containerd 作為云原生時代重要的容器運行時,提供了輕量級、高度可定制的容器管理能力。通過本章學習,我們深入了解了 Containerd 的基本概念、運行架構、環境部署、鏡像管理和容器管理等核心內容。

Containerd 的模塊化和插件化設計使其具有強大的可擴展性,能夠通過加載不同插件滿足多樣化的需求。同時,它與 Kubernetes 等容器編排系統緊密集成,成為現代容器化應用部署和管理的重要基礎。

六、Containerd 插件機制詳解

1. 插件體系結構概述

Containerd 采用插件化設計,這種設計使得其功能可以通過加載不同的插件進行靈活擴展。插件體系結構是 Containerd 實現高度可定制化的核心機制,允許用戶根據實際需求選擇性地配置 Containerd,以適應不同的容器運行時和編排系統需求2。

每個插件都提供標準化接口,這使得插件可以輕松替換或新增,滿足不同用戶和組織的需求。插件化設計讓 Containerd 能夠靈活適應各種使用場景,例如通過選擇不同的存儲驅動插件或網絡插件,用戶可以定制符合自身環境的容器運行時行為3。

2. 常見插件類型及功能

(1)Shim 插件
  • 功能:負責管理容器的生命周期。當容器任務啟動時,Containerd 調用 Shim 插件創建并監管容器進程,處理與容器進程的通信及監控容器狀態4。
  • 典型應用:runc shim 是最常用的 Shim 插件,用于啟動和管理基于 runc 的容器進程。
(2)Snapshotter 插件
  • 功能:處理容器的文件系統快照,定義容器文件系統結構,支持創建、管理和銷毀快照,以及在容器間共享文件系統層5。
  • 常見類型
    • overlayfs:基于 OverlayFS 文件系統的快照插件,支持分層存儲和寫時復制。
    • btrfs:基于 Btrfs 文件系統的快照插件,提供快照和克隆功能。
    • devmapper:基于 Device Mapper 的快照插件,適用于 LVM 管理的存儲設備6。
(3)Task 插件
  • 功能:管理容器中的任務(Task),任務表示容器內運行的一個或多個進程,與容器生命周期直接相關7。
  • 核心作用:協調容器進程的啟動、暫停、恢復和終止等操作。
(4)Image 插件
  • 功能:處理容器鏡像的拉取、推送、刪除等操作,定義鏡像的存儲和元數據結構8。
  • 集成點:與 OCI 鏡像規范兼容,支持從 Docker Hub、私有 Registry 等多源獲取鏡像。
(5)Content Store 插件
  • 功能:管理容器內容(如鏡像層和元數據),定義內容的存儲和檢索方式9。
  • 底層支持:為鏡像分層存儲和分發提供基礎架構支持。

3. 插件管理命令實踐

(1)查看系統已加載插件
# 列出所有插件及其狀態
ctr plugins ls

輸出示例:

TYPE                             ID                 PLATFORMS        STATUS
io.containerd.content.v1         content            -                ok
io.containerd.snapshotter.v1     aufs               linux/amd64      skip
io.containerd.snapshotter.v1     btrfs              linux/amd64      skip
io.containerd.snapshotter.v1     devmapper          linux/amd64      error
io.containerd.snapshotter.v1     native             linux/amd64      ok
io.containerd.snapshotter.v1     overlayfs          linux/amd64      ok
...(省略其他插件)
(2)配置 Snapshotter 插件
# 修改配置文件啟用overlayfs插件
vim /etc/containerd/config.toml
# 找到[snapshots]部分,設置default_snapshotter為overlayfs
[snapshots]default_snapshotter = "overlayfs"# 重啟Containerd使配置生效
systemctl restart containerd
(3)自定義插件加載
# 在配置文件中添加自定義插件路徑
vim /etc/containerd/config.toml
[plugins]# 示例:加載自定義網絡插件[plugins."io.containerd.network.v1"]plugin_dir = "/usr/lib/containerd/plugins"

七、Linux 命名空間在 Containerd 中的應用

1. 命名空間隔離機制

Containerd 利用 Linux 內核的命名空間(Namespaces)實現容器的資源隔離,這是容器技術實現隔離性的核心基礎。命名空間允許同一主機上的進程擁有不同的資源視圖,從而避免容器之間及容器與主機系統的干擾10。

2. 主要命名空間類型及作用

(1)PID 命名空間
  • 隔離范圍:進程 ID 空間。
  • 作用:使不同 PID 命名空間中的進程擁有獨立的 PID 編號,容器內的進程無法看到或影響主機及其他容器的進程11。
  • 實現原理:每個 PID 命名空間維護獨立的進程樹,容器進程在自身命名空間中顯示為 PID 1,但在主機中對應真實 PID。
(2)Network 命名空間
  • 隔離范圍:網絡棧(網絡接口、IP 地址、路由表等)。
  • 作用:每個容器擁有獨立的網絡環境,可配置私有 IP、端口等,不影響主機及其他容器的網絡配置12。
  • 典型應用:容器內運行 Web 服務時,可獨立綁定端口,與主機端口通過 NAT 或端口映射關聯。
(3)Mount 命名空間
  • 隔離范圍:文件系統掛載點。
  • 作用:使容器擁有獨立的文件系統視圖,可自定義掛載點而不影響主機及其他容器13。
  • 實現方式:Containerd 通過 Snapshotter 插件為容器創建獨立的文件系統快照,基于 Mount 命名空間隔離。
(4)UTS 命名空間
  • 隔離范圍:主機名和域名。
  • 作用:允許容器擁有獨立的主機名和域名,與主機及其他容器隔離14。
  • 配置方式:創建容器時通過參數指定--hostname即可設置 UTS 命名空間內的主機名。
(5)IPC 命名空間
  • 隔離范圍:進程間通信資源(如共享內存、信號量等)。
  • 作用:防止容器內進程與主機或其他容器共享 IPC 資源,增強安全性15。
(6)User 命名空間
  • 隔離范圍:用戶和用戶組的視圖。
  • 作用:使容器內進程以不同的用戶和組身份運行,而不影響主機實際用戶權限16。
  • 安全價值:通過 User 命名空間,容器可實現 "特權隔離",避免容器內 root 用戶直接獲取主機 root 權限。

3. 命名空間操作實踐

(1)查看系統命名空間
# 列出所有命名空間
ctr ns ls
(2)創建自定義命名空間
# 創建test命名空間
ctr ns create test# 驗證命名空間創建
ctr ns ls
(3)在指定命名空間操作容器
# 在test命名空間拉取鏡像
ctr -n test images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/# 在test命名空間創建容器
ctr -n test containers create nginx:latest nginx-test# 在test命名空間啟動容器
ctr -n test task start -d nginx-test# 查看test命名空間的任務
ctr -n test task ls
(4)命名空間資源隔離驗證
# 在默認命名空間啟動容器
ctr containers create nginx:latest nginx-default
ctr task start -d nginx-default# 在test命名空間啟動容器
ctr -n test containers create nginx:latest nginx-test
ctr task start -d nginx-test# 查看主機網絡接口(兩個容器的網絡命名空間獨立)
ip link show

八、Containerd 與 Kubernetes 集成

1. 集成架構概述

Containerd 作為 Kubernetes 的默認容器運行時,與 Kubernetes 實現了深度集成。Kubernetes 通過 CRI(容器運行時接口)與 Containerd 通信,CRI 是 Kubernetes 定義的標準化接口,用于解耦上層編排系統與底層容器運行時1。

2. 集成配置步驟

(1)配置 CRI 插件
# 修改Containerd配置文件啟用CRI
vim /etc/containerd/config.toml
# 找到[plugins."io.containerd.grpc.v1.cri"]部分,取消注釋并配置
[plugins."io.containerd.grpc.v1.cri"]disable = falsestream_server = truestream_server_address = "/run/containerd/containerd.sock"# 其他配置(如鏡像加速、PodSandbox配置等)
(2)配置 Kubelet 使用 Containerd
# 修改Kubelet配置文件
vim /etc/systemd/system/kubelet.service.d/10-containerd.conf
# 添加以下內容
[Service]
Environment="KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --image-service-endpoint=unix:///run/containerd/containerd.sock"# 重載配置并重啟Kubelet
systemctl daemon-reload
systemctl restart kubelet
(3)驗證集成狀態
# 查看Kubelet運行時信息
kubelet --version# 查看節點狀態
kubectl get nodes# 部署測試Pod
kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml
kubectl describe pod simple-pod

3. CRI 接口與 Containerd 的映射關系

CRI 定義了兩組主要接口:

  • RuntimeService:管理 Pod 和容器的生命周期,對應 Containerd 的containers-servicetasks-service插件。
  • ImageService:管理鏡像的拉取和管理,對應 Containerd 的images-service插件。

九、Containerd 安全機制深度解析

1. 容器隔離增強措施

(1)Seccomp 配置
  • 作用:通過系統調用過濾限制容器內進程可執行的系統調用,減少攻擊面。
  • 配置方式
    # 在Containerd配置文件中添加Seccomp規則
    vim /etc/containerd/config.toml
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]seccomp = trueseccomp_profile = "/path/to/seccomp/profile.json"
    
(2)AppArmor/SELinux 支持
  • AppArmor:通過配置文件限制容器內進程的文件訪問和操作權限。
    # 在Containerd配置中啟用AppArmor
    vim /etc/containerd/config.toml
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]apparmor_profile = "container-default"
    
  • SELinux:通過安全上下文標簽控制容器對主機資源的訪問。
    # 在啟動容器時指定SELinux標簽
    ctr run --security-opt label=type:container_t nginx:latest nginx-container
    

2. 資源限制與監控

(1)CPU 和內存限制
# 創建容器時指定資源限制
ctr containers create \--cpu 2 \--memory 2GB \nginx:latest nginx-resource# 啟動容器并查看資源使用
ctr task start -d nginx-resource
ctr task metrics nginx-resource
(2)PIDS 限制
# 創建容器時限制最大進程數
ctr containers create \--pids-limit 100 \nginx:latest nginx-pids# 啟動容器并驗證PIDS限制
ctr task start -d nginx-pids
# 通過壓力測試驗證進程數上限

3. 安全審計與日志

(1)事件日志收集
# 配置Containerd事件日志輸出
vim /etc/containerd/config.toml
[plugins."io.containerd.event.v1.exchange"]enable = truepath = "/var/log/containerd/events.log"# 重啟Containerd
systemctl restart containerd# 查看事件日志
tail -f /var/log/containerd/events.log
(2)審計日志配置
# 啟用審計日志(需要Containerd編譯時支持)
vim /etc/containerd/config.toml
[plugins."io.containerd.audit.v1"]enable = truepath = "/var/log/containerd/audit.log"level = "info"

十、Containerd 性能優化實踐

1. 存儲性能優化

(1)選擇高效 Snapshotter
# 配置overlayfs作為默認Snapshotter
vim /etc/containerd/config.toml
[snapshots]default_snapshotter = "overlayfs"# 或使用btrfs(需文件系統支持)
[snapshots]default_snapshotter = "btrfs"
(2)啟用塊設備快照
# 配置devmapper插件(適用于LVM場景)
vim /etc/containerd/config.toml
[plugins."io.containerd.snapshotter.v1.devmapper"]root_path = "/dev/mapper/containerd--pool"base_image_size = "10GB"block_size = "512KB"

2. 網絡性能優化

(1)配置高性能網絡插件
# 安裝并配置CNI插件(如Calico、Flannel)
# 以Calico為例:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml# 在Containerd中配置CNI插件路徑
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".cni]bin_dir = "/opt/cni/bin"conf_dir = "/etc/cni/net.d"
(2)啟用 TCP 參數優化
# 在容器運行時配置中添加TCP參數
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.network]options = ["tcp_fastopen=3", "tcp_fin_timeout=15"]

3. 系統參數調優

(1)內核參數優化
# 創建sysctl配置文件
vim /etc/sysctl.d/99-containerd-tuning.conf
# 添加以下參數
net.core.somaxconn = 65535
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 1048576
vm.swappiness = 0
vm.overcommit_memory = 1# 應用參數
sysctl -p /etc/sysctl.d/99-containerd-tuning.conf
(2)Cgroup v2 配置
# 檢查Cgroup v2支持
ls /sys/fs/cgroup/ -la | grep cgroup2# 若支持,修改grub配置啟用Cgroup v2
vim /etc/default/grub
GRUB_CMDLINE_LINUX="cgroup_no_v1=all systemd.unified_cgroup_hierarchy=1"# 重新生成grub配置并重啟
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot# 配置Containerd使用Cgroup v2
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]cgroup = "cgroup2"

十一、Containerd 故障排查與維護

1. 常見問題診斷

(1)Containerd 服務啟動失敗
# 查看服務日志
journalctl -u containerd -n 100# 檢查配置文件語法
containerd config validate /etc/containerd/config.toml# 重置配置為默認值
containerd config default > /etc/containerd/config.toml
(2)鏡像拉取失敗
# 檢查網絡連接
ping docker.io# 查看鏡像拉取日志
ctr images pull --debug docker.io/library/nginx:latest# 驗證鏡像倉庫認證
ctr registry login docker.io -u username -p password
(3)容器啟動失敗
# 查看容器創建日志
ctr containers create --debug nginx:latest nginx-debug# 檢查容器運行時日志
journalctl -u containerd | grep "runc create"# 手動運行runc調試
runc create --debug <container-id>
runc start <container-id>

2. 性能問題排查

(1)CPU 性能瓶頸分析
# 查看容器CPU使用情況
ctr task metrics <容器名稱># 使用top命令查看容器內進程
ctr task exec --exec-id top -t <容器名稱> top -c# 主機層面查看容器CPU占用
pid=$(ctr task ps <容器名稱> | awk '{print $1}')
top -p $pid
(2)內存泄漏排查
# 監控容器內存變化
watch -n 5 ctr task metrics <容器名稱> | grep memory# 查看容器內存分配詳情
ctr task exec --exec-id mem -t <容器名稱> ps aux | sort -k4 -r# 使用memory-profiler工具分析(需在容器內安裝)
ctr task exec --exec-id prof -t <容器名稱> memory-profiler --profile heap
(3)磁盤 I/O 性能問題
# 查看容器磁盤使用情況
ctr task exec --exec-id df -t <容器名稱> df -h# 監控容器磁盤I/O
pid=$(ctr task ps <容器名稱> | awk '{print $1}')
iotop -p $pid# 主機層面查看塊設備I/O
iostat -x 1

3. 日志收集與分析

(1)Containerd 服務日志
# 查看系統日志中的Containerd記錄
journalctl -u containerd --since "1h ago"# 查看Containerd運行時日志
tail -f /var/log/containerd/containerd.log# 配置日志級別(臨時修改)
ctr config set log.level debug
(2)容器運行日志
# 查看容器標準輸出日志
ctr task logs <容器名稱># 查看容器錯誤輸出日志
ctr task logs -e <容器名稱># 配置容器日志持久化(在配置文件中)
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri"][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.logging]type = "file"path = "/var/log/containers/<container-name>.log"max_size = 100 # MBmax_file = 5

4. 版本升級與回滾

(1)升級 Containerd
# 查看可用版本
yum list containerd.io --showduplicates | sort -r# 備份當前配置
cp /etc/containerd/config.toml /etc/containerd/config.toml.bak# 升級軟件包
yum update -y containerd.io# 檢查新版本兼容性
containerd config validate /etc/containerd/config.toml# 重啟服務
systemctl restart containerd# 驗證升級結果
ctr version
(2)回滾 Containerd 版本
# 查看已安裝版本
yum list installed containerd.io# 回滾到指定版本
yum downgrade containerd.io-<version># 恢復配置文件
cp /etc/containerd/config.toml.bak /etc/containerd/config.toml# 重啟服務
systemctl restart containerd

十二、Containerd 高級應用場景

1. 多架構容器部署

(1)構建多平臺鏡像
# 使用buildkit構建多架構鏡像
ctr build \--platform linux/amd64,linux/arm64 \-t docker.io/library/nginx:multiarch \.# 查看鏡像支持的平臺
ctr images inspect docker.io/library/nginx:multiarch | grep -i platforms
(2)跨架構部署容器
# 在x86_64主機上運行arm64鏡像(需QEMU支持)
# 安裝QEMU
yum install -y qemu-user-static# 注冊binfmt_misc支持
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes# 拉取并運行arm64鏡像
ctr images pull docker.io/library/nginx:arm64
ctr run --rm -t docker.io/library/nginx:arm64 nginx-arm64

2. 容器鏡像分層優化

(1)分析鏡像分層
# 查看鏡像分層結構
ctr images layers docker.io/library/nginx:latest# 使用dive工具可視化分層(需安裝)
dive docker.io/library/nginx:latest
(2)優化鏡像分層
# 使用buildkit進行分層優化
ctr build \--optimize \-t docker.io/library/nginx:optimized \.# 對比優化前后的分層數量和大小
ctr images layers docker.io/library/nginx:latest
ctr images layers docker.io/library/nginx:optimized

3. 容器持久化存儲

(1)使用快照管理持久化數據
# 創建容器數據快照
ctr snapshot create my-data-snapshot /data# 在容器中使用快照
ctr containers create \--snapshot my-data-snapshot \nginx:latest nginx-persistent# 備份快照
ctr snapshot export my-data-snapshot my-data-snapshot.tar
(2)配置持久化存儲卷
# 創建主機目錄作為數據卷
mkdir -p /data/nginx# 運行容器并掛載數據卷
ctr run \-v /data/nginx:/usr/share/nginx/html \nginx:latest nginx-data

十三、Containerd 與其他容器技術對比

1. Containerd vs Docker

(1)架構差異
  • Docker:單體架構,集成鏡像構建、容器運行、網絡管理等功能。
  • Containerd:模塊化架構,專注于容器運行時,通過插件擴展功能。
(2)功能對比
功能DockerContainerd
鏡像構建原生支持(docker build)需集成 BuildKit
服務編排內置 Compose 支持依賴 Kubernetes 等編排工具
容器網絡內置 Docker Network依賴 CNI 插件
生態系統成熟度更成熟,用戶基數大快速發展,Kubernetes 默認
(3)遷移指導
# 停止Docker服務
systemctl stop docker# 安裝Containerd
yum install -y containerd.io# 遷移Docker鏡像到Containerd
ctr images import docker-image.tar# 配置Kubernetes使用Containerd
# (參考前文Kubernetes集成部分)

2. Containerd vs CRI-O

(1)設計目標
  • Containerd:通用容器運行時,支持多編排系統,功能豐富。
  • CRI-O:專注于 Kubernetes 集成,輕量級設計,減少依賴。
(2)性能對比
  • 啟動速度:CRI-O 略快,因簡化了非 Kubernetes 相關功能。
  • 資源占用:CRI-O 內存占用更低,適合資源受限環境。
(3)場景選擇
  • 推薦 Containerd:需要支持多編排系統(如 Docker Compose、Kubernetes),或需要豐富插件擴展功能。
  • 推薦 CRI-O:純 Kubernetes 環境,追求最小化依賴和資源占用。

十四、Containerd 生態工具鏈

1. 鏡像管理工具

(1)Skopeo
  • 功能:鏡像倉庫操作,支持跨倉庫復制、鏡像檢查等。
  • 示例命令
    # 復制鏡像到另一個倉庫
    skopeo copy docker://docker.io/library/nginx:latest oci-archive:/path/nginx.tar# 檢查鏡像是否存在
    skopeo list-tags docker://docker.io/library/nginx
    
(2)Dive
  • 功能:鏡像分層可視化分析,幫助優化鏡像構建。
  • 示例命令
    dive docker.io/library/nginx:latest
    

2. 容器運行時工具

(1)CRI-tools
  • 功能:CRI 接口調試工具,用于測試 Containerd 與 Kubernetes 的集成。
  • 示例命令
    # 列出所有容器
    crictl ps# 查看容器日志
    crictl logs <container-id>
    
(2)nerdctl
  • 功能:兼容 Docker CLI 的 Containerd 命令行工具。
  • 示例命令
    # 拉取鏡像
    nerdctl pull docker.io/library/nginx:latest# 運行容器
    nerdctl run -d -p 80:80 nginx:latest
    

3. 監控與管理工具

(1)Prometheus + ctr metrics
  • 配置示例
    # Prometheus配置
    - job_name: 'containerd'static_configs:- targets: ['localhost:10255']  # Kubelet metrics端口metrics_path: /containerd.metrics
    
(2)Grafana 儀表盤
  • 導入 Containerd 專用儀表盤
    # 下載Containerd儀表盤JSON
    wget https://raw.githubusercontent.com/containerd/containerd/main/contrib/grafana/dashboard.json# 在Grafana中導入儀表盤
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86379.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#設計模式-Builder-生成器-對象創建型模式

using System; using System.Collections.Generic;namespace A4_Builder_生成器_對象創建型模式 {// 產品類&#xff1a;最終要構建的復雜對象public class Computer{public string CPU { get; set; }public string GPU { get; set; }public int RAM { get; set; } // GBpublic…

C語言堆內存管理詳解:malloc和free的使用指南

在C語言程序設計中&#xff0c;內存管理是一個重要的話題。本文將詳細介紹堆內存的分配和釋放&#xff0c;重點講解malloc和free函數的使用方法&#xff0c;并通過實例說明相關注意事項。 一、堆內存與棧內存的區別 在C語言中&#xff0c;內存主要分為堆內存和棧內存&#xf…

探索 Oracle Database 23ai 中的 SQL 功能

探索 Oracle Database 23ai 中的 SQL 功能 介紹目標前提條件 功能 1&#xff1a;使用 FROM 子句功能 2&#xff1a;使用 BOOLEAN 數據類型功能 3&#xff1a;使用 IF NOT EXISTS DDL 子句功能 4&#xff1a;使用 INSERT 插入多行功能 5&#xff1a;使用新的 VALUE 構造函數功能…

SQL(6)

! 會排除null數據 select name from Customer where referee_id ! 2 or referee_id is null; 交叉聯結 交叉連接&#xff08;CROSS JOIN&#xff09;-CSDN博客 197. 上升的溫度 select a.id from weather as a cross join weather as b on datediff(a.recordDate ,b.recordD…

【Java面試題】cookie、session、jwt/token的異同

以下是對Cookie、Session、Token與JWT的異同的完善分析&#xff0c;結合技術原理、安全性和應用場景進行系統性對比&#xff1a; &#x1f50d; 一、核心概念與工作流程 機制定義工作流程核心特點Cookie客戶端存儲的小型文本數據1. 服務器通過Set-Cookie響應頭下發數據2. 瀏覽…

數字經濟時代科技創業的巨大潛力

2025年3月&#xff0c;42歲的字節跳動創始人張一鳴以655億美元身家成為中國新首富。這位"80后"企業家白手起家的故事&#xff0c;展現了數字經濟時代科技創業的巨大潛力。本文將帶您了解張一鳴的成功秘訣&#xff0c;分析網絡安全行業的最新趨勢&#xff0c;并為計算…

深入剖析Nginx架構及其不同使用場景下的配置

一、Nginx 整體架構概覽 1. Nginx簡介 Nginx 是采用 C 語言 編寫的高性能 Web 服務器、反向代理服務器及郵件代理服務器&#xff0c;特點是&#xff1a;高并發、高可用、低內存占用、模塊化設計。 架構核心理念&#xff1a; Master-Worker 多進程模型 事件驅動&#xff08;…

單元測試詳解

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 對于軟件測試&#xff0c;我們先按照開發階段來進行劃分&#xff0c;將軟件測試分為單元測試、集成測試、系統測試、驗收測試&#xff0c;下面我們來聊聊單元測試。…

四款好用的Windows虛擬打印機,文檔轉PDF

1&#xff0c;Microsoft Print To PDF 2&#xff0c;Foxit Reader PDF Printer 3&#xff0c;Adobe PDF 4&#xff0c;clawPDF 參考文檔&#xff1a; https://mp.weixin.qq.com/s/_mt4J2RwhqQE36DRAvc-Rg

《map和set的使用介紹》

引言&#xff1a; 上次我們學習了第一個高階數據結構—二叉搜索樹&#xff0c;趁熱打鐵&#xff0c;今天我們就再來學習兩個數據結構—map和set。 一&#xff1a;序列式容器和關聯式容器 前面我們已經接觸過STL中的部分容器如&#xff1a;string、vector、list、deque、arra…

PostgreSQL(二十六)分區表管理

目錄 一、分區表特點 1、概念&#xff1a; 2、好處&#xff1a; 3、特點&#xff1a; 二、范圍分區介紹 1、簡介 2、范圍分區實驗&#xff1a; 三、list分區介紹 1、簡介 2、list分區表實驗 四、hash分區介紹 1、簡介 2、hash分區表實驗 五、混合分區介紹 1、簡…

概率論中的生日問題,違背直覺?如何計算? 以及從人性金融的角度分析如何違背直覺的?

一、生日問題的概率計算&#xff1a;為何23人就有50%概率撞生日&#xff1f; 1. 問題背景與直覺矛盾 生日問題指&#xff1a;在n個人中&#xff0c;至少有兩人生日相同的概率超過50%時&#xff0c;n的最小值是多少&#xff1f; 直覺判斷&#xff1a;因一年有365天&#xff0c…

Qt for WebAssembly官方說明文檔

鏈接 Qt for WebAssembly | Qt 5.15

前端自主實現將vue頁面轉為pdf文件下載

1.vue 轉 PDF 在 Vue 項目中將 HTML 頁面轉換為 PDF 文件是一個常見需求&#xff0c;特別是在需要生成報告或打印頁面時。本文將介紹如何使用 html2canvas 和 jspdf 庫實現這一功能。 2.安裝依賴 首先&#xff0c;我們需要安裝兩個庫&#xff1a;html2canvas 和 jspdf 。可以…

TCP 堅持定時器詳解:原理、配置與最佳實踐?

一、TCP 堅持定時器基礎原理 1.1 堅持定時器的設計目的 TCP 堅持定時器 (TCP Persist Timer) 是 TCP 協議中用于處理接收窗口為零情況的重要機制&#xff0c;其核心設計目的是防止 TCP 連接在窗口更新 ACK 丟失時陷入死鎖狀態。當 TCP 連接的接收方通告一個窗口大小為 0 的 A…

大廠測開實習和小廠開發實習怎么選

先說選擇&#xff0c;這個可以百分百確定選大廠&#xff0c;title很重要。 要想弄清楚那個選擇對自己最有利&#xff0c;可以思考下實習的意義是什么&#xff1f; 實習無非就是給簡歷加分&#xff0c;拿到好offer&#xff0c;高薪offer。 那這就需要思考&#xff0c;簡歷怎么讓…

Unity中的urp和普通的標準渲染管線區別在哪

Unity中的URP&#xff08;Universal Render Pipeline&#xff09;與內置標準渲染管線&#xff08;Built-in Render Pipeline&#xff09;的區別深刻反映了Unity渲染技術的演進方向。以下從架構、性能、功能、工作流等多個維度進行深度分析&#xff1a; 1. 底層架構與設計哲學 標…

Vscode 編寫Markdown支持 plantuml書寫

1&#xff1a; 下載PlantUml 插件&#xff1a; 2&#xff1a; 安裝java https://www.oracle.com/java/technologies/downloads/ 3&#xff1a; 安裝Graphviz https://graphviz.org/download/ 4&#xff1a; 下載plantuml.jar https://plantuml.com/zh/download 5&…

設計模式(C++/Qt)-工廠模式

在軟件開發中&#xff0c;對象創建是基礎但關鍵的任務——工廠模式提供了一種優雅的解決方案&#xff0c;讓您的代碼擺脫硬編碼的依賴關系 一、為什么需要工廠模式&#xff1f; 在C/Qt開發中&#xff0c;我們經常面臨這樣的困境&#xff1a; 對象創建邏輯分散在代碼各處新增…

Pydantic 模型

本文將詳細介紹 Pydantic 模型 和 BaseModel 的核心概念&#xff0c;并通過實際代碼示例如何從零開始編寫自己的 Pydantic 模型。 1. Pydantic 是什么&#xff1f; Pydantic 是一個 Python 庫&#xff0c;主要用于&#xff1a; 數據驗證&#xff1a;確保輸入數據符合預期的類…