Containerd
一、Containerd 介绍
1、安装 Containerd
方式一:下载二进制压缩包
curl -LO https://github.com/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-amd64.tar.gz tar Cxzvf /usr/local containerd-1.6.6-linux-amd64.tar.gz mkdir -p /usr/local/lib/systemd/system/ && \ curl -L https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -o /usr/local/lib/systemd/system/containerd.service && \ systemctl daemon-reload && \ systemctl enable --now containerd
方式二:使用国内源安装
以 Ubuntu 24.04.1 LTS 、阿里源为例
# 安装依赖 sudo apt update sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release # 添加 containerd GPG 密钥(阿里云镜像) curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg # 添加 containerd 仓库(使用官方源,阿里云也镜像了) echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install -y containerd.io
2、命令行工具 ctr(containerd native CLI)
1、ctr:containerd 相比于docker , 多了namespace概念
每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间
2、ctr(containerd native CLI)-
由 containerd 官方提供,随 containerd 一并安装。
-
直接调用 containerd 原生 gRPC API,不经过 CRI 层。
-
面向“单机调试、开发测试、底层排障”,与 Kubernetes 无关。
-
支持 namespace 隔离(k8s.io、moby、default 等),因此需要显式指定
-n才能看到 K8s 创建的容器/镜像。
3、使用 ctr 手动调试容器
# ========================= # containerd 镜像管理 # ========================= # 删除镜像 ctr -n k8s.io images rm k8s.gcr.io/pause:3.2 # 拉取镜像(直接落在 k8s.io 命名空间) ctr -n k8s.io images pull -k k8s.gcr.io/pause:3.2 # 推送镜像 ctr -n k8s.io images push -k k8s.gcr.io/pause:3.2 # 导出镜像到 tar 文件 ctr -n k8s.io images export pause.tar k8s.gcr.io/pause:3.2 # 从 tar 文件导入镜像 ctr -n k8s.io images import pause.tar # 从 Docker Hub 拉取镜像(默认落在 default 命名空间) ctr images pull docker.io/library/nginx:1.25 # 导入到 k8s.io 命名空间,以便 kubelet 可见 ctr -n k8s.io images tag docker.io/library/nginx:1.25 nginx:1.25 # ========================= # containerd 容器管理 # ========================= # 创建并运行容器(使用 host 网络) ctr -n k8s.io container create --net-host nginx:1.25 nginx-debug ctr -n k8s.io task start -d nginx-debug # 进入容器调试 ctr -n k8s.io task exec --exec-id shell1 -t nginx-debug sh # 停止并删除容器 ctr -n k8s.io task kill -9 nginx-debug ctr -n k8s.io container rm nginx-debug # ========================= # 注意事项 # ========================= # ctr 不支持 build 或 commit 镜像操作
3、命令行工具 crictl(CRI client CLI)
1、crictl 是为k8s使用containerd而制作的
其他非k8s的创建的 crictl是无法看到和调试的, 也就是说用ctr run 运行的容器无法使用crictl 看到
2、crictl(CRI client CLI)
-
由 Kubernetes SIG-Node 维护,二进制包名叫
cri-tools。 -
仅通过 CRI(Container Runtime Interface) 与 containerd 通信,语义和 kubelet 完全一致。
-
专为 K8s 节点运维设计,只能看到 k8s.io namespace 下的资源,且不需要也不能用
-n参数。 -
在 K8s 1.24+ Dockershim 移除后,成为节点调试的“官方标配”。
3、作为依赖会被安装
或者直接安装apt install cri-tools
# apt install -y kubeadm=1.32.* kubelet=1.32.* kubectl=1.32.* # apt-cache depends kubeadm kubeadm Depends: cri-tools
4、首次使用前必须配置端点
sudo crictl config \ --set runtime-endpoint=unix:///run/containerd/containerd.sock \ --set image-endpoint=unix:///run/containerd/containerd.sock \ --set timeout=10 \ --set debug=false
4、常见误区与注意事项
1、镜像不可见问题
用 ctr images pull 默认放在 default namespace,导致 kubelet 无法感知。
解决:拉取后执行 ctr -n k8s.io images tag/import,或直接 crictl pull。
2、ctr 运行容器 ≠ K8s Pod
ctr 创建的容器没有 sandbox、无 CNI 网络,也不会被 kubelet 管理;仅用于本地验证。
crictl 不能跨 namespace
3、若系统同时跑 Docker 与 containerd,Docker 创建的容器在 moby namespace,crictl 永远看不到。
4、版本一致性
ctr -v 显示 containerd 版本;
crictl -v 显示 cri-tools 编译时对应的 K8s 版本,不匹配时可能字段缺失。
5、nerdctl :(替代 docker cli)
自从 Containerd 发布 1.5 以后,nerdctl 工具配合 Containerd 的情况下基本已经可以替换掉 Docker 和 Docker Compose;
nerdctl 官方发布包包含两个安装版本:
- Minimal: 仅包含 nerdctl 二进制文件以及 rootless 模式下的辅助安装脚本
- Full: 看名字就能知道是个全量包,其包含了 Containerd、CNI、runc、BuildKit 等完整组件
1、nerdctl 项目地址
https://github.com/containerd/nerdctl/releases/
GitHub - containerd/nerdctl: Docker-compatible CLI for containerd, with support for Compose
2、nerdctl的下载安装
在k8s高版本中,采用Containerd 运行时,docker被舍弃,构建images将采用buildkit服务
##下载 wget https://github.com/containerd/nerdctl/releases/download/v0.11.1/nerdctl-full-0.11.1-linux-amd64.tar.gz ##解压 tar Cxzvvf /usr/local nerdctl-full-0.11.1-linux-amd64.tar.gz ## 启动 containerd 和 buildkitd systemctl enable --now containerd systemctl enable --now buildkit
二、nerdctl 运用
1、pull images
ctr image pull docker.io/cnrancher/rancher:v2.4.17-ent nerdctl pull rancher/cluster-proportional-autoscaler-amd64:1.0.0
2、查看所有的名称空间
nerdctl namespace ls
NAME CONTAINERS IMAGES VOLUMES buildkit 0 0 0 default 0 2 0 k8s.io 26 28 0
3、查看某个名称空间下的镜像
nerdctl -n k8s.io images

