技术解析系列| PouchContainer CRI的设计与实现

  

技术解析系列| PouchContainer CRI的设计与实现

  
      <李> CRI简介
    在每个Kubernetes节点的最底层都有一个程序负责具体的容器创建删除工作,Kubernetes会对其接口进行调用,从而完成容器的编排调度。我们将这一层软件称之为容器运行时(容器运行时),大名鼎鼎的码头工人就是其中的代表。   
  

当然,容器运行时并非只有码头工人一种,包括CoreOS的rkt, hyper.sh的runV,谷歌的gvisor,以及本文的主角PouchContainer,都包含了完整的容器操作,能够用来创建特性各异的容器。不同的容器运行时有着各自独特的优点,能够满足不同用户的需求,因此Kubernetes支持多种容器运行时势在必行。

  

最初,Kubernetes原生内置了对码头工人的调用接口,之后社区又在Kubernetes 1.3中集成了rkt的接口,使其成为了码头工人以外,另一个可选的容器运行时。不过,此时不论是对于码头工人还是对于rkt的调用都是和Kubernetes的核心代码强耦合的,这无疑会带来如下两方面的问题:

  

新兴的容器运行时,例如PouchContainer这样的后起之秀,加入Kubernetes生态难度颇大。容器运行时的开发者必须对于Kubernetes的代码(至少是Kubelet)有着非常深入的理解,才能顺利完成两者之间的对接。

  

Kubernetes的代码将更加难以维护,这也体现在两方面:(1)将各种容器运行时的调用接口全部硬编码进Kubernetes,会让Kubernetes的核心代码变得臃肿不堪,(2)容器运行时接口细微的改动都会引发Kubernetes核心代码的修改,增加Kubernetes的不稳定性

  

为了解决这些问题,社区在Kubernetes 1.5引入了CRI(容器运行时界面),通过定义一组容器运行时的公共接口将Kubernetes对于各种容器运行时的调用接口屏蔽至核心代码以外,Kubernetes核心代码只对该抽象接口层进行调用。而对于各种容器运行时,只要满足了中国国际广播电台中定义的各个接口就能顺利接入Kubernetes,成为其中的一个容器运行时选项。方案虽然简单,但是对于Kubernetes社区维护者和容器运行时开发者来说,都是一种解放。

     <李> CRI设计概述李      

技术解析系列| PouchContainer CRI的设计与实现“> <br/>如上图所示,左边的Kubelet是Kubernetes集群的节点代理,它会对本节点上容器的状态进行监控,保证它们都按照预期状态运行。为了实现这一目标,Kubelet会不断调用相关的CRI接口来对容器进行同步。</p>
  <p> CRI垫片则可以认为是一个接口转换层,它会将国际接口,转换成对应底层容器运行时的接口,并调用执行,返回结果。对于有的容器运行时,CRI垫片是作为一个独立的进程存在的,例如当选用码头工人为Kubernetes的容器运行时,Kubelet初始化时,会附带启动一个码头工人垫片进程,它就是码头工人的CRI shime。而对于PouchContainer,它的CRI垫片则是内嵌在Pouchd中的,我们将其称之为中国国际广播电台经理。关于这一点,我们会在下一节讨论PouchContainer相关架构时再详细叙述。</p>
  <p> CRI本质上是一套gRPC接口,Kubelet内置了一个gRPC客户机,CRI垫片中则内置了一个gRPC Server.Kubelet每一次对中国国际广播电台接口的调用,都将转换为gRPC请求由gRPC客户发送给CRI垫片中的gRPC Server.Server调用底层的容器运行时对请求进行处理并返回结果,由此完成一次国际接口调用。</p>
  <p> CRI定义的gRPC接口可划分两类,ImageService和RuntimeService:其中ImageService负责管理容器的镜像,而RuntimeService则负责对容器生命周期进行管理以及与容器进行交互(exec/高度/左前)。</p>
  <ol开始=   <李> CRI经理架构设计李      

技术解析系列| PouchContainer CRI的设计与实现“> <br/>在PouchContainer的整个架构体系中,中国国际广播电台经理实现了CRI定义的全部接口,担任了PouchContainer中CRI垫片的角色。当Kubelet调用一个国际接口时,请求就会通过Kubelet的gRPC客户发送到上图的gRPC服务器中.Server会对请求进行解析,并调用国际经理相应的方法进行处理。</p>
  <p>我们先通过一个例子来简单了解一下各个模块的功能,例如,当到达的请求为创建一个仓,那么CRI经理会先将获取到的CRI格式的配置转换成符合PouchContainer接口要求的格式,调用图像经理拉取所需的镜像,再调用容器管理创建所需的容器,并调用有限公司经理,利用CNI插件对吊舱的网络进行配置。最后,流服务器会对交互类型的CRI请求,例如exec/高度/portforward进行处理。<h2 class=技术解析系列| PouchContainer CRI的设计与实现