本文将介绍 CRI 的由来、演进以及未来展望,主要内容分为四个部分:Kubernetes架构简介、容器运行时接口的基本原理、容器运行时的演进以及未来的展望。
Kubernetes 简介
我们知道,Kubernetes是一个开源的容器集群管理系统,它的发展非常迅速,已经成为***和最活跃的容器编排系统。
从架构上来说,Kubernetes 的组件可以分为 Master 和 Node 两部分,其中 Master 是整个集群的大脑,所有的编排、调度、API 访问等都由 Master 来负责。
具体的来说,Master 包括以下几个组件:
- etcd 保存了整个集群的状态。
- kube-apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制。
- kube-controller-manager 负责维护集群的状态,包括很多资源的控制器,是保证 Kubernetes 声明式 API 工作的大脑。
- kube-scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的 Node 上;
而 Node 则是负责运行具体的容器,并为容器提供存储、网络等必要的功能:
- kubelet 负责维持容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理;
- Container runtime 负责镜像管理以及 Pod 和容器的真正运行。Kubelet 默认的容器运行时为 Docker;
- kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡
- Network plugin 也就基于 CNI(Container Network Internface)负责为容器配置网络。
除了这些核心的组件以外,Kubernetes 当然还包含了很多丰富的功能,这些都是通过扩展(Addon)的方式来部署的。比如 kube-dns 和 metrics-server 等,都是以容器的方式部署在集群里面,并提供 API 给其他组件调用。
提示:在 Kubernetes 中,通常你可以听到两种不同类型的扩展 Kubernetes 功能的方式:1) ***种是扩展(Addon),比如 dashboard、EFK、Prometheus、各种 Operator 等,这些扩展不需要 Kubernetes 提供标准的接口,但是都为 Kubernetes 增加了新的功能特性;2) 还有一种方式则是插件(Plugin),比如 CNI、CRI、CSI、Device Plugin 等,这些都是 Kubernetes 各个核心组件提供了标准的内置接口,而外部插件则是实现这些接口,从而将 Kubernetes 扩展到更多的用例场景中。
Kubelet 架构
刚才提到,Kubelet 负责维持容器的生命周期。除此之外,它也配合 kube-controller-manager 管理容器的存储卷,并配合 CNI 管理容器的网络。下面就是 Kubelet 的简单架构示意图: