前言
Kubernetes节点的底层依赖于容器运行时软件来启停容器。Docker是最著名的容器运行时之一,但不是唯一的选择。随着容器技术的发展,Kubernetes社区为了简化扩展过程,开发了容器运行时接口(Container Runtime Interface, CRI),这是一个插件API,用于支持不同的容器运行时。
Kubernetes架构
在Kubernetes集群中,master节点负责管理集群状态,而node节点则运行应用的Pod。当创建一个新的Pod时,kubectl命令会将配置文件提交给API Server,然后API Server将这些信息以API对象的形式存储到etcd中。Controller Manager会监控这些变化,并创建所需的Pod。Scheduler会监控etcd中Pod的变化,并通过调度算法选择最佳的Node节点来运行Pod,这个过程称为Bind Pod to Node。

Kubernetes默认容器运行时架构
Kubernetes通过CRI接口与容器运行时交互。以下是创建容器的典型流程:
-
Kubernetes CRI Client(通常是kubelet)通过CRI接口请求创建容器。
-
CRI Server(如dockershim)接收请求,并将其适配为Docker Daemon能理解的格式。
- Docker Daemon(在Docker 1.12及以后的版本中,被拆分为dockerd和containerd)接收请求。
-
dockerd调用containerd进程来创建容器。
-
containerd创建一个containerd-shim进程来操作容器。
-
containerd-shim调用runC(OCI规范的参考实现)来设置namespaces、cgroups等,并启动容器。
-
runC启动容器后退出,containerd-shim成为容器进程的父进程,负责收集状态和清理工作。
容器与容器编排背景
Kubernetes的容器运行时架构之所以复杂,部分原因是由于容器技术领域的竞争以及Docker公司的战略调整。最初,Kubernetes直接通过Docker API与Docker Daemon交互,后来为了防止Docker垄断,OCI标准被提出,允许开发自己的容器运行时。Docker公司将libcontainer封装成runC并捐献给CNCF。随着Docker的架构调整和Swarm的失败,containerd也被捐献给了CNCF。

CRI接口
CRI基于gRPC定义了RuntimeService和ImageService两个服务,分别用于容器运行时和镜像的管理。具体来说,CRI定义了以下功能:
-
Version:返回运行时名称、版本和API版本。
-
RunPodSandbox:创建并启动Pod级别的沙箱。
-
StopPodSandbox:停止沙箱中的所有进程并回收资源。
-
RemovePodSandbox:移除沙箱。
-
PodSandboxStatus:返回Pod沙箱的状态。
-
ListPodSandbox:列出所有Pod沙箱。
-
CreateContainer:在指定的Pod沙箱中创建新容器。
-
StartContainer:启动容器。
-
StopContainer:停止运行中的容器。
-
RemoveContainer:移除容器。
-
ListContainers:根据过滤器列出所有容器。
-
ContainerStatus:返回容器的状态。
-
UpdateContainerResources:更新容器配置。
-
ExecSync:在容器中同步执行命令。
-
Exec:准备一个流式端点以在容器中执行命令。
-
Attach:准备一个流式端点以附加到运行中的容器。
-
PortForward:准备一个流式端点以从Pod沙箱转发端口。
-
ContainerStats:返回容器的统计信息。
-
ListContainerStats:返回所有运行中容器的统计信息。
-
UpdateRuntimeConfig:根据请求更新运行时配置。
-
Status:返回运行时的状态。
ImageService
-
ListImages:列出现有镜像。
-
ImageStatus:返回镜像的状态。
-
PullImage:拉取镜像。
-
RemoveImage:移除镜像。
-
ImageFsInfo:返回用于存储镜像的文件系统信息。
容器运行时需要实现CRI定义的接口,并作为gRPC Server运行,监听本地的Unix Socket(Windows使用TCP)。这样,Kubernetes可以通过CRI与任何兼容的容器运行时进行交互,而不需要为每种运行时维护特定的代码。这种设计使得Kubernetes能够灵活地支持多种容器运行时,同时简化了kubelet的实现。
参考
https://www.kubernetes.org.cn/1079.html
最新评论