| 副标题[/!--empirenews.page--] Kubernetes  已经成为容器编排调度领域的事实标准,其优良的架构不仅保证了丰富的容器编排调度功能,同时也提供了各个层次的扩展接口以满足用户的定制化需求。其中,容器运行时作为  Kubernetes 管理和运行容器的关键组件,当然也提供了简便易用的扩展接口,也就是 CRI(Container Runtime  Interface)。 
 本文将介绍 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 的简单架构示意图:  
 你可以发现,Kubelet 也是有很多组件构成,包括 
    Kubelet Server 对外提供 API,供 kube-apiserver、metrics-server 等服务调用。比如 kubectl exec  需要通过 Kubelet API /exec/{token} 与容器进行交互。Container Manager 管理容器的各种资源,比如 cgroups、QoS、cpuset、device 等。Volume Manager 管理容器的存储卷,比如格式化磁盘、挂载到 Node 本地、最后再将挂载路径传给容器。Eviction 负责容器的驱逐,比如在资源不足时驱逐优先级低的容器,保证高优先级容器的运行。cAdvisor 负责为容器提供 metrics 数据源。Metrics 和 stats 提供容器和节点的度量数据,比如 metrics-server 通过 /stats/summary 提取的度量数据是 HPA  自动扩展的依据。再向下就是 Generic Runtime Manager,这是容器运行时的管理者,负责跟 CRI 交互,完成容器和镜像的管理。在 CRI 之下,包括两种容器运行时的实现一个是内置的 dockershim,实现了 docker 容器引擎的支持以及 CNI 网络插件(包括 kubenet)的支持另一个就是外部的容器运行时,用来支持 runc、containerd、gvisor 等外部容器运行时。 Kubelet 通过 CRI 接口跟外部容器运行时交互,而上图右侧就是 CRI 容器运行时的架构。它通常包括以下几个组件: 
    CRI Server,这是 CRI gRPC server,监听在 unix socket 上面。在讨论容器运行时的时候,这个 Server 也通常成为  CRI shim(夹在容器引擎和Kubelet之间的一层)。Streaming Server,提供 streaming API,用在 Exec、Attach、Port Forward 等流式接口上。容器和镜像的管理,比如拉取镜像、创建和启动容器等。CNI 网络插件的支持,用于给容器配置网络。最后是容器引擎(Container Engine)的管理,比如支持 runc 、containerd 或者支持多个容器引擎。 这样,Kubernetes 中的容器运行时按照不同的功能就可以分为三个部分: 
    第一个是 Kubelet 中容器运行时的管理模块 Generic Runtime Manager,它通过 CRI 来管理容器和镜像。第二个是容器运行时接口,是 Kubelet 与外部容器运行时的通信接口。第三个是具体的容器运行时实现,包括 Kubelet 内置的 dockershim 以及外部的容器运行时(如 cri-o、cri-containerd  等)。 容器运行时接口(CRI) 容器运行时接口(CRI),顾名思义,用来在 Kubernetes 扩展容器运行时,从而用户可以选择自己喜欢的容器引擎。 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |