Kubernetes容器运行时管理工具
- 2025-09-24 21:56:00
- 丁国栋
- 原创 118
Kubernetes 的容器运行时接口(CRI)标准化了运行时与 kubelet 的交互,因此会有多种常见的容器运行时。
核心概念澄清
在 Kubernetes 中,不再直接使用
docker
命令来管理 Pod 和容器。
- Docker: 它本身是一个完整的容器平台,包括守护进程(dockerd)、容器运行时(containerd)、镜像构建、网络、存储等。早期 Kubernetes 通过一个名为
dockershim
的组件来调用 Docker,但 Docker 本身并不符合 CRI 标准。 - containerd: 这是一个行业标准的容器运行时,它本身是 Docker 架构的核心组件之一。Kubernetes 通过 CRI 插件直接与 containerd 通信,效率更高、架构更简洁。这是目前最主流的生产环境选择。
- CRI-O: 这是一个由 Kubernetes 社区主导的轻量级容器运行时,专门为 Kubernetes 而设计。它只实现 CRI 接口,因此更为精简,常用于 Red Hat OpenShift 等环境中。
所以想在提到“容器运行时”,通常指的是 containerd 或 CRI-O。
常见的容器运行时及管理工具
1. containerd
简介: 目前 Kubernetes 生态中的事实标准。它是一个守护进程,负责管理完整的容器生命周期,如下载镜像、创建容器、管理存储卷等。
管理工具:
crictl
: 首选工具。这是一个由 Kubernetes 社区维护的 CRI 兼容命令行工具。虽然它可以用于任何实现了 CRI 的运行时(如 CRI-O),但它最常与 containerd 搭配使用。它的命令风格接近docker
命令,是排查 Kubernetes 节点问题时的主要工具。nerdctl
: 由 containerd 社区维护的工具,旨在成为docker
命令的替代品。它支持大部分docker
命令的功能,包括 Docker Compose(通过nerdctl compose
)。它更适合在开发机或单机环境中直接使用 containerd 的场景,而不是直接用于排查 Kubernetes Pod。
基本操作(以 crictl
为例)
在使用 crictl
前,通常需要先配置其运行时端点,例如在包含 containerd 的节点上执行:
export CONTAINER_RUNTIME_ENDPOINT=unix:///run/containerd/containerd.sock
# 或者直接写入配置文件 ~/.crictl.yaml
# cat <<EOF > ~/.crictl.yaml
# runtime-endpoint: unix:///run/containerd/containerd.sock
# EOF
操作 | 命令 | 说明 |
---|---|---|
查看镜像 | crictl images |
列出本地已有的镜像 |
拉取镜像 | crictl pull <image-name> |
从镜像仓库拉取镜像,例如 crictl pull nginx:latest |
推送镜像 | crictl 不支持推送 |
crictl 设计用于调试,不提供推送功能。推送通常使用 docker 或 nerdctl push 。 |
查看容器 | crictl ps |
查看运行中的容器(Pod 内的容器) |
crictl ps -a |
查看所有容器(包括已退出的) | |
查看 Pod | crictl pods |
查看本地的 Pod(Kubernetes 概念) |
执行命令 | crictl exec -it <container-id> /bin/sh |
进入指定容器(类似 docker exec ) |
查看日志 | crictl logs <container-id> |
查看容器标准输出/错误日志 |
查看信息 | crictl inspect <container-id> |
查看容器的详细信息(JSON 格式) |
停止容器 | crictl stop <container-id> |
停止一个运行中的容器 |
删除容器 | crictl rm <container-id> |
删除一个已停止的容器 |
删除镜像 | crictl rmi <image-id> |
删除本地镜像 |
nerdctl
的基本操作(更接近 Docker)
nerdctl
的使用方式与 docker
几乎完全一致。
操作 | 命令 |
---|---|
查看镜像 | nerdctl images |
拉取镜像 | nerdctl pull <image-name> |
推送镜像 | nerdctl push <image-name> |
构建镜像 | nerdctl build -t my-image . |
运行容器 | nerdctl run -d --name my-container nginx:latest |
查看容器 | nerdctl ps |
执行命令 | nerdctl exec -it my-container /bin/sh |
2. CRI-O
简介: 一个专注于 Kubernetes 的轻量级运行时,遵循“只做一件事并做好”的原则。
管理工具:
crictl
: 同样是首选工具。用法与在 containerd 上几乎完全一样,只需将运行时端点指向 CRI-O 的 socket:unix:///var/run/crio/crio.sock
。podman
: 一个强大的无守护进程容器引擎,它也可以与 CRI-O 的存储库交互(但通常不直接用于管理 Kubernetes 创建的容器)。podman
的命令与docker
高度兼容。
基本操作(以 crictl
为例)
配置 crictl
使用 CRI-O:
export CONTAINER_RUNTIME_ENDPOINT=unix:///var/run/crio/crio.sock
操作命令与上述 containerd 部分的 crictl
命令完全一致,例如 crictl images
, crictl ps
, crictl exec
等。
3. Docker (Engine) - (不推荐用于新集群)
简介: 在 Kubernetes v1.24 版本之前,可以通过 dockershim
来使用。现在如果要在新集群中使用 Docker,需要安装一个额外的适配器 cri-dockerd
。
管理工具:
docker
: 经典的 Docker 命令行工具。
基本操作(经典 Docker 命令)
操作 | 命令 |
---|---|
查看镜像 | docker images |
拉取镜像 | docker pull <image-name> |
推送镜像 | docker push <image-name> |
构建镜像 | docker build -t my-image . |
运行容器 | docker run -d --name my-container nginx:latest |
查看容器 | docker ps |
执行命令 | docker exec -it my-container /bin/sh |
总结与选择建议
运行时 | 管理工具(用于 K8s 节点调试) | 特点 | 适用场景 |
---|---|---|---|
containerd | crictl |
行业标准,稳定高效,架构简洁 | 生产环境首选,需要高性能和稳定性的集群 |
CRI-O | crictl |
专为 K8s 设计,极其轻量,安全性好 | 对资源消耗敏感的环境,如 OpenShift |
Docker (via cri-dockerd) | docker |
功能全面,生态成熟 | 旧集群迁移或有强依赖 Docker 特定功能的场景 |
核心建议:
- 对于 Kubernetes 集群运维和问题排查,无论底层是 containerd 还是 CRI-O,都统一学习并使用
crictl
。这是最标准、最直接的方法。 - 如果是在个人开发机或非 Kubernetes 环境想直接使用 containerd,可以尝试
nerdctl
来获得类似 Docker 的体验。 - 避免在生产环境的 Kubernetes 节点上使用
docker
命令去操作由 Kubelet 管理的容器,这可能会造成状态不一致。
发表评论