iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何理解容器运行时CRI接口
  • 845
分享到

如何理解容器运行时CRI接口

2023-06-04 12:06:05 845人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关如何理解容器运行时CRI接口,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先会为大家介绍 CRI 接口的一个由来和它的设计;其次会和大家分享目前有哪些 CRI

这篇文章将为大家详细讲解有关如何理解容器运行时CRI接口,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

首先会为大家介绍 CRI 接口的一个由来和它的设计;其次会和大家分享目前有哪些 CRI 的实现;最后会给大家介绍一下相关的工具有哪些。

一、CRI 介绍

在 CRI 出现之前(也就是 kubernetes v1.5 之前),Docker 作为第一个容器运行时,Kubelet 通过内嵌的 dockershim 操作 Docker api 来操作容器,进而达到一个面向终态的效果。在这之后,又出现了一种新的容器运行时 - rkt,它也想要成为 Kubernetes 支持的一个容器运行时,当时它也合到了 Kubelet 的代码之中。这两个容器运行时的加入使得 Kubernetes 的代码越来越复杂、难以维护。之后 hyber.sh 加入社区,也想成为第三个容器运行时。

此时就有人站出来说,我们能不能对容器运行时的操作抽象出一个接口,将 Kubelet 代码与具体的容器运行时的实现代码解耦开,只要实现了这样一套接口,就能接入到 Kubernetes 的体系中,这就是我们后来见到的 Container Runtime Interface (CRI)。

如何理解容器运行时CRI接口

有一句话说得很好,「软件问题都可以通过加一层来解决」,我们的 CRI 就是加了这样一层。CRI 接口的通信协议是 grpc,这里的一个时代背景就是当时的 grpc 刚刚开源,此外它的性能也是优于 Http/REST 模式的。gRPC 不需要手写客户端代码和服务端代码,能够自动生成通信协议代码。

接下来我们介绍一下 CRI 接口的设计。

二、CRI 实现

CRI 接口

如何理解容器运行时CRI接口

在引入了 CRI 接口之后,Kubelet 的架构如上图所示。

跟容器最相关的一个 Manager 是 Generic Runtime Manager,就是一个通用的运行时管理器。我们可以看到目前 dockershim 还是存在于 Kubelet 的代码中的,它是当前性能最稳定的一个容器运行时的实现。remote 指的就是 CRI 接口。CRI 接口主要包含两个部分:

  • 一个是 CRI Server,即通用的比如说创建、删除容器这样的接口;

  • 另外一个是流式数据的接口 Streaming Server,比如 exec、port-forward 这些流式数据的接口。

这里需要注意的是,我们的 CNI(容器网络接口)也是在 CRI 进行操作的,因为我们在创建 Pod 的时候需要同时创建网络资源然后注入到 Pod 中。接下来就是我们的容器和镜像。我们通过具体的容器创建引擎来创建一个具体的容器。

如何理解容器运行时CRI接口

给大家介绍一下 CRI 接口的设计。我们知道 Kubernetes 的一个运作的机制是面向终态的,在每一次调协的循环中,Kubelet 会向 apiserver 获取调度到本 node 的 Pod 的数据,再做一个面向终态的处理,以达到我们预期的状态。

循环的第一步,首先通过 List 接口拿到容器的状态,再通过 Sandbox 和 Container 接口来创建容器,另外还有镜像接口用来拉取容器镜像。CRI 描述了 Kubelet 期望的容器运行时行为,主要就是我们刚刚所说的 3 个部分。

通过 CRI 操作容器的生命周期

如何理解容器运行时CRI接口

比方说我们通过 kubectl 命令来运行一个 Pod,那么 Kubelet 就会通过 CRI 执行以下操作:

  • 首先调用 RunPodSandbox 接口来创建一个 Pod 容器,Pod 容器是用来持有容器的相关资源的,比如说网络空间、PID空间、进程空间等资源;

  • 然后调用 CreatContainer 接口在 Pod 容器的空间创建业务容器;

  • 再调用 StartContainer 接口启动容器,相对应的销毁容器的接口为 StopContainer 与 RemoveContainer。

