docker、ctr、crictl命令简介与使用
概述
在使用k3s过程中,经常需要使用ctr
和crictl
两个命令,本文记录一下。
ctr
类似docker
命令是docker-shim容器运行时的客户端工具,ctr
是Containerd的客户端工具。一个简单的CLI接口,用作Containerd本身的一些调试用途,投入生产使用时还是应该配合docker或cri-containerd。
安装Containerd作为容器运行时后,会自动安装ctr
;安装k3s后,也会自动安装ctr
。
命名空间
ctr
与docker
命令一个较大的区别,ctr有命名空间的概念,自带一个moby
命名空间:
如果执行过ctr i pull
、ctr i import
、ctr i export
等命令,又没有通过-n
参数指定命名空间,则会自动创建default
命名空间:
当Containerd结合k8s(或k3s)使用时,相关镜像一般存放到k8s.io
,相关操作需要加-n k8s.io
,避免与默认空间混淆,且将参数放到最前面,即:ctr -n=k8s.io i pull
。
ctr
命令输出:
ctr is an unsupported debug and administrative client for interacting
with the containerd daemon. Because it is unsupported, the commands,
options, and operations are not guaranteed to be backward compatible or
stable from release to release of the containerd project.COMMANDS:plugins, plugin Provides information about containerd pluginsversion Print the client and server versionscontainers, c, container Manage containerscontent Manage contentevents, event Display containerd eventsimages, image, i Manage imagesleases Manage leasesnamespaces, namespace, ns Manage namespacespprof Provide golang pprof outputs for containerdrun Run a containersnapshots, snapshot Manage snapshotstasks, t, task Manage tasksinstall Install a new packageoci OCI toolssandboxes, sandbox, sb, s Manage sandboxesinfo Print the server infodeprecationsshim Interact with a shim directlyhelp, h Shows a list of commands or help for one commandGLOBAL OPTIONS:--debug Enable debug output in logs--address value, -a value Address for containerd's GRPC server (default: "/run/containerd/containerd.sock") [$CONTAINERD_ADDRESS]--timeout value Total timeout for ctr commands (default: 0s)--connect-timeout value Timeout for connecting to containerd (default: 0s)--namespace value, -n value Namespace to use with commands (default: "default") [$CONTAINERD_NAMESPACE]--help, -h show help--version, -v print the version
crictl
crictl,GitHub,一个兼容CRI的命令行接口,可用于检查和调试k8s/kubelet节点上的容器运行时和应用程序。只有一个k8s.io
命名空间,无需-n
参数。
安装
VERSION="v1.33.0"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
rm -f crictl-$VERSION-linux-amd64.tar.gz
crictl默认连接到unix:///var/run/dockershim.sock
。对于其它运行时,可通过多种方式设置端点:
- 设置
--runtime-endpoint
和--image-endpoint
选项; - 设置
CONTAINER_RUNTIME_ENDPOINT
和IMAGE_SERVICE_ENDPOINT
环境变量; - 在配置文件
--config=/etc/crictl.yaml
设置端点。
在连接到服务器时,配置文件可指定超时值(timeout
或–timeout
),启用或禁用调试(debug
或–debug
)。
比如在k3s环境下,执行cat /var/lib/rancher/k3s/agent/etc/crictl.yaml
输出:
runtime-endpoint: unix:///run/k3s/containerd/containerd.sock
crictl
命令输出:
VERSION:v1.31.0-k3s2COMMANDS:attach Attach to a running containercheckpoint Checkpoint one or more running containerscompletion Output shell completion codeconfig Get and set crictl client configuration optionscreate Create a new containerevents, event Stream the events of containersexec Run a command in a running containerimagefsinfo Return image filesystem infoimages, image, img List imagesinfo Display information of the container runtimeinspect Display the status of one or more containersinspecti Return the status of one or more imagesinspectp Display the status of one or more podslogs Fetch the logs of a containermetricsp List pod metrics. Metrics are unstructured key/value pairs gathered by CRI meant to replace cAdvisor's /metrics/cadvisor endpoint.pods List podsport-forward Forward local port to a podps List containerspull Pull an image from a registryrm Remove one or more containersrmi Remove one or more imagesrmp Remove one or more podsrun Run a new container inside a sandboxrunp Run a new podruntime-config Retrieve the container runtime configurationstart Start one or more created containersstats List container(s) resource usage statisticsstatsp List pod statistics. Stats represent a structured API that will fulfill the Kubelet's /stats/summary endpoint.stop Stop one or more running containersstopp Stop one or more running podsupdate Update one or more running containersupdate-runtime-config Update the runtime configurationversion Display runtime version informationhelp, h Shows a list of commands or help for one commandGLOBAL OPTIONS:--config value, -c value Location of the client config file. If not specified and the default does not exist, the program's directory is searched as well (default: "/etc/crictl.yaml") [$CRI_CONFIG_FILE]--debug, -D Enable debug mode (default: false)--enable-tracing Enable OpenTelemetry tracing. (default: false)--image-endpoint value, -i value Endpoint of CRI image manager service (default: uses 'runtime-endpoint' setting) [$IMAGE_SERVICE_ENDPOINT]--runtime-endpoint value, -r value Endpoint of CRI container runtime service (default: uses in order the first successful one of [unix:///run/k3s/containerd/containerd.sock unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]). Default is now deprecated and the endpoint should be set instead. [$CONTAINER_RUNTIME_ENDPOINT]--timeout value, -t value Timeout of connecting to the server in seconds (e.g. 2s, 20s.). 0 or less is set to default (default: 2s)--tracing-endpoint value Address to which the gRPC tracing collector will send spans to. (default: "127.0.0.1:4317")--tracing-sampling-rate-per-million value Number of samples to collect per million OpenTelemetry spans. Set to 1000000 or -1 to always sample. (default: -1)--help, -h Show help (default: false)--version, -v Print the version (default: false)
crictl pull
可以明确的是:
- 哪怕当前环境已经下载过docker镜像,使用yaml文件通过vLLM启动大模型时,还是会去下载crictl镜像;
- 通过crictl下载镜像,和docker下载的镜像,其名字一致;
- yaml文件里使用
dustynv/vllm:0.7.4-r36.4.0-cu128-24.04
镜像,等价于docker.io/dustynv/vllm:0.7.4-r36.4.0-cu128-24.04
; - 上面的
docker.io
就是部署在国外的Docker Hub官方镜像源,国内下载速度非常慢; - 可考虑使用国内镜像源,如
docker.m.daocloud.io/dustynv/vllm
、docker.1ms.run/dustynv/vllm
; - 通过
crictl pull
下载镜像并没有进度条提示,狠是恶心,只能干等,有时候等了10分钟给你来个提示,只能重试。
如上图所示,没有任何进度提示。
下载国外镜像,会遇到各种奇奇怪怪的报错:
使用国内的镜像源地址:
反复重试,还是上面的报错提示。
Qwen等ChatGPT给出的解决方法是先登录。
好,遇到问题解决问题;打开网站毫秒镜像,使用个人手机号注册。按照Qwen给出的幻觉答复,crictl login
:
crictl pull
镜像可以执行docker login
,可见crictl底层使用的还是docker镜像那一套机制:
不过又遇到另一个超时报错,那就再换一个国内镜像源吧。
实践下来,通过docker.m.daocloud.io
镜像源下载crictl镜像速度还能接受。
crictl镜像和ctr镜像
部分网络资料说crictl image list
等效于ctr -n=k8s.io image list
。
经过各种ChatGPT以及命令尝试:
crictl image
等效于crictl images
,等效于crictl image list
和crictl images list
。
在k3s环境下,crictl image
等效于k3s ctr -n=k8s.io image list
。
k3s
命令前缀不能省去。k3s默认使用-n=k8s.io
命名空间,因此crictl image
等效于k3s ctr images list
。
个数
crictl images | grep vllm
输出2个:
而k3s ctr images list | grep vllm
输出4个:
分析:
- crictl是CRI客户端工具,crictl输出是CRI提供给kubelet的简化视图,只显示标签信息,不展示digest表示;
k3s ctr image
输出,表明containerd实际存储四个镜像引用;分别是tag和digest;
crictl镜像导出
输入命令crictl images
和k3s crictl images
的截图如下:
可见,在k3s环境下,crictl
命令等价于k3s crictl
,也就是说,k3s
命令前缀可以省去。
问题在于,一个vLLM镜像动辄5~6个G。
vLLM这篇博客也提到过,部署大模型时,通过k8s调度到从节点,则从节点也需要对应的模型文件和crictl镜像。
那crictl镜像能不能导出为tar包,通过scp命令传输到从节点,然后在从节点导入tar包为crictl镜像呢?
答案当然是可以,docker镜像就完全可以这么玩,crictl和docker存在很多相似之处。
但crictl并没有提供save命令:
需要通过ctr export
命令执行导出操作。
导出镜像的前提是找到镜像,要不然就会出现如下not found报错:
k3s ctr image | grep vllm:0.8.6
输出2行,下面这一行非常非常长,:
docker.io/dustynv/vllm:0.8.6-r36.4-cu128-24.04 application/vnd.docker.distribution.manifest.v2+json sha256:b2210294b661acc6e94bc302ce5111d6d0cb01a3815ada0132c105f540fb7a63 5.7 GiB linux/arm64 io.cri-containerd.image=managed
docker.io/dustynv/vllm@sha256:b2210294b661acc6e94bc302ce5111d6d0cb01a3815ada0132c105f540fb7a63 application/vnd.docker.distribution.manifest.v2+json sha256:b2210294b661acc6e94bc302ce5111d6d0cb01a3815ada0132c105f540fb7a63 5.7 GiB linux/arm64 io.cri-containerd.image=managed
导出命令:k3s ctr -n k8s.io image export vllm-0.8.6.tar docker.io/dustynv/vllm:0.8.6-r36.4-cu128-24.04
。如果
检查:
docker、crictl及ctr
三个命令行的对比
命令 | docker | crictl(推荐) | ctr |
---|---|---|---|
查看容器列表 | docker ps | crictl ps | ctr -n k8s.io c ls |
查看容器详情 | docker inspect | crictl inspect | ctr -n k8s.io c info |
查看容器日志 | docker logs | crictl logs | 无 |
容器内执行命令 | docker exec | crictl exec | 无 |
挂载容器 | docker attach | crictl attach | 无 |
容器资源使用 | docker stats | crictl stats | 无 |
创建容器 | docker create | crictl create | ctr -n k8s.io c create |
启动容器 | docker start | crictl start | ctr -n k8s.io run |
停止容器 | docker stop | crictl stop | 无 |
删除容器 | docker rm | crictl rm | ctr -n k8s.io c del |
查看镜像列表 | docker images | crictl images | ctr -n k8s.io i ls |
查看镜像详情 | docker inspect | crictl inspect | 无 |
拉取镜像 | docker pull | crictl pull | ctr -n k8s.io i pull |
推送镜像 | docker push | 无 | ctr -n k8s.io i push |
删除镜像 | docker rmi | crictl rmi | ctr -n k8s.io i rm |
查看Pod列表 | 无 | crictl pods | 无 |
查看Pod详情 | 无 | crictl inspectp | 无 |
启动Pod | 无 | crictl runp | 无 |
停止Pod | 无 | crictl stopp | 无 |
导入镜像 | docker load | 无 | ctr -n k8s.io i import |
导出镜像 | docker save | 无 | ctr -n k8s.io i export |