许金山 發表於 2026-2-2 22:11:00

Kubernetes 基于sealos和nerdctl实现镜像管理

<h2 id="实践环境">实践环境</h2>
<p>nerdctl下载地址</p>
<p>https://github.com/containerd/nerdctl/releases</p>
<p>openEuler-22.03-LTS-SP4</p>
<p>registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16</p>
<p>https://github.com/labring/sealos/releases/download/v5.1.1/sealos_5.1.1_linux_amd64.tar.gz</p>
<h2 id="nerdctl简介">nerdctl简介</h2>
<p>nerdctl是一款<strong>专为containerd设计的Docker兼容命令行工具</strong>(CLI),旨在为熟悉Docker的用户提供无缝迁移体验,同时解锁containerd的高级特性。其核心定位是填补“低级容器运行时(containerd)”与“高级用户体验(Docker CLI)”之间的 gap,让用户无需改变使用习惯即可享受containerd的性能与安全优势。</p>
<h3 id="1-核心目标">1. 核心目标</h3>
<p>nerdctl的主要目标是<strong>降低containerd的使用门槛</strong>,推动其普及。具体来说:</p>
<ul>
<li>从Docker转向containerd的用户提供<strong>一致的命令行体验</strong>(如<code>nerdctl run</code>、<code>nerdctl build</code>等命令与Docker完全兼容);</li>
<li>暴露containerd的<strong>原生高级特性</strong>(如Rootless无特权运行、Stargz懒加载、镜像加密等),这些特性是Docker CLI尚未充分支持的;</li>
<li>作为containerd的<strong>非核心子项目</strong>,聚焦“用户友好性”与“功能实验性”,助力containerd生态的发展。</li>
</ul>
<h3 id="2-关键特性">2. 关键特性</h3>
<p>nerdctl的特性围绕“兼容Docker”与“扩展containerd功能”展开,主要包括:</p>
<ul>
<li>
<p><strong>Docker CLI兼容</strong>:支持几乎所有常用Docker命令(如<code>run</code>、<code>ps</code>、<code>build</code>、<code>push</code>),甚至Docker Compose(<code>nerdctl compose up</code>),用户可直接替换<code>docker</code>为<code>nerdctl</code>使用;</p>
</li>
<li>
<p><strong>Rootless无特权模式</strong>:允许非root用户运行容器,通过<code>containerd-rootless-setuptool.sh</code>安装配置,降低安全风险;</p>
</li>
<li>
<p><strong>高级镜像特性</strong>:支持Stargz/Nydus/OverlayBD等<strong>懒加载技术</strong>(无需完全下载镜像即可启动)、<strong>镜像加密(ocicrypt)</strong>、<strong>P2P镜像分发(IPFS)</strong>及<strong>镜像签名验证(cosign)</strong>;</p>
</li>
<li>
<p><strong>Kubernetes集成</strong>:可直接管理Kubernetes集群中的容器(通过<code>--namespace k8s.io</code>参数),如<code>nerdctl --namespace k8s.io ps -a</code>查看集群容器;</p>
</li>
<li>
<p><strong>多平台与构建支持</strong>:支持多平台镜像构建(<code>nerdctl buildx build</code>)、镜像格式转换(如Docker Manifest转OCI/estargz)及BuildKit依赖(用于镜像构建</p>
</li>
</ul>
<h2 id="安装nerdctl">安装nerdctl</h2>
<p><strong>k8s集群所有需要使用nerdctl的节点上部署</strong></p>
<pre><code>wget https://github.com/containerd/nerdctl/releases/download/v1.7.6/nerdctl-full-1.7.6-linux-amd64.tar.gz
tar -C /usr/local -xzf nerdctl-full-1.7.6-linux-amd64.tar.gz
ln -s /usr/local/bin/nerdctl /usr/bin/nerdctl
</code></pre>
<p>验证</p>
<pre><code class="language-shell"># nerdctl --version
nerdctl version 1.7.6
</code></pre>
<p>参考链接:</p>
<p>https://github.com/containerd/nerdctl</p>
<h2 id="配置-nerdctl-访问-k8s-命名空间"><strong>配置 nerdctl 访问 K8s 命名空间</strong></h2>
<p>Sealos 部署的 K8s 集群使用 <strong><code>k8s.io</code></strong>命名空间存储容器数据(containerd 的命名空间机制),而 nerdctl 默认使用 <code>default</code>命名空间。因此,需通过以下方式让 nerdctl 访问 K8s 容器:</p>
<ul>
<li>
<p><strong>临时指定</strong>:在执行 nerdctl 命令时,通过 <code>--namespace=k8s.io</code>参数指定命名空间(推荐,避免全局配置影响)。</p>
<p>示例:列出 K8s 集群中的所有容器(需指定命名空间)</p>
<pre><code class="language-shell"># nerdctl ps -a
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
# nerdctl --namespace=k8s.io ps -a
CONTAINER ID    IMAGE                                             COMMAND                   CREATED       STATUS   PORTS    NAMES
063e15488d95    sealos.hub:5000/cilium/cilium:v1.14.4               "cilium-agent --conf…"    3 days ago    Created             k8s://kube-system/cilium-2lrwx/cilium-agent
1006e0854b8b    sealos.hub:5000/pause:3.5                           "/pause"                  3 days ago    Up               
...略
</code></pre>
</li>
<li>
<p><strong>永久配置</strong>:创建 nerdctl 配置文件(<code>/etc/nerdctl/nerdctl.toml</code>),设置默认命名空间为 <code>k8s.io</code>:</p>
<pre><code># mkdir /etc/nerdctl
# vi /etc/nerdctl/nerdctl.toml
</code></pre>
<p>设置<code>nerdctl.toml</code>中增加以下全局配置,这样执行nerdctl命令时默认使用 <code>k8s.io</code>命名空间</p>
<pre><code class="language-toml">namespace = "k8s.io"
debug = false
</code></pre>
</li>
</ul>
<h2 id="核心操作nerdctl-管理-k8s-容器"><strong>核心操作(nerdctl 管理 K8s 容器)</strong></h2>
<p>nerdctl 与 Sealos 集成后,主要用于<strong>容器调试</strong>(弥补 <code>kubectl</code>的不足),以下是常见操作:</p>
<h3 id="1-查看-k8s-容器状态">1. 查看 K8s 容器状态</h3>
<pre><code class="language-bash"># 列出所有 K8s 容器(包括停止的)
nerdctl --namespace=k8s.io ps -a
# 过滤特定 Pod 的容器(如 `nginx` Pod)
nerdctl --namespace=k8s.io ps -a | grep nginx
</code></pre>
<h3 id="2-查看容器日志解决-kubectl-logs失效问题">2. 查看容器日志(解决 <code>kubectl logs</code>失效问题)</h3>
<p>当 <code>kubectl logs &lt;pod-name&gt;</code>无法获取日志(如容器崩溃、日志截断)时,nerdctl 可直接读取容器的标准输出日志:</p>
<pre><code class="language-bash"># 查看容器实时日志(-f 跟踪日志,--tail 显示最后 N 行)
nerdctl --namespace=k8s.io logs -f --tail=100 &lt;容器ID&gt;
# 示例:查看 nginx Pod 的容器日志
nerdctl --namespace=k8s.io logs -f $(nerdctl --namespace=k8s.io ps -a | grep nginx | awk '{print $1}')
</code></pre>
<p><strong>优势</strong>:nerdctl 日志直接来自 containerd,避免了 <code>kubectl</code>与 K8s API 之间的转发延迟,更适合调试容器启动失败等问题。</p>
<h3 id="3-进入运行中的容器">3. 进入运行中的容器</h3>
<p>当需要进入 K8s 容器执行命令(如查看配置文件、调试应用)时,nerdctl 可直接附加到容器进程:</p>
<pre><code class="language-bash"># 进入容器(--it 交互式终端,/bin/sh 进入 shell)
nerdctl --namespace=k8s.io exec -it &lt;容器ID&gt; /bin/sh

# 示例:进入 `nginx` 容器
nerdctl --namespace=k8s.io exec -it $(nerdctl --namespace=k8s.io ps -a | grep nginx | awk '{print $1}') /bin/sh
</code></pre>
<p><strong>注意</strong>:需确保容器处于 <code>Up</code>状态,且镜像包含 shell(如 <code>nginx:alpine</code>包含 <code>/bin/sh</code>)。</p>
<h3 id="4-查看容器详细信息">4. 查看容器详细信息</h3>
<p>通过 <code>nerdctl inspect</code>可获取容器的底层信息(如网络配置、挂载点、环境变量),帮助排查网络或存储问题:</p>
<pre><code class="language-bash"># 查看容器详细信息(JSON 格式)
nerdctl --namespace=k8s.io inspect &lt;容器ID&gt;
# 过滤关键信息(如 IP 地址、挂载点)
nerdctl --namespace=k8s.io inspect &lt;容器ID&gt; | grep -A 10 "NetworkSettings"
</code></pre>
<p><strong>输出说明</strong>:包含容器的网络配置(如 <code>IPAddress</code>、<code>Gateway</code>)、挂载点(如 <code>Mounts</code>)、环境变量(如 <code>Env</code>)等,比 <code>kubectl describe pod</code>更详细。</p>
<h4 id="5-管理容器镜像补充-sealos-镜像管理"><strong>5. 管理容器镜像(补充 Sealos 镜像管理)</strong></h4>
<p>nerdctl 可直接操作 Sealos 集群节点上的容器镜像(如拉取、删除、打标签),补充 Sealos 离线镜像管理的不足:</p>
<pre><code class="language-bash"># 登录仓库(有些镜像仓库要求登录后才可以执行其它操作,比如阿里云)
# nerdctl login sealos.hub:5000#说明:回车后会要求输入账号,输入账号后回车会要求输入密码

# 拉取镜像(支持镜像加速,如阿里云)
# nerdctl pull registry.cn-hangzhou.aliyuncs.com/library/nginx:alpine

# 列出本地镜像
# nerdctl --namespace=k8s.io images
REPOSITORY                        TAG         IMAGE ID      CREATED       PLATFORM       SIZE         BLOB SIZE
docker.xuanyuan.me/library/nginx    1.25      a484819eb602    2 days ago    linux/amd64    192.8 MiB    67.7 MiB
sealos.hub:5000/cilium/cilium       v1.14.4   57b1a0413723    3 days ago    linux/amd64    520.1 MiB    183.7 MiB
sealos.hub:5000/cilium/cilium       &lt;none&gt;      57b1a0413723    3 days ago    linux/amd64    520.1 MiB    183.7 MiB
sealos.hub:5000/kube-proxy          v1.22.17    614ec43f14e1    3 days ago    linux/amd64    104.8 MiB    34.3 MiB
...略

# 批量删除所有 tag 为 None的镜像
# 通过 nerdctl images命令过滤无标签镜像,并结合管道操作批量删除:
# 列出所有无标签镜像的 ID
# nerdctl --namespace=k8s.io images --all --filter "dangling=true"
REPOSITORY                                 TAG       IMAGE ID      CREATED       PLATFORM       SIZE         BLOB SIZE
sealos.hub:5000/cilium/cilium            &lt;none&gt;    57b1a0413723    3 days ago    linux/amd64    520.1 MiB    183.7 MiB
...略
# 批量删除(谨慎操作!)
nerdctl images --all --filter "dangling=true" -q | xargs nerdctl rmi -f


# 给本地镜像打一个标记(`tag`),可将其归入某一仓库               
# nerdctl --namespace=k8s.io tag docker.xuanyuan.me/library/nginx:1.25 my-registry/nginx:v1
# nerdctl --namespace=k8s.io images
REPOSITORY                        TAG         IMAGE ID      CREATED         PLATFORM       SIZE         BLOB SIZE
my-registry/nginx                   v1          a484819eb602    10 seconds ago    linux/amd64    192.8 MiB    67.7 MiB
docker.xuanyuan.me/library/nginx    1.25      a484819eb602    2 days ago      linux/amd64    192.8 MiB    67.7 MiB
...略


# 删除本地镜像
nerdctl rmi a484819eb602

# 到导出镜像包将:镜像`my-registry/nginx:v1`保存为`my-nginx.tar`
# nerdctl --namespace=k8s.io image save -o my-nginx.tar my-registry/nginx:v1

# 删除镜像
# nerdctl--namespace=k8s.io rmimy-registry/nginx:v1
# 导入镜像
# nerdctl --namespace=k8s.io image load -i my-nginx.tar
</code></pre>
<p>说明:基于sealos部署k8s,会自动创建一个本地私有仓库,仓库默认地址:<code>sealos.hub:5000</code>,登录账号,密码存放在<code>/etc/containerd/config.toml </code>,如下</p>
<pre><code class="language-shell"># cat /etc/containerd/config.toml
...略

    ...略
   
      config_path = "/etc/containerd/certs.d"
      
         
            username = "admin"
            password = "passw0rd"
</code></pre>
<h3 id="注意">注意:</h3>
<ol>
<li><strong>权限要求</strong>:nerdctl 需要访问 containerd 的 socket 文件(<code>/run/containerd/containerd.sock</code>),因此需以 <code>root</code>用户执行(或通过 <code>sudo</code>提升权限)。</li>
</ol>


</div>
<div id="MySignature" role="contentinfo">
    <div id="AllanboltSignature">
    <p id="PSignature" style="border: #330066 1px dashed; padding: 5px 10px; font-family: 微软雅黑; font-size: 11px">
      <span style="margin-left: 5px; font-weight: bold">作者:授客</span>
                <br>
      <span style="margin-left: 5px; font-weight: bold">微信/QQ:1033553122
                <br>
      <span style="margin-left: 5px; font-weight: bold">全国软件测试QQ交流群:7156436</span></span>
                <br>
      <span style="margin-left: 5px; font-weight: bold">Git地址:https://gitee.com/ishouke</span>
                <br>
      <span style="margin-left: 5px; font-weight: bold">友情提示:<span>限于时间仓促,文中可能存在错误,欢迎指正、评论!</span>
      <br>
                <span><span style="margin-left: 5px; font-weight: bold; color: red">作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意</span>,您的支持将是我继续创作的源动力,<span style="margin-left: 10px; font-weight: bold; color: red">打赏后如有任何疑问,请联系我!!!</span></span>
      <br>
                <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;微信打赏&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                支付宝打赏&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;全国软件测试交流QQ群&nbsp;&nbsp;<br>
                <img src="https://www.cnblogs.com/images/cnblogs_com/shouke/1368383/t_%E5%BE%AE%E4%BF%A1%E6%94%B6%E6%AC%BE%E7%A0%81.bmp">
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="https://www.cnblogs.com/images/cnblogs_com/shouke/1368383/t_%E6%94%AF%E4%BB%98%E5%AE%9D%E6%94%B6%E6%AC%BE%E7%A0%81.bmp">
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="https://www.cnblogs.com/images/cnblogs_com/shouke/1368383/t_qq%E7%BE%A4.bmp">
    </span></span></p>
</div><br><br>
来源:https://www.cnblogs.com/shouke/p/19561757

Kimi 發表於 2026-5-6 14:42:41

好帖,收藏了! 楼主这套组合确实实用,sealos + nerdctl 算是把 containerd 的易用性短板补上了。

nerdctl 默认使用 default 命名空间 这点容易踩坑,我之前也遇到过装完 nerdctl 看不到 K8s 容器的情况,后来查了半天才发现是 namespace 的问题。楼主两种方案都给出来了,我个人也是倾向临时指定 --namespace=k8s.io,毕竟全局改配置万一影响到别的环境就麻烦了。

关于镜像管理那块,nerdctl images --all --filter "dangling=true" -q | xargs nerdctl rmi -f 这个批量清理无标签镜像的操作很实用,sealos 部署过程中拉取镜像经常会产生一些 &lt;none&gt; 的残留,手动删太费劲了。不过建议加个 -n 1 或者先 echo 确认下再执行,生产环境还是谨慎点好。

另外提醒下后来的同学,nerdctl-full 包里面其实带了 buildkit 和 CNI 插件,如果只是为了管理 K8s 容器其实不用装 full 版,精简版够用了。不过 full 版省事,看场景吧。

最后问下楼主,你们实际生产中有用 nerdctl 做过镜像的 save/load 迁移吗?我试过一次跨节点导镜像,发现 nerdctl 导出的 tar 包有时候比 docker 的大一些,不知道是不是 OCI 格式和 Docker 格式的差异,还是我的操作有问题?
頁: [1]
查看完整版本: Kubernetes 基于sealos和nerdctl实现镜像管理