kubelet, container runtime, runc
K8s 网络之深入理解 CNI
K8s 已经在很早前的 1.20 版发布之前就宣布要移除内嵌在 kubelet 中的 docker shim 的代码,大概原因就是谷歌一直在 k8s 中使用一套叫做 CRI(container runtime interface)的规范,该规范旨在定义 k8s 如何更好地操作容器技术,该规范大概分为三部分:CRI Client,CRI Server,OCI Runtime;
简单来讲,就是在 kubelet 中放一个 grpc 的客户端,这个客户端要和一个 grpc 的服务端进行通信,这个 grpc 的服务端里头进行容器管理(“拉起”,“销毁” 等动作)的调用,而真正执行 “拉起”,“销毁” 等动作的代码由 OCI Runtime 实现;
或者再简单点,对应到实现来说:CRI Client 端有个实现就是 kubelet 程序;CRI Server 端有个实现叫 Containerd 程序;OCI Runtime 有好多实现其中有个叫 runc 程序;
然后,把他们串起来就是: 1)kubelet 在做完了一些准入校验操作之后(例如 CSI 的存储卷挂载等等),要去拉起一个 pod 了,在拉起 pod 的时候,就先启动一个 grpc 的客户端,然后与 Containerd 中的 grpc 的服务端通信,告诉它说要拉起一个 pod 了; 2)然后 containerd 收到后会按照一定的流程去“拉镜像”,“创建 sandbox”,“创建 netns”,“启动容器”,“创建容器网络”,“把容器加入到 sandbox” 中等; 3)containerd 基本上只负责调用(高级运行时),真正实现这些功能的地方在 OCI 的 runc(或其他低级运行时)中,有点像是通常服务端的 controller 和 service;
Container Runtime
Container Runtime(容器运行时)是运⾏于 Kubernetes Cluster 每个节点中的服务,负责容器的整个⽣命周期;
随着容器云的发展,涌现了很多容器运⾏时。Docker 就⽬前来说是应⽤最为⼴泛的;
CRI | Container Runtime Interface
Google 为了将 kubelet 与特定的 Container Runtime 解耦(比如底层不仅只能使用 Docker 服务),于是推出 CRI(容器运⾏时接⼝,Container Runtime Interface),其是 Kubernetes 定义的⼀组 gRPC 服务;
kubelet 作为 Client,基于 gRPC 框架,通过[……]