在 K3s 节点上安装并使用 nerdctl

💡 原文中文,约5000字,阅读约需12分钟。
📝

内容提要

在K3s节点安装nerdctl:下载精简二进制解压到/usr/local/bin,配置/etc/nerdctl/nerdctl.toml指向K3s的containerd socket(/run/k3s/containerd/containerd.sock)和k8s.io命名空间,即可查看管理K3s容器镜像。若需nerdctl run独立容器,须另装CNI插件并配置桥接网络;构建镜像需安装BuildKit。

🔎

延伸解读

为何选择 nerdctl 而非 ctr 或 crictl

在 K3s 节点上,ctr 是 containerd 内置调试工具,功能有限且与 Docker CLI 不兼容;crictl 面向 Kubernetes 运维,但并非日常容器管理工具。nerdctl 提供 Docker 兼容的命令行体验,支持 run、build、compose 等操作,更适合日常使用。由于 K3s 已内置 containerd,只需安装 nerdctl 二进制并指向 K3s 的 socket,即可直接管理 K3s 容器和镜像,无需重复部署 containerd。

配置关键:指向 K3s 专用 socket 与命名空间

K3s 的 containerd socket 位于 /run/k3s/containerd/containerd.sock,而非标准路径 /run/containerd/containerd.sock。nerdctl 默认连接标准路径,因此在 K3s 节点上必须通过 /etc/nerdctl/nerdctl.toml 配置文件修改 address 为 K3s 路径,并设置 namespace 为 k8s.io,因为 K3s 所有容器和镜像都存储在该命名空间下。配置后,使用 sudo nerdctl ps -a 和

独立容器网络:CNI 插件的按需安装

如果仅需查看和管理 K3s 已有容器和镜像,可跳过 CNI 安装。但若要用 nerdctl run 启动独立容器(非 Kubernetes 管理),则必须额外安装 CNI 插件并配置桥接网络。K3s 自带的 CNI 仅供 Kubernetes 使用,nerdctl 独立容器需要单独配置。安装官方 CNI 插件到 /opt/cni/bin,并创建 /etc/cni/net.d/10-nerdctl-bridge.conflist 定义桥接网络(如 10.88.0.0/16),该网络不会影响 K3s 自身网络。运行独立

构建镜像与本地镜像使用要点

nerdctl build 依赖 BuildKit daemon,需额外安装 BuildKit 并配置 systemd 服务,其中 --containerd-worker-addr 应指向 K3s 的 containerd socket。构建镜像时,若希望 K3s Pod 直接使用本地镜像,需将镜像打 tag 到 k8s.io 命名空间,并在 Pod spec 中设置 imagePullPolicy: Never。此外,nerdctl 支持从 tar 包导入镜像(nerdctl load)和导出镜像(nerdctl

❓

Q&A

K3s 节点上如何安装 nerdctl?

下载 nerdctl 精简二进制包(仅含 nerdctl),解压到 /usr/local/bin 即可。例如:curl -LO https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz,然后 sudo tar Cxzvf /usr/local/bin nerdctl-${NERDCTL_VERSION}-linux-amd64.tar.gz nerdctl。

如何配置 nerdctl 以连接 K3s 的 containerd?

创建 /etc/nerdctl/nerdctl.toml 文件,设置 address = "/run/k3s/containerd/containerd.sock" 和 namespace = "k8s.io"。这样 nerdctl 就能管理 K3s 的容器和镜像。

nerdctl 和 ctr、crictl 有什么区别?

ctr 是 containerd 内置调试工具,与 Docker CLI 不兼容;crictl 是 CRI 调试工具,面向 Kubernetes 运维;nerdctl 是 Docker 兼容 CLI,支持 run/build/compose,推荐日常使用。

在 K3s 节点上使用 nerdctl run 启动独立容器需要什么额外配置?

需要安装 CNI 插件并配置桥接网络。下载 CNI 插件解压到 /opt/cni/bin,然后创建 /etc/cni/net.d/10-nerdctl-bridge.conflist 配置文件,定义 bridge 网络(如 10.88.0.0/16)。启动容器时使用默认命名空间(不加 --namespace k8s.io)。

如何使用 nerdctl 构建镜像并让 K3s 使用?

需要先安装 BuildKit。然后使用 sudo nerdctl --namespace k8s.io build -t myapp:local . 构建镜像,并在 Pod spec 中设置 imagePullPolicy: Never,即可使用本地镜像。

nerdctl 常用命令有哪些?

常用命令包括:sudo nerdctl ps -a(列出容器)、sudo nerdctl images(列出镜像)、sudo nerdctl logs <容器>(查看日志)、sudo nerdctl exec -it <容器> sh(进入容器)、sudo nerdctl pull <镜像>(拉取镜像)、sudo nerdctl rmi <镜像>(删除镜像)、sudo nerdctl load < image.tar(导入镜像)、sudo nerdctl save <镜像> -o image.tar(导出镜像)。

🏷️

标签

➡️

继续阅读