Crictl安装与使用

1、介绍

crictl 是 CRI 兼容的容器运行时命令行接口。 可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。

2、安装

2.1 使用yum安装

安装containerd.io软件包就自带了crictl命令

1
2
3
4
5
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io

2.2 使用二进制包

在github下载安装包:https://github.com/kubernetes-sigs/cri-tools/releases/tag/v1.21.0

1
2
3
4
VERSION="v1.21.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

3、设置配置文件

3.1 配置文件

crictl 默认连接到 unix:///var/run/dockershim.sock。 对于其他的运行时,可以用多种不同的方法设置端点:

  • 通过设置参数 --runtime-endpoint--image-endpoint
  • 通过设置环境变量 CONTAINER_RUNTIME_ENDPOINTIMAGE_SERVICE_ENDPOINT
  • 通过在配置文件中设置端点 --config=/etc/crictl.yaml

还可以在连接到服务器并启用或禁用调试时指定超时值,方法是在配置文件中指定 timeoutdebug 值,或者使用 --timeout--debug 命令行参数。

1
2
3
4
5
6
cat >> /etc/crictl.yaml << EOF    #这里使用containerd
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 3
debug: true
EOF

3.2 命令行

使用crictl config命令获取并设置crictl客户端配置选项

1
crictl config [command options] [<crictl options>]

例如,crictl config --set debug=true在提供后续crictl命令时将启用调试模式。

可选选项:

1
2
3
4
5
6
runtime-endpoint:       Container runtime endpoint
image-endpoint: Image endpoint
timeout: Timeout of connecting to server (default: 2s)
debug: Enable debug output (default: false)
pull-image-on-create: Enable pulling image on create requests (default: false)
disable-pull-on-run: Disable pulling image on run requests (default: false)

选项:

1
2
3
--get value  show the option value
--set value set option (can specify multiple or separate values with commas: opt1=val1,opt2=val2)
--help, -h show help (default: false)

启用后,pull-image-on-create将修改create container命令以首先拉出容器的映像。此功能用作帮助使创建容器更容易,更快的助手。crictl可能希望不要提取创建容器所需的图像。例如,图像可能已经被拉出或以其他方式加载到容器运行时中,或者用户可能在没有网络的情况下运行。因此,默认值forpull-image-on-create为false。

默认情况下,运行命令首先提取容器映像,并且disable-pull-on-run为false。的某些用户crictl可能希望将其设置disable-pull-on-run为true,以在使用run命令时默认情况下不拉取图像。

要覆盖这些默认的拉取配置设置,--no-pull--with-pull为create和run命令提供了选项。

4、用法

1
crictl [全局选项]命令[命令选项] [参数...]

指令

  • attach:附加到正在运行的容器
  • create:创建一个新的容器
  • exec:在正在运行的容器中运行命令
  • version:显示运行时版本信息
  • images:列出镜像
  • inspect:显示一个或多个容器的状态
  • inspecti:返回一个或多个镜像的状态
  • imagefsinfo:返回镜像文件系统信息
  • inspectp:显示一个或多个pods的状态
  • logs:获取容器的日志
  • port-forward:将本地端口转发到Pod
  • ps:列出容器
  • pull:从镜像库拉取镜像
  • runp:运行一个新的pod
  • rm:删除一个或多个容器
  • rmi:删除一个或多个镜像
  • rmp:删除一个或多个pod
  • pods:列出pods
  • start:启动一个或多个已创建的容器
  • info:显示容器运行时的信息
  • stop:停止一个或多个运行中的容器
  • stopp:停止一个或多个正在运行的Pod
  • update:更新一个或多个正在运行的容器
  • config:获取并设置crictl客户端配置选项
  • stats:列出容器资源使用情况统计信息
  • completion:输出bash shell完成代码
  • help, h:显示命令列表或一个命令的帮助

其他指令

  • --timeout-t:连接服务器的超时时间(以秒为单位)(默认值:10s)。0或更少将被解释为未设置并转换为默认值。没有设置超时值的选项,支持的最小超时为1s
  • --debug-D:启用调试输出
  • --help-h:显示帮助
  • --version-v:打印crictl的版本信息
  • --config-c:客户端配置文件的位置。如果未指定并且默认目录不存在,则也会搜索该程序的目录(默认目录:“ / etc / crictl.yaml”)[$ CRI_CONFIG_FILE]

5、创建pod报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@node2 ~]# cat pod-config.json
{
"metadata": {
"name": "sandbox",
"namespace": "default",
"attempt": 1,
"uid": "hdishd83djaidwnduwk28bcsb"
},
"log_directory": "/tmp",
"linux": {
}
}
[root@node2 ~]# crictl runp pod-config.json
FATA[0000] run pod sandbox failed: rpc error: code = Unknown desc = failed to setup network for sandbox "b20591a4fcb681975ed3f906de91455ad793f18dafc98630b23e64548ade90a6": pods "sandbox" not found

报错原因:calico daemonset监视apiserver以获取Pod列表,并根据Pod规范应用网络配置。自己使用沙盒,则apiserver上将没有相应的Pod,因此calico报告该错误。不建议用户运行crictl runscrictl create一个Kubernetes节点上,这些命令在那里只是一些特殊的调试情况。即使您能够创建沙箱,kubelet也将最终停止并删除它,因为它在apiserver上看不到相应的pod。