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 集群。

相关推荐
运维全栈笔记9 小时前
K8S部署Redis高可用全攻略:1主2从3哨兵架构实战
redis·docker·云原生·容器·架构·kubernetes·bootstrap
尘世壹俗人9 小时前
使用K8s部署模型
kubernetes
AI木马人11 小时前
9.人工智能实战:GPU 服务如何上 Kubernetes?从单机部署到 K8s + NVIDIA Device Plugin + HPA 的生产级改造
人工智能·容器·kubernetes
码点滴15 小时前
告别显存焦虑:PagedAttention 如何将大模型吞吐量提升 4 倍?
人工智能·架构·kubernetes·大模型·pagedattention
键盘鼓手苏苏17 小时前
Kubernetes 容器安全最佳实践
云原生·kubernetes·k8
键盘鼓手苏苏17 小时前
Kubernetes 安全最佳实践
云原生·kubernetes·k8
木雷坞2 天前
K8s GPU 推理服务 ImagePullBackOff 排查与预热
云原生·容器·kubernetes·gpu算力
吴爃2 天前
Spring Boot 项目在 K8S 中的打包、部署与运维发布实践
运维·spring boot·kubernetes
The Straggling Crow2 天前
Monitoring 2026-04-30
kubernetes
AOwhisky2 天前
Kubernetes调度与服务暴露:从“定时任务”到“服务发现”的完全指南
linux·运维·云原生·容器·kubernetes·服务发现