crictl导入导出镜像,快速同步镜像到其他节点

背景

今天,我的 Kubernetes 集群中的一个 Pod 重启并切换到了另一个节点。由于是部署的kubesphere,没关注代理的事情,然而,由于国内网络环境无法直接访问 Docker 官方服务器,新节点没有镜像,导致新节点无法拉取所需的镜像 ,最终 Pod 启动失败。由于事情紧急,决定在有镜像的服务器上备份一个出来同步到其他节点,经过一番折腾,我找到了解决方案,并在此分享给大家。


问题分析

  1. Pod 重启并切换节点:Kubernetes 的调度器将 Pod 调度到了一个没有所需镜像的节点。
  2. 镜像拉取失败:由于国内网络限制,节点无法从 Docker 官方服务器拉取镜像。
  3. 解决方案:将已有节点上的镜像同步到新节点,避免直接拉取。

解决方案

前提条件

  • 集群中至少有一个节点已经存在所需的镜像。
  • 使用 containerd 作为容器运行时(K3s 默认使用 containerd)。

步骤 1:在已有镜像的节点上导出镜像

使用 ctrcontainerd 的命令行工具)将镜像导出为 tar 文件:

bash 复制代码
ctr -n k8s.io images export ks-controller-manager.tar docker.io/kubesphere/ks-controller-manager:latest

注意

  • -n k8s.io 指定命名空间为 k8s.io,这是 K3s 使用的 containerd 命名空间。
  • docker.io/kubesphere/ks-controller-manager:latest 是镜像的名称和标签,请根据实际情况替换。

步骤 2:将 tar 文件传输到目标节点

使用 scp 或其他工具将 tar 文件传输到目标节点:

scss 复制代码
scp ks-controller-manager.tar user@xx.xx.xx.xx:/opt

步骤 3:在目标节点上导入镜像

在目标节点上,使用 ctr 导入镜像:

arduino 复制代码
ctr -n k8s.io images import /opt/ks-controller-manager.tar

步骤 4:验证镜像是否导入成功

检查镜像是否已成功导入:

bash 复制代码
ctr -n k8s.io images list | grep kubesphere/ks-controller-manager

步骤 5:重启相关 Pod

如果 Kubernetes 中有 Pod 依赖该镜像,可能需要重启这些 Pod:

ini 复制代码
kubectl delete pod -n kubesphere-system -l app=ks-controller-manager

Kubernetes 会自动重新创建这些 Pod,并使用新导入的镜像。


步骤 6:检查 Pod 状态

确保 Pod 正常运行:

ini 复制代码
kubectl get pods -n kubesphere-system -l app=ks-controller-manager

额外提示

如果 ctr 不可用,可以尝试使用 crictl(Kubernetes 的 CRI 工具)来操作镜像:

  1. 导出镜像:

    bash 复制代码
    crictl pull docker.io/kubesphere/ks-controller-manager:latest
    crictl images --digests | grep kubesphere/ks-controller-manager
  2. 在目标节点上拉取镜像:

    bash 复制代码
    crictl pull docker.io/kubesphere/ks-controller-manager:latest
  3. 验证镜像:

    bash 复制代码
    crictl images | grep kubesphere/ks-controller-manager

总结

通过以上步骤,我们可以将已有节点上的镜像同步到新节点,从而避免因国内网络限制导致的镜像拉取失败问题。这种方法不仅适用于 K3s,也适用于其他使用 containerd 作为容器运行时的 Kubernetes 集群。

相关推荐
bukeyiwanshui15 小时前
20260626 k8sControllers介绍
云原生·容器·kubernetes
能有时光16 小时前
] K8s 核心组件使用指南
云原生·容器·kubernetes
云烟成雨TD17 小时前
Kubernetes 系列【13】控制器:可视化操作 Deployment
云原生·容器·kubernetes
运维老郭1 天前
【K8s运维实战】Kubernetes临时存储卷实战:emptyDir核心用法与gitRepo弃用迁移指南
运维·云原生·kubernetes
gs801402 天前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui2 天前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
Zhu7582 天前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
摇滚侠2 天前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 51-60
java·云原生·kubernetes
bukeyiwanshui2 天前
20260703 K8s ECShop商城项目
云原生·容器·kubernetes