专栏首页Jerry的SAP技术分享什么是Kubernetes的CRI - 容器运行时接口

什么是Kubernetes的CRI - 容器运行时接口

我们都知道Kubernetes不会直接和容器打交道,Kubernetes的使用者能接触到的概念只有pod,而pod里包含了多个容器。当我们在Kubernetes里用kubectl执行各种命令时,Kubernetes工作节点如何悄悄地为我们生成底层的容器呢?

这一切是通过Kubernetes工作节点里所谓“容器运行时”的软件在起作用。大家最熟悉的容器运行时软件当然是Docker,然而Docker只是Kubernetes支持的容器运行时技术的一种。

为了让Kubernetes不和某种特定的容器运行时技术绑死,而是能无需重新编译源代码就能够支持多种容器运行时技术的替换,和我们面向对象设计中引入接口作为抽象层一样,在Kubernetes和容器运行时之间我们引入了一个抽象层,即容器运行时接口。

在CRI还没有问世的Kubernetes早期版本里,比如1.3版本里,添加了对另一个容器运行时技术rkt的支持,即rktnetes项目。

这个项目虽然让Kubernetes增加了除Docker之外的另一种容器运行时的支持,然而这种增强的实现方式是通过直接修改kubelet实现源代码进行的,需要贡献者非常熟悉kubelet内部原理,开发门槛较高。

为了实现一个真正支持可插拔替换的容器运行时的机制,Kubernetes引入了CRI的概念。

有了CRI后,kubelet不再直接和容器运行时交互,而是通过CRI这个中间层。

如上图所示,kubelet和CRI通过Unix 套接字或者gRPC框架进行通信。

上图中的CRI protobuf意思是protocol buffers API,包含了两个gRPC服务:ImageService和RuntimeService。

首先什么是gRPC呢?

这个链接里有介绍: https://hub.docker.com/r/grpc/go

gRPC是一个高性能开源的通用RPC(Remote Procedure Call)框架,优先考虑和充分利用了移动和HTTP/2.0, 在很多编程语言里都有对应的实现。

ImageService提供了从镜像仓库拉取、查看、和移除镜像的RPC。如此一来,kubelet根本不用操心底层容器使用的是Docker还是rkt还是其他容器,kubelet只需要调用gRPC客户端,gRPC客户端再进行RPC调用,从ImageService那里执行容器镜像操作,并将应答返回给kubelet。通过引入这个中间层,容器运行时的具体实现对kbelet就是完全透明的了。

ImageService解决了容器镜像管理这一静态需求,而另一个RuntimeSerivce,故名思议,包含了Pods和容器生命周期管理(增删改查)的RPC,以及跟容器交互的调用(exec/attach/port-forward)等等。

这个问题的解决思路再次体现了《代码大全2》里提到的那句经典名言:

any problem in computer science can be sloved by another layer of indirecition

计算机科学领域的任何问题都可以通过增加一个中间层来解决

相信这种引用抽象层来隔离变化,隔离实现细节的思路对大家平时工作做设计也一定大有帮助。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot 应用容器化之 Docker、Gradle

    Docker 是一个 Linux 容器管理工具包,具备“社交”方面,允许用户发布容器的 image (镜像),并使用别人发布的 image。Docker ima...

    JAVA葵花宝典
  • 为Kubernetes集群部署本地镜像仓库

     经过之前两篇文章:Centos7部署Kubernetes集群、基于kubernetes集群部署DashBoard,我们基本上已经能够在k8s的集群上部署一个应...

    用户1263954
  • 基于kubernetes集群部署DashBoard

      在dashboard.yaml中定义了dashboard所用的镜像:gcr.io/google_containers/kubernetes-dashboar...

    用户1263954
  • 微服务为什么一定要用docker

    早在2013年的时候,docker就已经发行,然而那会还是很少人了解docker。一直到2014年,Martin Fowler提出了微服务的概念,两个不相干的技...

    JAVA葵花宝典
  • 使用docker部署spring cloud项目详细步骤

    (1)到Oracle官网下载好 jdk-8u181-linux-x64.tar.gz 备用 (2)卸载系统自带的java

    JAVA葵花宝典
  • 使用Docker和Kubernetes将MongoDB作为微服务运行

    MongoDB是NoSQL排名第一的数据库,Docker是最流行的容器引擎,Kubernetes是谷歌开源的容器编排工具!Kubernetes和Docker使M...

    MongoDB中文社区
  • 制作java基础docker镜像

    选择底层操作系统 通常是从一个底层的操作系统来开始构建一个Docker镜像的,也就是Dockerfile的FROM指令提及的。在某些情况下,你也许会从一个已有的...

    三杯水Plus
  • Centos7部署Kubernetes集群

    yum安装的etcd默认配置文件在/etc/etcd/etcd.conf。编辑配置文件,更改以下带颜色部分信息:

    用户1263954
  • docker 单机配置redis主从集群 集群 前置准备

    该文是docker redis主从配置 正式部署的前言。如下会简要列出目录,需要了解的前置知识,以防配置时出错。 如果你还不够了解,就阅读正文的相应章节。

    平凡的学生族
  • Tensorflow的安装

    Protocol Buffer是谷歌开发的处理结构化数据的工具,类似于XML和JSON这两种比较常用的结构化数据处理工具。但是Protocal Buffer格式...

    foochane

扫码关注云+社区

领取腾讯云代金券