Featured image of post Containerd命令行管理工具

Containerd命令行管理工具

Containerd 命令行管理工具

Kubernetes 从 Docker 转向 containerd 的原因

架构层面的原因

kubelet 启动一个容器的流程:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
kubelet
(调用 CRI 接口)
dockershim (K8s 维护的 CRI 转换层)
(调用 Docker Engine API)
Docker Engine
(调用 containerd API)
containerd
(调用 OCI 接口)
runc (OCI runtime)
 └─> 真正创建 Linux 容器 (namespace, cgroups, rootfs...)
  • Docker Engine 是一个 完整平台(构建镜像、管理网络、Volume、Swarm 等),这些对 K8s 来说都是多余的。
  • dockershim 只是为了把 CRI(K8s 语言)翻译成 Docker API(Docker 语言)。
  • 实际执行容器的,依然是 containerd + runc。

当 kubelet 直接使用 containerd 时,调用链简化为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 kubelet
(调用 CRI 接口)
containerd (内置 CRI 插件)
(调用 OCI 接口)
runc (OCI runtime)
  └─> 真正创建 Linux 容器 (namespace, cgroups, rootfs...)

减少维护成本

kubernetes 从 1.24 开始,默认使用 containerd 作为容器运行时。不再去维护中间dockershim

性能提升

少一层调用,性能和稳定性更好。

ctr – Containerd自带的命令行管理工具

1
2
# 列出所有命名空间
sudo ctr namespaces list
1
2
# 镜像相关命令
sudo  ctr -n=k8s.io images -h

ctr 上传、拉取镜像时不支持登陆认证,只能通过–user携带用户密码操作

1
2
3
sudo ctr -n=k8s.io images pull \
  --user <username>:<password> \
  myregistry.example.com/myrepo/nginx:latest

nerdctl (最接近docker CLI)

基本和docker CLI命令一致,只是在命令前添加了nerdctl前缀

安装nerdctl

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
set -e

VERSION=${VERSION:-2.2.0}

# 自动识别架构
ARCH=$(uname -m)
if [[ "$ARCH" == "x86_64" ]]; then
    ARCH="amd64"
elif [[ "$ARCH" == "aarch64" ]]; then
    ARCH="arm64"
else
    echo "Unsupported architecture: $ARCH"
    exit 1
fi

DOWNLOAD_URL="https://github.com/containerd/nerdctl/releases/download/v${VERSION}/nerdctl-${VERSION}-linux-${ARCH}.tar.gz"

echo "Downloading nerdctl v$VERSION for $ARCH"
wget  "$DOWNLOAD_URL" -O nerdctl.tgz

echo "Extracting..."
tar -xzf nerdctl.tgz

# 解压后会得到 nerdctl、containerd、runc 等二进制
# 一般 nerdctl 位于当前目录的 nerdctl
TARGET_DIR="/usr/local/bin"

echo "Moving binaries to $TARGET_DIR (require sudo)"
sudo mv nerdctl "${TARGET_DIR}/"


echo "Cleaning up…"
rm -f nerdctl.tgz

echo "🎉 nerdctl installation completed!"
echo "Version check:"
sudo ${TARGET_DIR}/nerdctl --version

To list local Kubernetes containers:

1
nerdctl --namespace k8s.io ps -a

Powered by Hugo | Theme by Stack
Deployed with GitHub Actions 🚀
使用 Hugo 构建
主题 StackJimmy 设计