4、指定名称空间重新打tag
nerdctl --namespace k8s.io tag calico/cni:v3.19.1 docker.harbor.com/ops/cni:v3.19.1
5、设置nerdctl子命令可以使用tab键
vim /etc/profile source <(nerdctl completion bash) # 让其生效 source /etc/profile
6、run 一个容器
nerdctl run -d --privileged --restart=always --name zjz-rancher -p 80:80 -p 443:443 docker.io/cnrancher/rancher:v2.4.17-ent
三、配置加速地址
1、生成默认配置
containerd config default > /etc/containerd/config.toml
2、修改镜像存储位置
cat /etc/containerd/config.toml root = "/home/images/containerd"
3、镜像加速地址
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://q5bgvr7l.mirror.aliyuncs.com"]
4、ctr 相当于核心组件,通过加载插件的方式来支持各种操作。
使用 ctr plugins ls 来查看当前加载的插件和支持的操作。
[root@zjz ~]# 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 devmapper linux/amd64 error io.containerd.snapshotter.v1 native linux/amd64 ok io.containerd.snapshotter.v1 overlayfs linux/amd64 ok io.containerd.snapshotter.v1 zfs linux/amd64 skip io.containerd.metadata.v1 bolt - ok io.containerd.differ.v1 walking linux/amd64 ok io.containerd.gc.v1 scheduler - ok io.containerd.service.v1 introspection-service - ok io.containerd.service.v1 containers-service - ok io.containerd.service.v1 content-service - ok io.containerd.service.v1 diff-service - ok io.containerd.service.v1 images-service - ok io.containerd.service.v1 leases-service - ok io.containerd.service.v1 namespaces-service - ok io.containerd.service.v1 snapshots-service - ok io.containerd.runtime.v1 linux linux/amd64 ok io.containerd.runtime.v2 task linux/amd64 ok io.containerd.monitor.v1 cgroups linux/amd64 ok io.containerd.service.v1 tasks-service - ok io.containerd.internal.v1 restart - ok io.containerd.grpc.v1 containers - ok io.containerd.grpc.v1 content - ok io.containerd.grpc.v1 diff - ok io.containerd.grpc.v1 events - ok io.containerd.grpc.v1 healthcheck - ok io.containerd.grpc.v1 images - ok io.containerd.grpc.v1 leases - ok io.containerd.grpc.v1 namespaces - ok io.containerd.internal.v1 opt - ok io.containerd.grpc.v1 snapshots - ok io.containerd.grpc.v1 tasks - ok io.containerd.grpc.v1 version - ok io.containerd.grpc.v1 cri linux/amd64 ok
四、 containerd连接harbor仓库
1、github项目地址介绍
cri/registry.md at master · containerd/cri · GitHub
2、containerd的配置文件(docker 的 daemon.json)
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://registry-1.docker.io"] //到此为配置文件默认生成,之后为需要添加的内容 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.10.20.71:9998"] endpoint = ["https://10.10.20.71:9998"] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."10.10.20.71:9998".tls] insecure_skip_verify = true [plugins."io.containerd.grpc.v1.cri".registry.configs."10.10.20.71:9998".auth] username = "admin" password = "Harbor12345"
其中“10.10.20.71.9998”是私人仓库地址。
insecure_skip_verify = true 意为跳过证书认证。
加速和对接harbor

保存并重启containerd服务即可
systemctl restart containerd
五、containerd配置nvidia
K3s 会在 /var/lib/rancher/k3s/agent/etc/containerd/config.toml 中为 containerd 生成 config.toml。
如果要对这个文件进行高级定制,你可以在同一目录中创建另一个名为 config.toml.tmpl 的文件,此文件将会代替默认设置。
config.toml.tmpl 是一个 Go 模板文件,并且 config.Node 结构会被传递给模板
k3s/pkg/agent/templates at master · k3s-io/k3s (github.com) 模版文件地址,复制` `内的内容
containerd 重启配置是会自动刷新的,每次重启 k3s 都会重新被默认配置覆盖掉,需要一个指定一个模版文件/var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl ,并且在模版文件里自定义配置加了一行
default_runtime_name = "nvidia"
重启containerd、k3s,服务器(遇到都配好了,重启服务器才有效果)


浙公网安备 33010602011771号