CRI (容器运行时接口)

了解CRI之前,我们先了解一下什么是RPC

什么是RPC

概述

一种常用的通信机制,运行程序调用位于远程计算机上的行数或方法,就像调用本地对象一眼。RPC抽象了底层的网络通信细节,使得开发者可以更加专注与业务逻辑的开发,不必过多担心网络相关性的复杂性。

RPC工作原理

客户端调用过程

  1. 客户端程序调用一个本地的存根(stub)函数,这个存根代表远程函数
  2. 存根将函数调用的参数打包成一个消息,通过网络发送给服务端
  3. 客户端等待服务端响应

服务端处理过程

  1. 服务器收到消息,解包得到调用参数。
  2. 服务端调用本地实际函数,执行必要的处理。
  3. 处理完毕后,服务端将结果打包并发送回客户端。

    客户端接收过程

  4. 客户端存根收到响应消息,解包得到结果
  5. 客户端的调用像本地执行一样,得到从远程服务器返回的结果。

RPC特点

  • 封装:隐藏网络通信细节,开发者无需直接处理socket编程或其他通信协议细节
  • 同步:默认同步,即客户端调用一个远程方法时候,回阻塞知道得到结果,尽管如此,许多现代RPC框架支持异步调用。
  • 透明:

常见的RPC框架

  • Finagle:一个构建高并发,分布式系统的异步RPC库,用Scala语言编写,但可以与其他JVM语言一起使用,适合用于高扩展,弹性和容错(异步编程模型,有效地处理大量并发请求,不会阻塞线程,支持多种协议,内置负载均衡)

  • gRPC:由Google开发,基于HTTP/2协议,支持多种语言,能够提供高性能的通信。gRPC使用Protocol Buffers作为其接口定义语言和消息序列化格式。

  • Apache Thrift:由Facebook开发,支持跨语言服务的开发,使用自定义的IDL (Interface Definition Language) 来定义数据类型和服务接口。

  • JSON-RPC和XML-RPC:这些是较轻量级的RPC实现,使用JSON和XML格式分别进行数据序列化,易于与Web技术集成。

RPC应用场景

  • 微服务架构:在微服务架构中,各个服务组件常常需要进行网络通信,RPC提供了一种高效的方式来实现服务间的调用。

  • 分布式计算:在需要多个节点共同完成计算任务的场景中,RPC可以用来协调各个节点之间的工作。

让我再在了解CRI之前,先清楚什么是容器的执行以及生命周期

容器执行和生命周期

容器的执行和生命周期是指容器从创建到终止的整个过程,涉及到创建,启动,运行,停止和删除。

  • 创建(Pre-production/Planning):
    就像电影制作前的筹备阶段,需要确定剧本、演员、场地等。在 Kubernetes 中,创建容器涉及配置容器的环境,如定义容器的镜像、资源限制(CPU、内存)、网络设置等。
  • 启动(Production/Shooting):
    类似于电影开始拍摄。容器的启动阶段是指实际上将容器镜像运行起来。在这个阶段,容器内部的应用开始执行其预定任务,比如启动一个 Web 服务器、数据库服务等。
  • 运行(Release/Screening):
    就像电影的放映过程。容器成功启动后,它会进入运行状态。在这个阶段,容器内的应用对外提供服务,如处理网络请求、执行数据处理等。
  • 停止(Ending):
    类似于电影放映结束。当容器需要更新或不再需要时,它会被停止。停止容器通常意味着停止容器内部的应用进程。
  • 删除(Post-production/Cleanup):
    就像电影拍摄后的清理阶段。在容器的生命周期的最后阶段,容器会被彻底删除,包括其在节点上的所有数据。这确保了不会留下无用的资源或数据。

生命周期钩子

允许用户在容器的特殊阶段进行自定义操作。

PostStart

PostSrart是在容器创建并启动后立即执行的钩子,这个钩子的执行时间是容器入口命令开始执行之后,但是并不保证是容器的应用程序完全启动之后再再执行。

ps:若是PostStart钩子启动失败,那么容器不会被杀死或者重启,钩子启动失败的记录会写入日志中。

PreStop

PreStop是容器被终止钱执行的钩子。当k8s需要停止容器时,首先调用PreStop钩子,然后才会执行容器的终止过程。经常用于优雅的关闭应用程序,保存状态,执行清理任务。

ps:钩子是会延迟容器的终止过程的,因为k8s会等待钩子执行完成后才会发送SIGTERM信号停止容器。

CRI是什么

简单理解的话可以理解成一个适配器,就是为了管理不同容器运行时进行交互的一套标准接口。主要的作用是为了解决k8s直接依赖特定容器运行时的问题。主要是启动停止容器,拉取容器镜像,查询容器状态,管理容器生命周期。

  1. 统一接口是通过RPC内gRPC框架实现的。
  2. 解耦合,完成了k8s与docker直接集成的紧密耦合关系。
  3. 可以让开发者通过自我需求或喜爱来选择合适的容器进行时。

为什么使用gRPC

  • 首先是使用了能够适应高并发低延迟的通信的HTTP/2,再头部压缩和多路复用请求等高效传输机制。
  • gRPC支持双向流,允许服务器和客户端再长连接中实时发送和接受消息。

只有了解这么多了,gRPC还有很多有用的功能,适用场景也比较广,可能日后碰上这种场景后再继续了解。