CRI streaming 接口

这里给大家介绍一下 CRI 的流式接口 exec。它可以用来在容器内部执行一个命令,又或者说可以 attach 到容器的 io 流中做各种交互式的命令。它的特别之处在于,一个是节省资源,另一个是连接的可靠性。

如何理解容器运行时CRI接口

首先 exec 操作会发送到 apiserver,经过鉴权,apiserver 将对 Kubelet Server 发起 exec 的请求,然后 Kubelet 会调用 CRI 的 exec 接口将具体的请求发至容器的运行时。这个时候,容器运行时不是直接地在 exec 接口上来服务这次请求,而是通过我们的 streaming server 来异步地返回每一次执行的结果。也就是说 apiserver 其实实际上是跟 streaming server 交互来获取我们的流式数据的。这样一来让我们的整个 CRI Server 接口更轻量、更可靠。

CRI 的一些实现

目前 CRI 的一些实现:

  • CRI-containerd

  • CRI-O

  • PouchContainer @alibaba

CRI-containerd 是目前社区中比较主流的新一代 CRI 的实现,CRI-O 来自于红帽公司,PouchContainer 是由 alibaba 实现的 CRI,其它的 CRI 实现,这里就不一一介绍了。

CRI-containerd

下图是 CRI-containerd 的架构。

如何理解容器运行时CRI接口

这套 CRI 接口是基于 containerd 实现的。在早期的实现中,CRI 其实是作为一个独立进程的,再跟 containerd 进行交互。这样一来又多了一层进程跟进程之间的开销,因此在后来的版本中 CRI 的是直接以插件的形式实现到 containerd 中的,成为了 containerd 的一部分,从而能够可插拔地使用 CRI 接口。

整个架构看起来非常直观。这里的 Meta services、Runtime service 与 Storage service 都是 containerd 提供的接口。它们是通用的容器相关的接口,包括镜像管理、容器运行时管理等。CRI 在这之上包装了一个 gRPC 的服务。右侧就是具体的容器的实现,比如说,创建容器时就要创建具体的 runtime 和它的 shim,它们和 Container 一起组成了一个 Pod Sandbox。

CRI-containerd 的一个好处是,containerd 还额外实现了更丰富的容器接口,所以它可以用 containerd 提供的 ctr 工具来调用这些丰富的容器运行时接口,而不只是 CRI 接口。

CRI-O

下图是 CRI-O 的实现思路。

如何理解容器运行时CRI接口

它是通过直接在 OCI 上包装容器接口来实现的一个 CRI 服务。它对外提供的只有具体的 CRI 接口,没有我们前面所提到的 containerd 提供的更丰富的接口。它主要包含两个部分,首先是对容器 runtime 的管理,另一个是对镜像的管理。

三、相关工具

下面给大家介绍一下 CRI 相关的工具。这几个工具都在特别兴趣小组的一个项目里面。

  • crictl

它是一个类似 docker 的命令行工具,用来操作 CRI 接口。它能够帮助用户和开发者调试容器问题,而不是通过 apply 一个 yaml 到 apiserver、再通过 Kubelet 操作的方式来调试。这样的链路太长,而这个命令行工具可以直接操作 CRI。

  • critest

用于验证 CRI 接口行为是否是符合预期的。

  • 性能工具

还有一些性能工具用来测试接口性能。

四、思考时间

  1. 目前 CRI 接口处于 v1 alpha2 版本,CRI 规范能不能更完善?

CRI 标准的制定是至上而下的,通过 Kubernetes 的一些 feature 反向地要求 CRI 提供这样的功能,进而完善 CRI 规范。

  1. 如何通过 annotation 方式自定义 runtime 行为?

