[转帖]k8s学习-containerd命令行工具crictl使用

k8s,学习,containerd,命令行,工具,crictl,使用 · 浏览次数 : 0

小编点评

**containerd 是一个开源、可靠的容器运行时,它包含了单机运行一个容器运行时的功能。** **containerd 的主要功能包括:** * 支持多种 OCI Runtime 实现,内部使用 `containerd-shim` 来实现。 * 提供 CRI 标准,统一 k8s 与不同容器引擎之间的交互。 * 优化容器启动和管理。 * 与 Kubernetes 集成,简化容器编排。

正文

在最新k8s的版本中,containerdruntime已经不在使用docker,而是使用containerd了。​containerd是什么?containerd的自我介绍中说它是一个开放、可靠的容器运行时,实际上它包含了单机运行一个容器运行时的功能。 containerd为了支持多种OCI Runtime实现,内部使用containerd-shim,shim英文翻译过来是"垫片"的意思。

官网见:​ ​containerd docs – Getting started with containerd​

Kubernetes, Docker和Containerd

​kubernetes的出现是为了解决容器编排的问题,在早期为了支持多个容器引擎,是在Kubernetes内部对多个容器引擎做兼容,例如kubelet启动一个docker-manager的进程直接调用docker的api进行容器的创建。

k8s学习-containerd命令行工具crictl使用_命令行

后来k8s为了隔离各个容器引擎之间的差异,在docker分出containerd后,k8s也搞出了自己的容器运行时接口(CRI),CRI的出现是为了统一k8s与不同容器引擎之间交互的接口,与OCI的容器运行时规范不同,CRI更加适合k8s,不仅包含对容器的管理,还引入了k8s中Pod的概念及对Pod生命周期的管理。 k8s开始把containerd接入CRI标准。kubelet通过CRI接口调用docker-shim,进一步调用docker api。此时在每个k8s节点上kubelet大致按下图流程启动容器:

k8s学习-containerd命令行工具crictl使用_命令行_02

​为了更好的将containerd接入到CRI标准中,k8s又搞出了cri-containerd​项目,cri-containerd是一个守护进程用来实现kubelet和containerd之间的交互,此时k8s节点上kubelet大致按下图流程启动容器:

k8s学习-containerd命令行工具crictl使用_命名空间_03

在上图中cri-containerd和containerd还是两个独立的进程,他们之间通过gRPC通信,后来在Containerd 1.1时,将cri-containerd改成了Containerd的CRI插件,CRI插件位于containerd内部,这让k8s启动Pod时的通信更加高效,此时k8s节点上kubelet大致按下图流程启动容器:

k8s学习-containerd命令行工具crictl使用_docker_04

kubelet启动容器的发展历程总结

早期: kubelet --> docker-manager --> docker
中期: kubelet -CRI-> docker-shim --> docker --> containerd --> runc
中期: kubelet -CRI-> cri-containerd --> containerd --> runc
当前: kubelet -CRI-> containerd(CRI plugin) --> runc
当前: kubelet -CRI-> cri-o --> runc
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

ctr cli与crictl联系与区别

使用containerd的命令行工具ctr来启动一个容器。启动流程如下:

k8s学习-containerd命令行工具crictl使用_docker_05

从containerd作为k8s容器运行,流程如下:

k8s学习-containerd命令行工具crictl使用_docker_06

crt是containerd的一个客户端工具,定位和作用与docker一样,命令使用也大概一致。

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

ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。

一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。

命令对比

命令

docker

ctr(containerd)

crictl(k8s)              

命令

docker

ctr(containerd)

crictl(k8s)

查看运行的容器

docker ps

ctr task ls/ctr container ls

crictl ps

查看镜像

docker images

ctr image ls

crictl images

查看容器日志

docker logs


crictl logs

查看容器数据信息

docker inspect

ctr container info

crictl inspect

查看容器资源

docker stats


crictl stats

启动/关闭已有的容器

