【kubernetes】CRI & OCI

1 OCI

OCI(Open Container Initiative):由Linux基金会主导,主要包含容器镜像规范和容器运行时规范:

image-spec定义了镜像的格式,镜像的格式有以下几个部分组成:

  • index(可选):由于镜像对于不同平台的实现可能不同,因此,对于不同的平台会提供不同的镜像,在该文件中与manifest最大的不同就是platform,它表明了该镜像对应的平台(包含硬件架构和操作系统)
  • manifest:描述了镜像自身以及镜像的各层的sha256,用sha256就可以定位到其他层
  • layers:每一层的数据的压缩包
  • config:镜像的配置参数

当使用containerd作为容器运行时,上面的所有文件都在/var/lib/containerd/io.containerd.content.v1.content/blobs/sha256中。

runtime-spec定义了容器的配置、运行环境和生命周期:

  • config:生成容器的参数配置
  • runtime:容器的状态、生命周期以及可以执行的操作

当使用containerd作为容器运行时,在ctr c info <container_id>的输出的Spec中可以查看到config文件的内容,另外,使用ctr oci spec可以查看到runtime-spec的默认config文件。

runC是一个从docker的libcontainer库封装而来的工具,可以根据OCI规范来创建和管理容器,它直接对接操作系统,因此,也使用runC直接创建容器(RunC简介),使用runC创建容器时需要2个部分:runtime-spec中的config文件以及rootfs。

2 CRI

CRI(Container Runtime Interface):由CNCF主导,主要是为了使kubernetes能够对接不同的容器运行时而制定的接口规范

  • containerd:Docker从Docker Daemon拆分出containerd,containerd负责容器的各种操作
  • CRI-O:由redhat开源并由社区驱动的专为kubernetes设计的轻量级容器运行时
  • Kata-containers:由OpenStack基金会管理的容器项目,整合了Intel和Clear Containers和Hyper.sh的runV,主要目标是提供虚拟机级别的安全容器,也就是拥有容器的启动速度以及虚拟机的安全

docker作为命令行工具,当用户使用docker create创建容器时,docker会将命令发给dockerd守护进程,docker会将请求发给docker-containerd,docker-containerd会启动docker-containerd-shim进程,该进程会使用runC创建进程,runC是一个二进制程序,创建结束后就会退出,而docker-containerd-shim会作为容器的父进程而运行。

CRI作为k8s提供给外部容器运行时的接口,可以对接许多容器运行时,在早期,k8s通过内置的dockershim实现对docker的兼容,但是在未来,k8s会移除掉dockershim,而是直接对接外部的容器运行时。当前的主流容器运行时主要是:containerd(从dockerd分离而来)和CRI-O。为了管理容器,接收容器中进程的信号,管理容器中的进程,通常会在容器运行时中提供shim,该shim负责容器中进程的管理。具体实现容器和镜像的功能的规范是OCI,当前的主流方案是runC(由dockerd分离而来)和kata(基于虚拟化方案提供安全容器)。

参考文档:

相关推荐
小醉你真好36 分钟前
12、Docker Compose 安装 Redis
redis·docker·容器
慌ZHANG36 分钟前
云原生安全挑战与治理策略:从架构思维到落地实践
大数据·云原生·架构
lovebugs2 小时前
Kubernetes中高效获取Java应用JVM参数的终极指南
后端·docker·kubernetes
郝同学的测开笔记2 小时前
Kubernetes CronJob 详解:配置、原理与实践指南
云原生·kubernetes·自动化运维
JuiceFS2 小时前
稿定科技:多云架构下的 AI 存储挑战与 JuiceFS 实践
人工智能·后端·云原生
船长@Quant6 小时前
开源的现代数据探索和可视化平台:Apache Superset 在 Kubernetes 上安装
kubernetes·dashboard·大数据可视化·apache superset·sql-lab·商业智能工具
__Smile°7 小时前
基于 kubeadm 搭建 k8s 集群
linux·运维·docker·云原生·容器·kubernetes
❀͜͡傀儡师7 小时前
docker安装FFmpeg
docker·容器·ffmpeg
@不会写代码的小张7 小时前
k8s核心组件——kubelet详解
云原生·容器·kubernetes
君科程序定做8 小时前
容器 vs 虚拟机
微服务·云原生·容器·服务发现