我们都知道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

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

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

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

什么是Kubernetes的CRI - 容器运行时接口相关推荐

  1. 课时 28:理解容器运行时接口 CRI(知谨)

    CRI 是 Kubernetes 体系中跟容器打交道的一个非常重要的部分.本文将主要分享以下三方面的内容: CRI 介绍 CRI 实现 相关工具 CRI 介绍 在 CRI 出现之前(也就是 Kuber ...

  2. 从零开始入门 K8s | 理解容器运行时接口 CRI

    作者 | 知谨 阿里云工程师 本文整理自<CNCF x Alibaba 云原生技术公开课>第 28 讲,点击直达课程页面. 关注"阿里巴巴云原生"公众号,回复关键词** ...

  3. 【容器运行时】一文理解 OCI、runc、containerd、docker、shim进程、cri、kubelet 之间的关系

    参考 docker,containerd,runc,docker-shim 之间的关系 Containerd shim 进程 PPID 之谜 内核大神教你从 Linux 进程的角度看 Docker R ...

  4. 关于容器和容器运行时的那些事

    转载本文需注明出处:微信公众号EAWorld,违者必究. 前言: 容器,容器编排,微服务,云原生,这些无疑都是当下软件开发领域里面最热门的术语.容器技术的出现并迅速的广泛应用于软件开发的各个领域里,主 ...

  5. 1.Containerd容器运行时初识与尝试

    0x00 前言简述 1.基础介绍 2.专业术语 3.架构简述 0x01 安装配置 1.Ubuntu安装Containerd.io流程 0x02 简单使用 1.镜像拉取与运行 2.创建和使用网络 3.与 ...

  6. 云原生钻石课程 | 第1课:容器运行时技术深度剖析

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...

  7. 部署一个 Containerd 容器运行时的 Kubernetes 集群

    前面我们介绍了 containerd 的基本使用,也了解了如何将现有 docker 容器运行时的 Kubernetes 集群切换成 containerd,接下来我们使用 kubeadm 从头搭建一个使 ...

  8. Colima:MacOS 上的极简容器运行时和 Kubernetes

    作者 | Addo Zhang 来源 | 云原生指北 Colima 是一个以最小化设置来在MacOS上运行容器运行时和 Kubernetes 的工具.支持 m1,同样也支持 Linux. Colima ...

  9. 课时 30:理解 RuntimeClass 与使用多容器运行时(贾之光)

    本文将主要分享以下三方面的内容: RuntimeClass 需求来源 RuntimeClass 功能介绍 多容器运行时示例 RuntimeClass 需求来源 容器运行时的演进过程 我们首先了解一下容 ...

最新文章

  1. 利用Powershell SSH-Session 工具管理 linux或网络设备
  2. macsv服务器状态,和利时macs问题(启动服务器无法读出控制器的点名)
  3. python在读写文件之前需要创建文件对象-python基础教程:文件读写
  4. IOS开发之下拉刷新和上拉加载更多
  5. 如何滚动更新 Service?- 每天5分钟玩转 Docker 容器技术(102)
  6. L2-035 完全二叉树的层序遍历 (25 分)-PAT 团体程序设计天梯赛 GPLT
  7. bzoj 1627: [Usaco2007 Dec]穿越泥地(BFS)
  8. 读取android项目assets目录下的txt文件.
  9. ASP.NET 控件开发速成教程:生成复合控件
  10. python爬虫之BeautifulSoup4基础教程
  11. win10系统安装虚拟机
  12. Microsoft SQL Server 2008 R2出现索引超出数组界限
  13. 【每日函数】每日函数(2021.08.22)
  14. 打游戏 cpu占用率多少是正常的_游戏玩家的CPU选择
  15. HTML和css页眉制作,静态网页制作(Dreamweaver) 设计和制作网站首页 0203-静态网页制作(Dreamweaver)-设计制作网站首页页眉、导航栏.doc...
  16. android热修复技术tinker,Android热修复方案第一弹——Tinker篇
  17. CAD怎么进行给水计算?CAD给水计算教程
  18. 计算机加入域的一种方法
  19. JavaSE学习笔记-08
  20. nvcc fatal : No input files specified; use option --help for more information

热门文章

  1. 使用mvn插件surefire 执行工程单元测试 出现OOM的解决分析
  2. 文献记录(part84)--A nearest neighbor-based active learning method and its application to time ...
  3. 探索Julia(part9)--字符串处理
  4. python基础(part12)--模块
  5. pymysql(part4)--mysql存储图片信息
  6. GIT项目管理工具(part4)--提交文件暂存记录及同步文件至本地仓库
  7. python质数n以内_用Python寻找前n个质数
  8. SAP Spartacus 中的 Commands and queries
  9. 关于 ng-template 通过 @input 传入另一个 Component 不能工作的问题调试
  10. Rxjs of() 和 of({}) 的区别