Kubernetes CRI 工作原理详解:Kubelet 是如何创建容器的?¶
文章摘要¶
很多 Kubernetes 初学者都会认为:
Kubernetes 负责创建容器。
实际上并不是。
真正创建容器的是容器运行时(Container Runtime)。
而 Kubernetes 与容器运行时之间的桥梁,就是 CRI(Container Runtime Interface)。
本文将深入讲解 CRI 的设计目的、工作原理,以及 Docker、Containerd、CRI-O、OCI、runc 之间的关系。
学习目标¶
阅读完本文后,你将掌握:
- 什么是 CRI
- Kubernetes 如何创建容器
- Kubelet 与 CRI 的关系
- Docker 与 Kubernetes 的关系
- Containerd 工作原理
- CRI-O 工作原理
- OCI 标准
- Kubernetes 1.24 为什么移除 Docker
适用人群¶
本文适合:
- Kubernetes 初学者
- Linux 运维工程师
- DevOps 工程师
- 云原生学习者
- Kubernetes 面试准备人员
为什么需要 CRI?¶
先思考一个问题:
当我们创建 Pod:
最终:
已经运行起来。
那么:
很多新人会回答:
其实并不准确。
真正的过程是:
因此:
Kubernetes 并不直接创建容器。
而是通过 CRI 调用容器运行时来完成。
什么是 CRI?¶
CRI 全称:
中文通常翻译为:
CRI 本质上是一套标准接口。
类似于:
USB 定义:
而:
则是具体实现。
同样:
定义:
而:
则是具体实现。
Kubernetes 创建容器全过程¶
创建 Deployment:
流程:
Deployment
↓
Controller Manager
↓
Pod
↓
Scheduler
↓
Node
↓
Kubelet
↓
CRI
↓
Container Runtime
↓
Container
这里最关键的一步:
因为:
它只负责:
Kubelet 与 CRI 的关系¶
可以理解为:
CRI:
Container Runtime:
例如:
Kubelet:
CRI:
Container Runtime:
什么是 Container Runtime?¶
容器运行时负责:
- 拉取镜像
- 创建容器
- 启动容器
- 停止容器
- 删除容器
例如:
镜像下载。
创建:
最终启动进程。
Docker 与 Kubernetes 的关系¶
这是最容易被误解的问题。
很多新人认为:
实际上:
关系如下:
类似于:
关系。
Docker 架构¶
传统架构:
可以发现:
Docker 本身并不直接创建容器。
实际上:
才是真正工作的组件。
为什么 Kubernetes 移除 Docker?¶
Kubernetes 1.24 开始:
很多人误以为:
其实并不是。
真正原因:
路径:
而直接使用:
则变成:
更简单。
性能更好。
维护成本更低。
什么是 Containerd?¶
目前 Kubernetes 默认推荐。
架构:
主要职责:
- 镜像管理
- 容器管理
- Snapshot 管理
- Runtime 调用
目前绝大多数生产环境使用:
什么是 CRI-O?¶
另一种运行时。
专门为 Kubernetes 设计。
架构:
特点:
Red Hat OpenShift 广泛使用。
什么是 OCI?¶
OCI 全称:
中文:
主要定义:
镜像标准¶
例如:
镜像格式。
Runtime 标准¶
定义:
OCI 的作用:
什么是 runc?¶
很多人没听过。
但几乎所有容器都会经过它。
架构:
runc 负责:
因此:
容器本质上还是 Linux 进程。
CRI 工作流程¶
创建 Pod:
整个过程中:
负责统一接口。
CRI 与 OCI 的区别¶
很多面试题喜欢考。
| 项目 | CRI | OCI |
|---|---|---|
| 作用 | Kubernetes接口 | 容器标准 |
| 面向对象 | Kubelet | Runtime |
| 定义内容 | API接口 | 镜像与运行时 |
| 使用场景 | Kubernetes | 所有容器平台 |
简单记忆:
生产环境最佳实践¶
优先使用 Containerd¶
当前主流选择。
不再新部署 Docker Runtime¶
新集群没有必要。
定期检查 Runtime 状态¶
查看:
保持版本兼容¶
升级 Kubernetes 前确认:
兼容。
常见故障排查¶
Pod 一直 ContainerCreating¶
查看:
Runtime 异常¶
查看:
镜像拉取失败¶
查看:
Kubelet 无法连接 Runtime¶
查看:
运维排查命令¶
查看 Runtime:
查看容器:
查看镜像:
查看 Pod:
查看 Containerd:
面试常见问题¶
CRI 的作用是什么?¶
Kubelet 与容器运行时之间的标准接口。
Kubernetes 会直接创建容器吗?¶
不会。
由容器运行时创建。
Kubernetes 为什么移除 Docker?¶
因为直接使用 Containerd 更简单。
当前主流 Runtime 是什么?¶
Containerd。
runc 的作用是什么?¶
最终创建 Linux 容器进程。
FAQ¶
Docker 还能用吗?¶
可以。
但不再是 Kubernetes 推荐方案。
Containerd 和 Docker 谁更底层?¶
Containerd。
没有 CRI 能运行 Kubernetes 吗?¶
不能。
Kubelet 必须依赖容器运行时。
总结¶
CRI 是 Kubernetes 与容器运行时之间的桥梁。
它负责:
- 统一容器接口
- 解耦 Kubernetes 与 Runtime
- 支持多种容器运行时
可以记住一句话:
Kubelet 负责管理容器,而真正创建容器的是 Container Runtime,CRI 则是两者之间的翻译官。