使用 crictl 调试 Kubernetes 节点
Kubernetes v1.11 [稳定]
crictl
是一个用于 CRI 兼容容器运行时的命令行界面。您可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。crictl
及其源代码托管在 cri-tools 仓库中。
开始之前
crictl
需要具有 CRI 运行时的 Linux 操作系统。
安装 crictl
您可以从 cri-tools 的 发布页面 下载 crictl
的压缩存档,该存档适用于多种不同的架构。下载与您的 Kubernetes 版本相对应的版本。解压缩并将其移动到系统路径上的某个位置,例如 /usr/local/bin/
。
一般用法
crictl
命令具有多个子命令和运行时标志。使用 crictl help
或 crictl <subcommand> help
获取更多详细信息。
您可以通过以下方法之一设置 crictl
的端点
- 设置
--runtime-endpoint
和--image-endpoint
标志。 - 设置
CONTAINER_RUNTIME_ENDPOINT
和IMAGE_SERVICE_ENDPOINT
环境变量。 - 在配置文件
/etc/crictl.yaml
中设置端点。要指定其他文件,请在运行crictl
时使用--config=PATH_TO_FILE
标志。
注意
如果您没有设置端点,crictl
将尝试连接到已知端点的列表,这可能会影响性能。您还可以在连接到服务器时指定超时值,并通过在配置文件中指定 timeout
或 debug
值或使用 --timeout
和 --debug
命令行标志来启用或禁用调试。
要查看或编辑当前配置,请查看或编辑 /etc/crictl.yaml
的内容。例如,使用 containerd
容器运行时的配置类似于以下内容
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true
要详细了解 crictl
,请参阅 crictl
文档。
示例 crictl 命令
以下示例展示了一些 crictl
命令和示例输出。
警告
如果您使用crictl
在运行的 Kubernetes 集群上创建 Pod 沙箱或容器,Kubelet 最终将删除它们。crictl
不是通用的工作流工具,而是一个用于调试的工具。列出 Pod
列出所有 Pod
crictl pods
输出类似于以下内容
POD ID CREATED STATE NAME NAMESPACE ATTEMPT
926f1b5a1d33a About a minute ago Ready sh-84d7dcf559-4r2gq default 0
4dccb216c4adb About a minute ago Ready nginx-65899c769f-wv2gp default 0
a86316e96fa89 17 hours ago Ready kube-proxy-gblk4 kube-system 0
919630b8f81f1 17 hours ago Ready nvidia-device-plugin-zgbbv kube-system 0
按名称列出 Pod
crictl pods --name nginx-65899c769f-wv2gp
输出类似于以下内容
POD ID CREATED STATE NAME NAMESPACE ATTEMPT
4dccb216c4adb 2 minutes ago Ready nginx-65899c769f-wv2gp default 0
按标签列出 Pod
crictl pods --label run=nginx
输出类似于以下内容
POD ID CREATED STATE NAME NAMESPACE ATTEMPT
4dccb216c4adb 2 minutes ago Ready nginx-65899c769f-wv2gp default 0
列出镜像
列出所有镜像
crictl images
输出类似于以下内容
IMAGE TAG IMAGE ID SIZE
busybox latest 8c811b4aec35f 1.15MB
k8s-gcrio.azureedge.net/hyperkube-amd64 v1.10.3 e179bbfe5d238 665MB
k8s-gcrio.azureedge.net/pause-amd64 3.1 da86e6ba6ca19 742kB
nginx latest cd5239a0906a6 109MB
按仓库列出镜像
crictl images nginx
输出类似于以下内容
IMAGE TAG IMAGE ID SIZE
nginx latest cd5239a0906a6 109MB
仅列出镜像 ID
crictl images -q
输出类似于以下内容
sha256:8c811b4aec35f259572d0f79207bc0678df4c736eeec50bc9fec37ed936a472a
sha256:e179bbfe5d238de6069f3b03fccbecc3fb4f2019af741bfff1233c4d7b2970c5
sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e
sha256:cd5239a0906a6ccf0562354852fae04bc5b52d72a2aff9a871ddb6bd57553569
列出容器
列出所有容器
crictl ps -a
输出类似于以下内容
CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT
1f73f2d81bf98 busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47 7 minutes ago Running sh 1
9c5951df22c78 busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47 8 minutes ago Exited sh 0
87d3992f84f74 nginx@sha256:d0a8828cccb73397acb0073bf34f4d7d8aa315263f1e7806bf8c55d8ac139d5f 8 minutes ago Running nginx 0
1941fb4da154f k8s-gcrio.azureedge.net/hyperkube-amd64@sha256:00d814b1f7763f4ab5be80c58e98140dfc69df107f253d7fdd714b30a714260a 18 hours ago Running kube-proxy 0
列出正在运行的容器
crictl ps
输出类似于以下内容
CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT
1f73f2d81bf98 busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47 6 minutes ago Running sh 1
87d3992f84f74 nginx@sha256:d0a8828cccb73397acb0073bf34f4d7d8aa315263f1e7806bf8c55d8ac139d5f 7 minutes ago Running nginx 0
1941fb4da154f k8s-gcrio.azureedge.net/hyperkube-amd64@sha256:00d814b1f7763f4ab5be80c58e98140dfc69df107f253d7fdd714b30a714260a 17 hours ago Running kube-proxy 0
在运行的容器中执行命令
crictl exec -i -t 1f73f2d81bf98 ls
输出类似于以下内容
bin dev etc home proc root sys tmp usr var
获取容器的日志
获取所有容器日志
crictl logs 87d3992f84f74
输出类似于以下内容
10.240.0.96 - - [06/Jun/2018:02:45:49 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
10.240.0.96 - - [06/Jun/2018:02:45:50 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
10.240.0.96 - - [06/Jun/2018:02:45:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
仅获取最新的 N
行日志
crictl logs --tail=1 87d3992f84f74
输出类似于以下内容
10.240.0.96 - - [06/Jun/2018:02:45:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
运行 Pod 沙箱
使用 crictl
运行 Pod 沙箱对于调试容器运行时很有用。在运行的 Kubernetes 集群上,沙箱最终将被 Kubelet 停止和删除。
创建类似于以下内容的 JSON 文件
{ "metadata": { "name": "nginx-sandbox", "namespace": "default", "attempt": 1, "uid": "hdishd83djaidwnduwk28bcsb" }, "log_directory": "/tmp", "linux": { } }
使用
crictl runp
命令应用 JSON 并运行沙箱。crictl runp pod-config.json
将返回沙箱的 ID。
创建容器
使用 crictl
创建容器对于调试容器运行时很有用。在运行的 Kubernetes 集群上,容器最终将被 Kubelet 停止和删除。
拉取 busybox 镜像
crictl pull busybox
Image is up to date for busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
创建 Pod 和容器的配置
Pod 配置:
{ "metadata": { "name": "busybox-sandbox", "namespace": "default", "attempt": 1, "uid": "aewi4aeThua7ooShohbo1phoj" }, "log_directory": "/tmp", "linux": { } }
容器配置:
{ "metadata": { "name": "busybox" }, "image":{ "image": "busybox" }, "command": [ "top" ], "log_path":"busybox.log", "linux": { } }
创建容器,传递先前创建的 Pod 的 ID、容器配置文件和 Pod 配置文件。将返回容器的 ID。
crictl create f84dd361f8dc51518ed291fbadd6db537b0496536c1d2d6c05ff943ce8c9a54f container-config.json pod-config.json
列出所有容器,并验证新创建的容器的状态是否设置为
Created
。crictl ps -a
输出类似于以下内容
CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT 3e025dd50a72d busybox 32 seconds ago Created busybox 0
启动容器
要启动容器,请将其 ID 传递给 crictl start
crictl start 3e025dd50a72d956c4f14881fbb5b1080c9275674e95fb67f965f6478a957d60
输出类似于以下内容
3e025dd50a72d956c4f14881fbb5b1080c9275674e95fb67f965f6478a957d60
检查容器的状态是否设置为 Running
。
crictl ps
输出类似于以下内容
CONTAINER ID IMAGE CREATED STATE NAME ATTEMPT
3e025dd50a72d busybox About a minute ago Running busybox 0