Kubernetes 中的 Container Runtime 是什么?

在 Kubernetes 中,Container Runtime 负责运行容器化工作负载。它抽象了容器运行时环境,为 Kubernetes 提供运行和管理容器的能力。

Kubernetes 支持多种 Container Runtime,默认运行时为 Docker。常见的 Container Runtime 还有:

  • Docker:默认 Container Runtime,广泛使用。
  • containerd:Docker Deprecated 项目演变而来,由 CNCF 托管。
  • CRI-O:轻量级 Container Runtime,专注于 Kubernetes。
  • rkt:CoreOS 开发,基于 App Container 规范。

这些 Container Runtime 都实现了 Kubernetes CRI(Container Runtime Interface)接口,可以兼容地运行在 Kubernetes 上。

CRI 接口定义了 Kubernetes 和 Container Runtime 之间的标准接口,包括:

  • 镜像管理:拉取、检索、删除镜像。
  • 容器管理:创建、启动、停止、删除容器。
  • 容器日志:获取容器日志。
  • 容器状态:获取容器状态。
  • 沙箱管理:创建/删除容器网络、存储资源等。

实现 CRI 的 Container Runtime 需要提供:

  • CRI 服务端:实现 CRI GRPC API,由 kubelet 通信。
  • CRI 节点代理:实现 CRI 节点管理能力,增强 kubelet 功能。
  • 容器管理工具:用于创建、启动、管理容器,如 Docker、containerd 等。

所以 Container Runtime 实际上就是通过 CRI 与 kubelet 集成,为 Kubernetes 提供真正运行容器的能力。

其工作流程大致为:

  1. kubelet 通过 CRI GRPC API 与 Container Runtime 通信。
  2. kubelet 发送创建容器的请求。
  3. Container Runtime 根据镜像创建容器并返回容器信息。
  4. kubelet 维持容器的声明周期,发送启动/停止/删除请求。
  5. Container Runtime 执行真正的容器生命周期管理。
  6. kubelet 获取容器日志、状态,通过 CRI GRPC API 返回给 Kubernetes。

以 Docker 为例,在 Kubernetes 集群中运行的大致流程是:

  1. 集群部署时安装 Docker。
  2. Docker 运行时提供 CRI GRPC 服务与 CRI 节点代理。
  3. kubelet 启动时使用 CRI 配置与 Docker 的 CRI GRPC 服务建立连接。
  4. kubelet 根据 Kubernetes API 创建容器,调用 Docker CRI GRPC 服务创建容器。
  5. Docker CRI 节点代理根据请求完成容器管理与网络设置。
  6. Docker Engine 真正创建与启动容器。
  7. kubelet 获取容器状态与日志,返回给 Kubernetes。

所以总结来说,Container Runtime为Kubernetes提供真正运行容器的能力,其主要作用是:

  1. 实现 CRI 接口与 kubelet 集成。
  2. 拉取与管理容器镜像。
  3. 创建、启动、停止、删除容器。
  4. 配置网络与存储等容器运行环境。
  5. 提供容器的日志与状态。

它让Kubernetes享有运行容器化工作负载的能力,而不用关心特定的容器技术实现。这需要我们理解不同Container Runtime的功能与特点,并根据生产需要选择最适合的方案。
而要真正理解Container Runtime,则需要学习CRI接口,并研究各种Runtime的实现原理。只有理解了原理,才能在使用与问题排查时得心应手。