解析 Kubernetes 容器运行时
Kubernetes 已经成为容器编排调度领域的事实标准,其优良的架构不仅保证了丰富的容器编排调度功能,同时也提供了各个层次的扩展接口以满足用户的定制化需求。其中,容器运行时作为 Kubernetes 管理和运行容器的关键组件,当然也提供了简便易用的扩展接口,也就是 CRI(Container Runtime Interface)。 本文将介绍 CRI 的由来、演进以及未来展望,主要内容分为四个部分:Kubernetes架构简介、容器运行时接口的基本原理、容器运行时的演进以及未来的展望。 Kubernetes 简介 我们知道,Kubernetes是一个开源的容器集群管理系统,它的发展非常迅速,已经成为最流行和最活跃的容器编排系统。 从架构上来说,Kubernetes 的组件可以分为 Master 和 Node 两部分,其中 Master 是整个集群的大脑,所有的编排、调度、API 访问等都由 Master 来负责。 具体的来说,Master 包括以下几个组件:
而 Node 则是负责运行具体的容器,并为容器提供存储、网络等必要的功能:
除了这些核心的组件以外,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 的简单架构示意图: 你可以发现,Kubelet 也是有很多组件构成,包括
Kubelet 通过 CRI 接口跟外部容器运行时交互,而上图右侧就是 CRI 容器运行时的架构。它通常包括以下几个组件:
这样,Kubernetes 中的容器运行时按照不同的功能就可以分为三个部分:
容器运行时接口(CRI) 容器运行时接口(CRI),顾名思义,用来在 Kubernetes 扩展容器运行时,从而用户可以选择自己喜欢的容器引擎。 CRI 是基于 gPRC 的,用户不需要关心内部通信逻辑,而只需要实现定义的接口就可以,包括 RuntimeService 和 ImageService: RuntimeService负责管理Pod和容器的生命周期,而ImageService负责镜像的生命周期管理。 除了 gRPC API,CRI 还包括用于实现 streaming server 的库(用于 Exec、Attach、PortForward 等接口)和 CRI Tools。这两个稍后再作详细介绍。 基于 CRI 接口的容器运行时通常称为 CRI shim, 这是一个 gRPC Server,监听在本地的unix socket上;而kubelet作为gRPC的客户端来调用CRI接口。 另外,外部容器运行时需要自己负责管理容器的网络,推荐使用CNI,这样跟Kubernetes的网络模型保持一致。 (编辑:ASP站长网) |