Kubernetes 如何与容器运行时一起工作
# 1. Kubernetes 架构
在详细介绍 Kubernetes 如何使用容器运行时之前,我先简单介绍一下 Kubernetes 的架构。
一个 Kubernetes 集群将由一个主节点和一个或多个工作节点组成:
- master node 的主要任务是管理集群,将容器分发和管理到各个工作节点;
- work node 的主要任务是包含运行应用程序的容器。
每个 master node 和 work node 将具有以下组件:
master node 包括四个主要组件:
- etcd:用于存储集群的状态。
- API server:客户端或其他组件用来与 Kubernetes 集群通信的主要组件。
- Controller Manager:管理和创建集群中相应的资源。
- Scheduler:分配并选择一个 work node 来运行容器。
work node 包括三个组件:
- kubelet:管理每个 work node 上的容器。
- kube-proxy。
- Container Runtime。
我们会进一步了解 work node 上的容器运行时,因为它是 Kubernetes 与容器通信的地方。
# 2. Kubernetes 如何管理集群中的容器?
在集群中,我们会有很多工作节点,容器运行在工作节点上。为了在每个工作节点上使用容器,Kubernetes 使用了一个名为 kubelet 的工具。
kubelet 负责与 master node 交互并管理 Kubernetes 集群中的容器。此外,kubelet 还监控每个 work node 上的容器,并将该信息发送给 master node。
kubelet 会监听来自 master node 的容器配置事件下发给 worker node,然后在 worker node 上创建该配置对应的容器。
所以 Kubernetes 通过 kubelet 与容器一起工作,那么 kubelet 将如何与容器一起工作呢?我们将更深入地介绍 kubelet 如何与容器配合使用。
# 3. CR 和 CRI
- CR:容器运行时,container runtime。
- CRI:容器运行时接口,container runtime interface。
在上一篇文章中提到,容器运行时是一个帮助我们管理角色的工具,帮助我们轻松地创建和删除容器,而不必使用一系列复杂的命令来创建容器。
kubelet 将通过称为容器运行时接口 (CRI) 的层与每个工作节点上的容器运行时进行交互:
那么我们为什么需要 CRI,kubelet 为什么不直接和容器交互呢?
这样做的原因是让 kubelet 尽可能简单。由于容器运行时有多种类型(docker、cri-o、containerd 等),不必在 kubelet 内部实现与这么多不同类型的容器运行时的交互,那么可以把它留给一个叫做 CRI 的抽象层。无论工作节点中使用什么容器运行时,kubelet 仅通过 CRI 与容器运行时通信。
下图展示了 Kubernetes 如何创建容器:
- 首先,master 节点会通知 kubelet 创建容器。
- 接下来,kubelet 通过 CRI 与高级容器运行时交互以创建容器。
- 现在,高级容器运行时从容器注册表中拉取镜像,提取它,并将其保存到磁盘。
- 然后会通知低级容器运行时,它会去磁盘获取容器镜像。
- 之后,低级容器运行时执行一系列命令来创建容器。
# 4. Kubernetes 与容器运行时一起工作
接下来,我们将看看 Kubernetes 可以使用的一些流行的容器运行时。
# 4.1 Docker
Docker 是 Kubernetes 使用的第一个容器运行时,但在 1.24 版本中它被 Kubernetes 移除并不再使用。Kubernetes 通过 dockershim 的 CRI 与 docker 进行交互,由于它太笨重,在 1.24 版本中已经移除。
# 4.2 Containerd
Containerd 是一个比 docker 更简单、更简单的容器运行时:
从 1.1 版本开始,containerd 内置了一个 CRI 插件,kubelet 只需要直接与这个插件交互即可。正如我们所见,不像使用 docker 作为容器运行时,使用docker需要必须经过很多层,而用 containerd 时可以直接进入。
# 4.3 CRI-O
这是另一个流行的容器运行时,类似于 containerd:
CRI-O 由 Redhat 开发。
# 5. 结论
我们已经了解了 Kubernetes 如何与容器运行时一起工作。从 1.24 版本开始有一个重点需要提一下,kubernetes 放弃使用 docker 作为容器运行时,如果想把 Kubernetes 升级到 1.24 版本,我们需要安装其他容器运行时。