Kubernetes容器运行时管理工具

2025-09-24 21:56:00
丁国栋
原创 118
摘要:本文记录和汇总关于Kubernetes容器运行时的一些知识。

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 等环境中。

所以想在提到“容器运行时”,通常指的是 containerdCRI-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 设计用于调试,不提供推送功能。推送通常使用 dockernerdctl 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 特定功能的场景

核心建议

  1. 对于 Kubernetes 集群运维和问题排查,无论底层是 containerd 还是 CRI-O,都统一学习并使用 crictl。这是最标准、最直接的方法。
  2. 如果是在个人开发机或非 Kubernetes 环境想直接使用 containerd,可以尝试 nerdctl 来获得类似 Docker 的体验。
  3. 避免在生产环境的 Kubernetes 节点上使用 docker 命令去操作由 Kubelet 管理的容器,这可能会造成状态不一致。
发表评论
博客分类