我们目前的 CRI 肯定不能满足所有用户的需求,很多公司可能会对 CRI 接口做一些增强、定制,比如说 alibaba。最简单的方式是通过 annotation 来自定义 runtime 的行为。在每个接口都设置一个 annotation 的字段,容器运行时通过理解这些字段来去自定义 runtime 的行为。同学们可以尝试去在各个 CRI 接口中通过识别 annotation 的方式来达到自定义 runtime 行为的目的。

关于如何理解容器运行时CRI接口就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何理解容器运行时CRI接口

本文链接: https://www.lsjlt.com/news/237946.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解容器运行时CRI接口
    这篇文章将为大家详细讲解有关如何理解容器运行时CRI接口,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先会为大家介绍 CRI 接口的一个由来和它的设计;其次会和大家分享目前有哪些 CRI ...
    99+
    2023-06-04
  • 如何理解Go运行时中的Mutex
    这篇文章主要讲解了“如何理解Go运行时中的Mutex”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Go运行时中的Mutex”吧!sync.Mutex...
    99+
    2022-10-19
  • 如何解决Laravel使用Windows docker运行php容器及mysql容器时连不起数据库问题
    小编给大家分享一下如何解决Laravel使用Windows docker运行php容器及mysql容器时连不起数据库问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!问题Laravel 项目 使用 Windows dock...
    99+
    2023-06-14
  • Go语言中如何使用接口来管理容器?
    在Go语言中,使用接口来管理容器是非常常见的。接口是一种抽象类型,它定义了一组方法签名,但是没有实现这些方法。这使得我们可以定义一个通用的接口,然后在不同的容器类型中实现这些方法,从而使得我们的代码更加模块化和可重用。 在本文中,我们将学...
    99+
    2023-09-29
    接口 容器 函数
  • 如何理解Java虚拟机运行时数据区域
    这期内容当中小编将会给大家带来有关如何理解Java虚拟机运行时数据区域,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、程序计数器(Program Counter Register)当前线程所执行的字节码...
    99+
    2023-06-05
  • 如何理解Web服务器网关接口
    这篇文章给大家介绍如何理解Web服务器网关接口,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python 社区当然也需要这样一套 API,来适配Web服务器和应用程序,这套 API 就...
    99+
    2022-10-19
  • NumPy如何优化ASP接口容器中的数据处理?
    在今天的数据处理领域中,NumPy已经成为了不可或缺的工具。NumPy是Python语言中用于科学计算的一个库,它提供了高级的数据结构以及简单易用的接口,让用户可以轻松地进行数据处理和分析。在ASP接口容器中,NumPy更是有着不可替代的...
    99+
    2023-09-15
    接口 容器 numpy
  • 如何在 Go 中使用接口来管理对象容器?
    Go 是一种强类型、编译型的语言,它支持面向对象编程,其中接口是 Go 中一个非常重要的概念。接口提供了一种将方法与具体类型分离的方式,从而使得代码更加灵活、可扩展和易于维护。在本文中,我们将介绍如何使用接口来管理对象容器。 接口简介 在 ...
    99+
    2023-07-03
    对象 容器 接口
  • Linux 容器发行版CoreOS如何理解
    Linux 容器发行版CoreOS如何理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CoreOS,一款最新的 Linux 发行版本,支持自动升级内核软件,提...
    99+
    2023-06-28
  • Go 语言中如何优雅地处理对象容器接口?
    Go 语言是一门非常适合并发编程的语言,其高效的并发机制和简洁的语法深受开发者欢迎。在开发过程中,我们常常需要使用对象容器来管理数据,例如列表、栈、队列等等。本文将介绍如何在 Go 语言中优雅地处理对象容器接口。 Go 语言中的接口 在 ...
    99+
    2023-07-03
    对象 容器 接口
  • 一文讲解如何获取k8s容器里运行的jar包
    目录01 引言02 从镜像信息获取03 进入容器获取(推荐)04 文末01 引言 在k8s上运行了第三方的应用,很多时候我们都想知道运行流程,一般都会从k8s容器中获取jar包。 那...
    99+
    2022-11-13
  • Mybatis如何通过接口实现sql执行原理解析
    目录1、环境搭建2、动态代理类的生成3、MapperProxy 增强 mapper 接口3.1、cachedInvoker(method)3.2、MapperMethod3.2.1、...
    99+
    2023-01-28
    mybatis sql执行 mybatis接口
  • 如何在ASP接口容器中使用NumPy进行数据可视化?
    在数据科学领域,NumPy是一个非常强大的Python库,它提供了高效的数组操作和数学函数。在数据可视化方面,Matplotlib是一种流行的Python绘图库,它可以生成各种类型的图表,包括散点图、线图、柱状图等等。在本文中,我们将介绍...
    99+
    2023-09-15
    接口 容器 numpy
  • 深入探讨Java接口和容器:如何更好地管理文件?
    Java作为一种面向对象编程语言,拥有着非常强大的接口和容器的功能。接口是一种特殊的类,它定义了一组抽象方法,不包含任何实现。容器是一种可以存储多个对象的数据结构,Java中最常用的容器包括List、Set、Map等。在Java中,接口和容...
    99+
    2023-11-04
    接口 容器 文件
  • 如何通过NumPy优化ASP接口容器中的大规模数据处理?
    NumPy是Python中一个非常强大的数学计算库,它可以帮助我们高效地处理大规模的数据。在ASP接口容器中,我们经常需要处理海量的数据,因此使用NumPy可以大大提高我们的数据处理效率。下面是一些通过NumPy优化ASP接口容器中的大规模...
    99+
    2023-09-15
    接口 容器 numpy
  • 如何在ASP接口容器中使用NumPy进行科学计算和数据分析?
    在ASP.NET环境下,我们经常会使用C#或VB.NET进行开发,这些语言都是强类型语言,但是对于一些需要进行科学计算和数据分析的应用程序,使用强类型语言进行开发可能会比较困难。此时,我们可以考虑使用NumPy这个科学计算库。 NumPy...
    99+
    2023-09-15
    接口 容器 numpy
  • 如何在容器中运行GO语言程序,实现文件处理操作?
    在现代软件开发中,容器技术已经成为了一个不可或缺的组成部分。容器可以帮助开发人员将应用程序与其依赖项打包到一个单独的可移植容器中,从而加快应用程序的部署和管理。而在容器中运行Go语言程序也是一种流行的方式。在本文中,我们将介绍如何在容器中运...
    99+
    2023-08-03
    http 容器 文件
  • Windows容器中的GO语言自然语言处理:如何实现高效运行?
    自然语言处理(NLP)是人工智能领域中非常重要的一个分支。它涉及到计算机如何理解和处理人类自然语言的能力。近年来,随着大数据和云计算技术的不断发展,NLP技术得到了广泛的应用。在本文中,我们将介绍如何在Windows容器中使用GO语言实现...
    99+
    2023-07-08
    自然语言处理 windows 容器
  • 了解如何在ASP容器中实时使用Git进行版本控制
    在现代软件开发中,版本控制是必不可少的工具。Git是一款非常流行的版本控制系统,可以帮助开发人员跟踪代码变更、管理代码版本以及协同开发。在ASP容器中使用Git可以使开发人员更加高效地管理代码,本文将详细介绍如何在ASP容器中实时使用Gi...
    99+
    2023-08-28
    容器 实时 git
  • 详解Java是如何通过接口来创建代理并进行http请求
    场景 现在想要做这么一个事情,公司的dubbo服务都是内网的,但是提供了一个对外的出口,通过链接就能请求到对应的dubbo服务。(具体怎么做的应该就是个网关,然后将http请求转为d...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作