【基础架构】K8S CRI解析

原文:https://mp.weixin.qq.com/s?__biz=MzA4MjM3NzE5MQ==&mid=2649662341&idx=1&sn=0d4483c9bc7a7fa999ec8e07644d6a6e&chksm=879ca30db0eb2a1bad05830327fe3003a45c2a550725145e97a387c45bdfc731f42605dc557f&cur_album_id=1987595953092034565&scene=189#wechat_redirect

一、Kubernetes简介

  Kubernetes是一款基础设施平台,可实现对多种不同计算资源(例如虚拟、物理机)进行分组,使其呈现为同一个的巨量计算资源,从而为应用程序使用或与其他人共享提供支撑。在这样的架构中,Docker(或者容器运行时)仅用于通过Kubernetes控制平面进行调度,从而在实际主机内运行应用程序。

 

   基于上图,可以看出:每个Kubernetes节点都与控制平面彼此通信。各个节点上的Kubelet获取元数据,并执行CRI以在该节点上运行容器的Create与Destroy。

  在Kubernetes v1.5之前,Docker作为第一个并且独一无二的容器运行时,Kubelet通过内嵌的dockershim操作Docker API来操作容器,进而达到一个面向终态的效果。后来,随着Rocket、Hyber以及其他“新品种”的加入,使得K8s变得复杂、更加难以维护,于是Container Runtime Interface(CRI)接口标准出现。

  CRI接口的通信协议是gRPC,gRPC性能也是优于http/REST模式。gRPC不需要手写客户端代码和服务端代码,能够自动生成通信协议代码。CRI接口引入后的Kubelet架构如下:

  

 

  基于上图解析:Generic Runtime Manager,一个通用的运行时管理器。 Remote指的是CRI接口,CRI接口主要包含两个部分:

  (1)CRI Server,即通用的接口(创建、删除容器等);

  (2)Streaming Server,流式数据接口,比如exec、port-forawrd这些流式数据接口。

  除此,CNI(容器网络接口)也是在CRI进行操作的,在创建Pod时需要同时创建网络资源然后注入到Pod中。目前CRI运行时的实现方案主要基于以下两种:

  (1)containerd:全开源软件

  (2)CRI-O:纯CRI运行时,不包含除CRI之外的任何其他内容。

 

二、CRI设计

  以具体的容器引擎创建容器为例,描述CRI的行为。

  

 

   K8s的运作机制是面向终态的,在每一次调协的循环中,Kubelet会向Apiserver获取调度到本Node的Pod的数据,再做一个面向终态的处理,以达到我们预期的状态。第一步,首先通过List接口拿到容器的状态,再通过Sndbox和Container接口来创建容器,另外还有镜像接口用来拉取容器镜像。CRI描述了Kubelet期望的容器运行时行为。

  通常,我们通过kubectl命令来运行一个Pod,那么kubelet就会通过CRI执行以下相关操作:

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

  (2)然后调用CreateContainer接口在Pod容器的空间创建业务容器;

  (3)其次再调用StartContainer接口启动容器,相对应的销毁容器接口StopContainer与RemoveContainer。

  

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

 

 

简要流程如下:

  1、首先exec操作会发送到Apiserver,经过鉴权,Apiserver将对Kubelet Server发起exec请求;

  2、Kubelet调用CRI的exec接口将具体的请求发送至容器的运行时。容器运行时不直接在exec接口上服务这次请求,而是通过Streaming Server来异步地返回每一次执行的结果,即Apiserver实际上是通过Streaming Server交互来获取流式数据。

  整个CRI的工作流:

  

 

 

  CRI运行时从kubelet获取gRPC请求,然后根据规范创建OCI json配置。

  OCI运行时负责使用Linux内核系统调用(例如cgroups与命名空间)并生成容器。

  目前CRI的一些具体实现技术:

  (1)CRI-containerd:主流

  (2)CRI-O:redhat开发

  (3)PouchContainer:alibaba实现

posted @ 2022-07-15 16:45  stay_heart  阅读(403)  评论(0)    收藏  举报