docker start/stop

ctr task start/kill

crictl start/stop

运行一个新的容器

docker run

ctr run


修改镜像标签

docker tag

ctr image tag


创建一个新的容器

docker create

ctr container create

crictl create

导入镜像

docker load

ctr image import


导出镜像

docker save

ctr image export


删除容器

docker rm

ctr container rm

crictl rm

删除镜像

docker rmi

ctr image rm

crictl rmi

拉取镜像

docker pull

ctr image pull

ctictl pull

推送镜像

docker push

ctr image push

在容器内部执行命令

docker exec

crictl exec

更多的命令操作,可以直接在命令行后输入查看帮助。

需要注意的是,containerd 相比于docker , 多了namespace概念, 每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间

crictl 使用命名空间 k8s.io

crictl image list = ctr -n=k8s.io image list

与[转帖]k8s学习-containerd命令行工具crictl使用相似的内容:

[转帖]k8s学习-containerd命令行工具crictl使用

在最新k8s的版本中,containerdruntime已经不在使用docker,而是使用containerd了。​containerd是什么?containerd的自我介绍中说它是一个开放、可靠的容器运行时,实际上它包含了单机运行一个容器运行时的功能。 containerd为了支持多种OCI Ru

[转帖]如何使用Calico实现跨主机Docker网络通信

https://blog.csdn.net/sanhewuyang/article/details/122004156 写在前面 学习K8s,学到这里,整理记忆,本文用于理解K8s网络中Calico网路方案的原理优缺点内容包括:常见的容器跨主机通信方案简介Caliao实现Container跨主机通信

[转帖]k8s学习: kubeconfig文件详解

1.什么是kubeconfig文件 用于配置集群访问的文件称为kubeconfig文件,这是引用配置文件的常用方法,.但并不是说有一个名为ubeconfi的文件。用于配置集群访问信息的文件叫作 kubeconfig 文件,在开启了 TLS 的集群中,每次与集群交互时都需要身份认证,生产环境一般使用证

[转帖]终于搞懂了服务器为啥产生大量的TIME_WAIT!

http://www.yunweipai.com/40430.html 运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维 写在开头,大概 4

[转帖]如何提高Linux下块设备IO的整体性能?

http://www.yunweipai.com/6989.html 运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维 作者介绍 邹立巍 Li

[转帖]k8s发布Spring cloud+eureka架构服务优雅启动停止方案

本文转载自昆仑枫的简书https://www.jianshu.com/p/6d393cbb694a Spring cloud+eureka是目前微服务主流解决方案之一,kubernetes则是广泛应用的发布工具,两者结合使用很常见。而两者结合时如何优雅启停从而实现无感发布很关键。下面将从不做特殊处理

[转帖]K8S部署Redis Cluster集群(三主三从模式) - 部署笔记

https://www.cnblogs.com/cheyunhua/p/15619317.html 一、Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理。它可以存储和操作高级数据类型,例如列表,地图,集合和排序

[转帖]k8s部署有状态应用redis-cluster集群踩坑总结

https://segmentfault.com/a/1190000039196137 redis-cluster集群的部署网上一堆,用k8s部署也不在少数,但都是抄来抄去,问题不少,实际操作分享出来的还是太少。 1、redis启动配置文件,使用CofigMap来管理比较方便,redis-confi

[转帖]k8s-mtu设置不当引发的线上故障

https://www.cnblogs.com/zisefeizhu/p/16611626.html 背景 在部署新的paas平台线上环境时,突发consul和es中间件无法创建。 排查过程 以consul 通过查询k8s集群中pod状态发现原来3pod的consul集群,其中2个pod一直重启。

[转帖]K8S集群内部 无持久化Redis单节点配置文件

K8S集群内部 无持久化Redis单节点配置文件 apiVersion: apps/v1 kind: Deployment metadata: name: redis-deploy spec: selector: matchLabels: prod: redis replicas: 1 templa