在 K3s 节点上安装并使用 nerdctl

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

内容提要

在K3s节点安装nerdctl:K3s自带containerd,只需下载nerdctl二进制,并配置socket路径为/run/k3s/containerd/containerd.sock、命名空间为k8s.io,即可管理容器镜像。若需用nerdctl run启动独立容器,须另装CNI插件并配置桥接网络;构建镜像还需安装BuildKit。

🔎

延伸解读

为何选择 nerdctl 而非 ctr 或 crictl

在 K3s 节点上,ctr 是 containerd 内置调试工具,与 Docker CLI 不兼容且功能有限;crictl 面向 Kubernetes 运维,但并非 Docker 兼容。nerdctl 提供 Docker 兼容的命令行体验,支持 run、build、compose 等常用操作,更适合日常容器管理。因此,若你熟悉 Docker 命令,nerdctl 能显著降低学习成本,同时直接操作 K3s 底层的 containerd。

配置要点:socket 路径与命名空间

K3s 的 containerd socket 位于 /run/k3s/containerd/containerd.sock,而非默认的 /run/containerd/containerd.sock。nerdctl 默认连接后者,因此必须通过配置文件 /etc/nerdctl/nerdctl.toml 指定正确路径,并将命名空间设为 k8s.io,才能看到 K3s 管理的容器和镜像。若省略此配置,nerdctl 将无法与 K3s 的 containerd 通信。

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

K3s 自带的 CNI 插件仅供 Kubernetes 使用,nerdctl run 启动的独立容器需要单独配置网络。若仅查看 K3s 已有容器和镜像,可跳过 CNI 安装;但若需运行独立容器并连接网络,则必须安装 CNI 插件并创建桥接网络配置(如 10.88.0.0/16)。注意,此网络与 K3s 自身网络隔离,互不影响。

构建镜像与本地镜像使用

nerdctl build 依赖 BuildKit,需额外安装并配置 systemd 服务,指定 containerd worker 地址为 K3s 的 socket。构建时若指定 --namespace k8s.io,镜像将存入 K3s 命名空间,随后在 Pod 中设置 imagePullPolicy: Never 即可直接使用本地镜像,避免从远程仓库拉取,适合离线或快速迭代场景。

❓

Q&A

K3s 节点上如何安装 nerdctl?

K3s 自带 containerd,只需下载 nerdctl 二进制并安装到 /usr/local/bin。具体步骤:1. 获取最新版本号;2. 下载对应架构的 nerdctl 精简包(如 nerdctl-${VERSION}-linux-amd64.tar.gz);3. 解压到 /usr/local/bin;4. 运行 nerdctl --version 验证。

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

创建配置文件 /etc/nerdctl/nerdctl.toml,设置 address = "/run/k3s/containerd/containerd.sock" 和 namespace = "k8s.io"。之后使用 sudo nerdctl ps -a 和 sudo nerdctl images 验证,能看到 K3s 系统 Pod 即成功。

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

需要安装 CNI 插件并配置桥接网络。步骤:1. 下载官方 CNI 插件并解压到 /opt/cni/bin;2. 创建网络配置文件 /etc/cni/net.d/10-nerdctl-bridge.conflist,定义 bridge 网络(如 10.88.0.0/16);3. 使用 sudo nerdctl --namespace default run 启动容器。

nerdctl 如何构建镜像?需要安装什么?

nerdctl 构建镜像需要安装 BuildKit daemon。安装 BuildKit 后,创建 systemd 服务并启动,然后使用 sudo nerdctl build -t myapp:v1 /path/to/dockerfile-dir 构建。

如何使用 nerdctl 管理 K3s 中的镜像?

常用命令:sudo nerdctl images 列出镜像;sudo nerdctl pull nginx:alpine 拉取镜像;sudo nerdctl rmi <镜像ID> 删除镜像;sudo nerdctl load < image.tar 导入镜像;sudo nerdctl save nginx:alpine -o nginx.tar 导出镜像。

如何让 K3s Pod 使用 nerdctl 构建的本地镜像?

构建时指定命名空间 k8s.io:sudo nerdctl --namespace k8s.io build -t myapp:local .,然后在 Pod spec 中设置 image: myapp:local 和 imagePullPolicy: Never,即可使用本地镜像。

🏷️

标签

➡️

继续阅读