3. kubernetes客户端crictl命令

kubernetes客户端crictl命令

crictl 是一个命令行工具,用于与容器运行时接口(CRI)兼容的容器运行时(如 containerd 和 CRI-O)进行交互。crictl 提供了许多有用的命令来管理容器、镜像和 sandboxes。

官方仓库地址:

kubernetes-sigs/cri-tools: CLI and validation tools for Kubelet Container Runtime Interface (CRI) . (github.com)

参考资料:

  1. cri-tools/docs/crictl.md at master · kubernetes-sigs/cri-tools (github.com)
  2. 使用 crictl 对 Kubernetes 节点进行调试 | Kubernetes

1. 安装 crictl

cri-tools项目包括crictl和critest两个工具。下面是兼容性矩阵:

Kubernetes Versioncri-tools Versioncri-tools branch
≥ 1.27.x≥ 1.27.xmaster
≥ 1.16.x ≤ 1.26.x≥ 1.16.x ≤ 1.26.xmaster
1.15.Xv1.15.0release-1.15
1.14.Xv1.14.0release-1.14
1.13.Xv1.13.0release-1.13
1.12.Xv1.12.0release-1.12
1.11.Xv1.11.1release-1.11
1.10.Xv1.0.0-beta.2release-1.10
1.9.Xv1.0.0-alpha.1release-1.9
1.8.Xv0.2release-1.8
1.7.Xv0.1release-1.7

一般情况下安装完成k8s后,会同步安装crictl。如果没有安装crictl工具,可以参考如下步骤手动安装:

  1. 下载 crictl 的二进制文件:

在Releases · kubernetes-sigs/cri-tools (github.com)查看版本列表,以下载安装v1.28.0版本为例:

VERSION="v1.28.0"# 使用wget
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz# 使用curl
curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-${VERSION}-linux-amd64.tar.gz --output crictl-${VERSION}-linux-amd64.tar.gz
  1. 解压并将二进制文件移动到系统路径:
sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
  1. 验证安装是否成功:
crictl --version

2. 配置 crictl

crictl在linux下默认会连接:

  • unix:///run/containerd/containerd.sock or
  • unix:///run/crio/crio.sock or
  • unix:///var/run/cri-dockerd.sock

在windows下默认会连接:

  • npipe:./pipe/containerd-containerd or
  • npipe:./pipe/cri-dockerd

其他运行时:

  • frakti: unix:///var/run/frakti.sock

可以用以下方法之一来为 crictl 设置端点:

  • 设置参数 --runtime-endpoint--image-endpoint
  • 设置环境变量 CONTAINER_RUNTIME_ENDPOINTIMAGE_SERVICE_ENDPOINT
  • 在默认配置文件 --config=/etc/crictl.yaml 中设置端点。 要设置不同的文件,可以在运行 crictl 时使用 --config=PATH_TO_FILE 标志。

这里采用配置文件方法,一劳永逸。默认配置文件路径是 /etc/crictl.yaml,使用containerd容器运行时,配置示例如下:

linux:

$ cat /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 2
debug: true
pull-image-on-create: false

windows:

C:\> type %USERPROFILE%\.crictl\crictl.yaml
runtime-endpoint: npipe:./pipe/containerd-containerd
image-endpoint: npipe:./pipe/containerd-containerd
timeout: 2
debug: true
pull-image-on-create: false

如果endpoint没有设置, crictl 会尝试依次连接:

  • containerd
  • cri-o
  • cri-dockerd

3. 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 停止和删除。

  1. 编写下面的 JSON 文件:

    {"metadata": {"name": "nginx-sandbox","namespace": "default","attempt": 1,"uid": "hdishd83djaidwnduwk28bcsb"},"log_directory": "/tmp","linux": {}
    }
    
  2. 使用 crictl runp 命令应用 JSON 文件并运行沙盒。

    crictl runp pod-config.json
    

    返回了沙盒的 ID。

创建容器

crictl 创建容器对容器运行时排错很有帮助。 在运行的 Kubernetes 集群中,容器最终将被 kubelet 停止和删除。

  1. 拉取 busybox 镜像
crictl pull busybox
Image is up to date for busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d4
  1. 创建 Pod 和容器的配置:

Pod 配置

{"metadata": {"name": "busybox-sandbox","namespace": "default","attempt": 1,"uid": "aewi4aeThua7ooShohbo1phoj"},"log_directory": "/tmp","linux": {}
}

容器配置

container-config.json

