当前位置: 首页 > news >正文

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

实践环境

nerdctl下载地址

https://github.com/containerd/nerdctl/releases

openEuler-22.03-LTS-SP4

registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16

https://github.com/labring/sealos/releases/download/v5.1.1/sealos_5.1.1_linux_amd64.tar.gz

nerdctl简介

nerdctl是一款专为containerd设计的Docker兼容命令行工具(CLI),旨在为熟悉Docker的用户提供无缝迁移体验,同时解锁containerd的高级特性。其核心定位是填补“低级容器运行时(containerd)”与“高级用户体验(Docker CLI)”之间的 gap,让用户无需改变使用习惯即可享受containerd的性能与安全优势。

1. 核心目标

nerdctl的主要目标是降低containerd的使用门槛,推动其普及。具体来说:

  • 从Docker转向containerd的用户提供一致的命令行体验(如nerdctl runnerdctl build等命令与Docker完全兼容);
  • 暴露containerd的原生高级特性(如Rootless无特权运行、Stargz懒加载、镜像加密等),这些特性是Docker CLI尚未充分支持的;
  • 作为containerd的非核心子项目,聚焦“用户友好性”与“功能实验性”,助力containerd生态的发展。

2. 关键特性

nerdctl的特性围绕“兼容Docker”与“扩展containerd功能”展开,主要包括:

  • Docker CLI兼容:支持几乎所有常用Docker命令(如runpsbuildpush),甚至Docker Compose(nerdctl compose up),用户可直接替换dockernerdctl使用;

  • Rootless无特权模式:允许非root用户运行容器,通过containerd-rootless-setuptool.sh安装配置,降低安全风险;

  • 高级镜像特性:支持Stargz/Nydus/OverlayBD等懒加载技术(无需完全下载镜像即可启动)、镜像加密(ocicrypt)P2P镜像分发(IPFS)镜像签名验证(cosign)

  • Kubernetes集成:可直接管理Kubernetes集群中的容器(通过--namespace k8s.io参数),如nerdctl --namespace k8s.io ps -a查看集群容器;

  • 多平台与构建支持:支持多平台镜像构建(nerdctl buildx build)、镜像格式转换(如Docker Manifest转OCI/estargz)及BuildKit依赖(用于镜像构建

安装nerdctl

k8s集群所有需要使用nerdctl的节点上部署

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

验证

# nerdctl --version
nerdctl version 1.7.6

参考链接:

https://github.com/containerd/nerdctl

配置 nerdctl 访问 K8s 命名空间

Sealos 部署的 K8s 集群使用 k8s.io命名空间存储容器数据(containerd 的命名空间机制),而 nerdctl 默认使用 default命名空间。因此,需通过以下方式让 nerdctl 访问 K8s 容器:

  • 临时指定:在执行 nerdctl 命令时,通过 --namespace=k8s.io参数指定命名空间(推荐,避免全局配置影响)。

    示例:列出 K8s 集群中的所有容器(需指定命名空间)

    # 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               
    ...略
    
  • 永久配置:创建 nerdctl 配置文件(/etc/nerdctl/nerdctl.toml),设置默认命名空间为 k8s.io

    # mkdir /etc/nerdctl
    # vi /etc/nerdctl/nerdctl.toml
    

    设置nerdctl.toml中增加以下全局配置,这样执行nerdctl命令时默认使用 k8s.io命名空间

    namespace = "k8s.io"
    debug = false
    

核心操作(nerdctl 管理 K8s 容器)

nerdctl 与 Sealos 集成后,主要用于容器调试(弥补 kubectl的不足),以下是常见操作:

1. 查看 K8s 容器状态

# 列出所有 K8s 容器(包括停止的)
nerdctl --namespace=k8s.io ps -a
# 过滤特定 Pod 的容器(如 `nginx` Pod)
nerdctl --namespace=k8s.io ps -a | grep nginx

2. 查看容器日志(解决 kubectl logs失效问题)

kubectl logs <pod-name>无法获取日志(如容器崩溃、日志截断)时,nerdctl 可直接读取容器的标准输出日志:

# 查看容器实时日志(-f 跟踪日志,--tail 显示最后 N 行)
nerdctl --namespace=k8s.io logs -f --tail=100 <容器ID>
# 示例:查看 nginx Pod 的容器日志
nerdctl --namespace=k8s.io logs -f $(nerdctl --namespace=k8s.io ps -a | grep nginx | awk '{print $1}')

优势:nerdctl 日志直接来自 containerd,避免了 kubectl与 K8s API 之间的转发延迟,更适合调试容器启动失败等问题。

3. 进入运行中的容器

当需要进入 K8s 容器执行命令(如查看配置文件、调试应用)时,nerdctl 可直接附加到容器进程:

# 进入容器(--it 交互式终端,/bin/sh 进入 shell)
nerdctl --namespace=k8s.io exec -it <容器ID> /bin/sh# 示例:进入 `nginx` 容器
nerdctl --namespace=k8s.io exec -it $(nerdctl --namespace=k8s.io ps -a | grep nginx | awk '{print $1}') /bin/sh

注意:需确保容器处于 Up状态,且镜像包含 shell(如 nginx:alpine包含 /bin/sh)。

4. 查看容器详细信息

通过 nerdctl inspect可获取容器的底层信息(如网络配置、挂载点、环境变量),帮助排查网络或存储问题:

# 查看容器详细信息(JSON 格式)
nerdctl --namespace=k8s.io inspect <容器ID>
# 过滤关键信息(如 IP 地址、挂载点)
nerdctl --namespace=k8s.io inspect <容器ID> | grep -A 10 "NetworkSettings"

输出说明:包含容器的网络配置(如 IPAddressGateway)、挂载点(如 Mounts)、环境变量(如 Env)等,比 kubectl describe pod更详细。

5. 管理容器镜像(补充 Sealos 镜像管理)

nerdctl 可直接操作 Sealos 集群节点上的容器镜像(如拉取、删除、打标签),补充 Sealos 离线镜像管理的不足:

# 登录仓库(有些镜像仓库要求登录后才可以执行其它操作,比如阿里云)
# 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       <none>      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              <none>    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 rmi  my-registry/nginx:v1
# 导入镜像
# nerdctl --namespace=k8s.io image load -i my-nginx.tar

说明:基于sealos部署k8s,会自动创建一个本地私有仓库,仓库默认地址:sealos.hub:5000,登录账号,密码存放在/etc/containerd/config.toml ,如下

# cat /etc/containerd/config.toml 
...略
[plugins]...略[plugins."io.containerd.grpc.v1.cri".registry]config_path = "/etc/containerd/certs.d"[plugins."io.containerd.grpc.v1.cri".registry.configs][plugins."io.containerd.grpc.v1.cri".registry.configs."sealos.hub:5000".auth]username = "admin"password = "passw0rd"

注意:

  1. 权限要求:nerdctl 需要访问 containerd 的 socket 文件(/run/containerd/containerd.sock),因此需以 root用户执行(或通过 sudo提升权限)。
http://www.jsqmd.com/news/334818/

相关文章:

  • 333333
  • 留心短期相聚这些细节,爸妈记性变差、迷路可能是老年痴呆症前兆表现 - 资讯焦点
  • BASE64格式图片储存到本地磁盘
  • 解锁免疫潜能:B 细胞活化的 “黄金密钥”
  • AI原生应用领域多租户技术的创新实践
  • 社会网络仿真软件:UCINET_(8).结构洞与社会资本分析
  • React Native for OpenHarmony:构建高性能、高体验的 TextInput 输入表单
  • 社会网络仿真软件:UCINET_(9).结构洞与社会资本
  • 永辉超市卡回收方法、流程与折扣全解析 - 京顺回收
  • 社会网络仿真软件:UCINET_(7).网络聚类与社区检测
  • 洛谷 P3503 [POI 2010] KLO-Blocks 题解
  • 社会网络仿真软件:UCINET_(6).中心性与权力分析
  • 多语言 SEO 破局:从零搭建跨语言主题权威性,抢占全球流量
  • 社会网络仿真软件:UCINET_(6).基本网络度量指标
  • 实时渲染 + AI算法:直播美颜SDK中智能美妆的技术架构拆解
  • 基于深度学习的衣物分类识别 AI图像识别技术在衣物分类 短袖衬衫识别 图像数据集
  • 2026武汉临空改善型住宅及商铺推荐榜低密现房优享 - 资讯焦点
  • 高性能直播美颜sdk开发方案:智能美妆算法如何兼顾效果与性能?
  • 日程
  • 财务发票报销审核严?AI自动查合规性,不合规一键退回
  • 销售客户需求记不住?RPA自动存需求,后续推荐更精准
  • 社会网络仿真软件:UCINET_(4).数据准备与导入
  • 宏智树 AI:问卷设计还在 “凭经验凑题”?AI 让 “无效调研” 变 “数据金矿”!
  • 宏智树 AI 封神!学术 PPT 不用熬:开题 / 答辩 / 汇报 30 分钟速成
  • 社会网络仿真软件:UCINET_(5).网络可视化技术
  • 宏智树 AI 太懂论文党!零代码搞定数据分析,小白也能写硬核实证
  • 宏智树 AI:课程论文不用 “凑字数”,新手也能写出 “导师夸爆” 的学术感
  • 用 eBPF 给 PF_PACKET 套接字做“多路分发”(C/C++代码实现)
  • 计算机SSM毕设实战-基于ssm的生产设备信息管理系统的设计与实现设备档案管理、维修记录管理【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 社会网络仿真软件:UCINET_(3).UCINET安装与配置