在 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 提供真正运行容器的能力。
其工作流程大致为:
- kubelet 通过 CRI GRPC API 与 Container Runtime 通信。
- kubelet 发送创建容器的请求。
- Container Runtime 根据镜像创建容器并返回容器信息。
- kubelet 维持容器的声明周期,发送启动/停止/删除请求。
- Container Runtime 执行真正的容器生命周期管理。
- kubelet 获取容器日志、状态,通过 CRI GRPC API 返回给 Kubernetes。
以 Docker 为例,在 Kubernetes 集群中运行的大致流程是:
- 集群部署时安装 Docker。
- Docker 运行时提供 CRI GRPC 服务与 CRI 节点代理。
- kubelet 启动时使用 CRI 配置与 Docker 的 CRI GRPC 服务建立连接。
- kubelet 根据 Kubernetes API 创建容器,调用 Docker CRI GRPC 服务创建容器。
- Docker CRI 节点代理根据请求完成容器管理与网络设置。
- Docker Engine 真正创建与启动容器。
- kubelet 获取容器状态与日志,返回给 Kubernetes。
所以总结来说,Container Runtime为Kubernetes提供真正运行容器的能力,其主要作用是:
- 实现 CRI 接口与 kubelet 集成。
- 拉取与管理容器镜像。
- 创建、启动、停止、删除容器。
- 配置网络与存储等容器运行环境。
- 提供容器的日志与状态。
它让Kubernetes享有运行容器化工作负载的能力,而不用关心特定的容器技术实现。这需要我们理解不同Container Runtime的功能与特点,并根据生产需要选择最适合的方案。
而要真正理解Container Runtime,则需要学习CRI接口,并研究各种Runtime的实现原理。只有理解了原理,才能在使用与问题排查时得心应手。