{"metadata": {"name": "busybox"},"image":{"image": "busybox"},"command": ["top"],"log_path":"busybox.log","linux": {}
}
  1. 创建容器,传递先前创建的 Pod 的 ID、容器配置文件和 Pod 配置文件。返回容器的 ID。
crictl create f84dd361f8dc51518ed291fbadd6db537b0496536c1d2d6c05ff943ce8c9a54f container-config.json pod-config.json
  1. 查询所有容器并确认新创建的容器状态为 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

4. 排错

1 .CRI v1 image API is not implemented for endpoint

[root@k8s ~]# crictl images
DEBU[0000] get image connection
FATA[0000] validate service connection: CRI v1 image API is not implemented for endpoint "unix:///run/containerd/containerd.sock": rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService

原因为containerd禁用了cri插件:

[root@k8s ~]# cat /etc/containerd/config.toml | grep plugin
disabled_plugins = ["cri"]

将cri删除后,重启containerd服务后尝试。

  1. 创建Pod沙盒报错,OCI runtime create failed: runc create failed: expected cgroupsPath to be of format
root@master1:~# cat pod-config.json
{"metadata": {"name": "busybox-sandbox","namespace": "default","attempt": 1,"uid": "aewi4aeThua7ooShohbo1phoj"},"log_directory": "/tmp","linux": {}
}
root@master1:~# crictl runp pod-config.json
DEBU[0000] get runtime connection
DEBU[0000] RunPodSandboxRequest: &RunPodSandboxRequest{Config:&PodSandboxConfig{Metadata:&PodSandboxMetadata{Name:busybox-sandbox,Uid:aewi4aeThua7ooShohbo1phoj,Namespace:default,Attempt:1,},Hostname:,LogDirectory:/tmp,DnsConfig:nil,PortMappings:[]*PortMapping{},Labels:map[string]string{},Annotations:map[string]string{},Linux:&LinuxPodSandboxConfig{CgroupParent:,SecurityContext:nil,Sysctls:map[string]string{},Overhead:nil,Resources:nil,},Windows:nil,},RuntimeHandler:,}
E0622 17:09:26.796680   97165 remote_runtime.go:176] "RunPodSandbox from runtime service failed" err="rpc error: code = Unknown desc = failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: expected cgroupsPath to be of format \"slice:prefix:name\" for systemd cgroups, got \"/k8s.io/bcc06428ac84c7bf8bc431a1366b5c768b17e53cc04bc666195535a95f7325fc\" instead: unknown"
DEBU[0000] RunPodSandboxResponse:
FATA[0000] run pod sandbox: rpc error: code = Unknown desc = failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: expected cgroupsPath to be of format "slice:prefix:name" for systemd cgroups, got "/k8s.io/bcc06428ac84c7bf8bc431a1366b5c768b17e53cc04bc666195535a95f7325fc" instead: unknown

暂未找到原因及解决办法,记录问题,后续进行跟踪。 可参考资料:

https://cloud-atlas.readthedocs.io/zh-cn/latest/kubernetes/debug/crictl.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust:Future、async 异步代码机制示例与分析

0. 异步、并发、并行、进程、协程概念梳理 Rust 的异步机制不是多线程或多进程,而是基于协程(或称为轻量级线程、微线程)的模型,这些协程可以在单个线程内并发执行。这种模型允许在单个线程中通过非阻塞的方式处理多个任务&#…

关于微信没有接入鸿蒙NEXT的思考

6月21日,纯血鸿蒙发布,国内的质疑声终于停止,不再被人喊叫换皮 Android 了.就连编程语言都是华为自研的。 可是发布会后微信却成了热点,因为余承东在感谢了一圈互联网企业,如:淘宝、支付宝、美团、京东、抖音、今日头条、钉钉、小红书、微博、B站、高德、WPS等等. 唯独没有感…

CSS基础学习记录(5)

目录 1、CSS语法 2、实例 3、CSS注释 4、id 选择器 5、class 类选择器 6、标签选择器 7、内联选择器 1、CSS语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: 选择器(Selector)通常是您需要改变样式的 HTML …

Altera不同系列的型号命名规则

Altera芯片型号:10AX07H4F34I3SG 20nm工艺 资源: 大数据 云计算 人工智能 图像处理 MSEL

高级人工智能复习 中科大

参考: 中科大2023春季【高级人工智能】试题回顾 中国科学技术大学《高级人工智能》课程 重要知识点提纲 高级人工智能复习提纲 1.搜索 1.1 搜索问题的概念 搜索问题的五个要素:状态空间、后继函数、初始状态、目标测试和路径耗散。 用状态图描述搜索…

Codeforces Round 953 (Div. 2) A~F

A.Alice and Books(思维) 题意: 爱丽丝有 n n n本书。第 1 1 1本书包含 a 1 a_1 a1​页,第 2 2 2本书包含 a 2 a_2 a2​页, … \ldots …第 n n n本书包含 a n a_n an​页。爱丽丝的操作如下: 她把所有的…

C语言之常用标准库介绍

文章目录 1 标准库1.1 诊断assert.h1.2 字符类别测试ctype.h1.3 错误处理errno.h1.4 整型常量limits.h1.5 地域环境locale.h1.6 数学函数math.h1.7 非局部跳转setjmp.h1.8 可变参数表stdarg.h1.9 公共定义stddef.h1.10 输入输出stdio.h1.11 实用函数stdlib.h1.12 日期与时间函数…

L57---112.路径总和(广搜)---Java版

1.题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指…

c++新技术

C的新技术主要体现在其不断演进的新标准中,这些新标准为开发者提供了更多的工具和特性,使得C成为一门现代化的高效编程语言。以下是关于C新技术的一些关键点和概述: C新标准: C11:引入了众多现代C的特性,如…

Lambda函数(箭头表达式)

箭头函数 也被称为Lambda函数或者箭头表达式,是ECMAScript 2015(又称ES6)中新增的一种函数定义方式。它使用箭头(>)来定义函数,通常用于定义匿名函数或回调函数。 优点 箭头函数有以下几个显著特点&a…

力扣每日一题 6/23 字符串/模拟

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 520.检测大写字母【简单】 题目: 我们定义,在以下…

面试必考题 CSS的居中布局

CSS居中对齐的几种方式 使用flex布局利用css3中的flex弹性盒的属性利用子元素auto 使用grid布局使用定位使用定位与margin利用CSS3属性transform 使用文本对齐使用table布局 使用flex布局 利用css3中的flex弹性盒的属性 .parent {display: flex;justify-content: center;alig…

经典面试题【作用域、闭包、变量提升】,带你深入理解掌握!

前言:哈喽,大家好,我是前端菜鸟的自我修养!今天给大家分享经典面试题【作用域、闭包、变量提升】,并提供具体代码帮助大家深入理解,彻底掌握!原创不易,如果能帮助到带大家&#xff0…

欧洲杯赛况@20240622

点击标题下「蓝色微信名」可快速关注 斯洛伐克对阵乌克兰,场面上大开大合,施兰茨连场进球,但这次乌克兰丢球后没泄气,连进两球反超, 从数据统计上,两队不相上下,这个小组的形势更加复杂了&#…

【ajax核心05】宏任务与微任务

ES6之后引入Promise对象(用来管理异步任务),让JS引擎也可以发起异步任务 一:异步任务分类 异步任务分为:宏任务与微任务 宏任务 由浏览器环境执行的异步代码 具体宏任务分类 微任务 由JS引擎执行的代码 创建Promise对象时,…

Java中的Servlet编程:从基础到高级应用

Java中的Servlet编程:从基础到高级应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在本文中,我们将探讨Java中的Servlet编程&#x…

[JS]语句

介绍 代码分类 表达式: 可以被求值的代码称为表达式, 可以用于赋值 语句: 一段可执行的代码, 可以有结果, 可以没有结果, 不能用于赋值 语句分类 代码从上往下执行, 称为顺序结构代码按照条件选择执行, 称为分支结构某些代码被重复执行, 成为循环结构 分支结构 if分支 if…

python-今年第几天

[题目描述] 定义一个结构体变量(包括年、月、日)。 计算该日在本年中是第几天,注意闰年问题。输入格式: 年 月 日。输出格式: 当年第几天。样例输入 2000 12 31样例输出 366 数据范围 对于100%的数据,保…

【C++PCL】点云处理Kd-tree原理

作者:迅卓科技 简介:本人从事过多项点云项目,并且负责的项目均已得到好评! 公众号:迅卓科技,一个可以让您可以学习点云的好地方 重点:每个模块都有参数如何调试的讲解,即调试某个参数对结果的影响是什么,大家有问题可以评论哈,如果文章有错误的地方,欢迎来指出错误的…

【前端vue3】TypeScrip-基础类型和任意类型

安装TypeScript npm install typescript -g 运行tsc -v可查看当前版本 为了方便调试可以安装 先安装小满zs大神写的工具,可以切换下载源 npm i xmzs -g 安装成功后 使用mmp ls查看当前的源有哪些 使用 mmp use选择镜像源 切换成功后,安装TypeScrip…