
1. 为什么需要全量镜像准备在离线环境中部署Rancher时最让人头疼的问题就是镜像缺失。很多运维工程师都遇到过这样的情况部署过程进行到90%突然因为缺少某个镜像而中断这时候再去临时找镜像不仅浪费时间还可能因为版本不匹配导致更多问题。我去年在客户现场就踩过这个坑。当时部署的是RKE1.3.0版本所有节点都已经配置完成眼看着就要大功告成结果控制台突然报错hostname not found。排查了半天才发现是因为某个边缘组件的镜像没有完整下载。更气人的是这个镜像在部署前期根本不会用到只有到最后阶段才会被调用。最后不得不回退到1.2.7版本重新部署白白浪费了大半天时间。后来我发现Rancher官方其实提供了完整的解决方案 - rancher-save-images.sh和rancher-load-images.sh这对黄金组合。前者负责从Docker Hub批量拉取指定版本的所有镜像后者则将这些镜像推送到私有仓库。使用这套方案后部署成功率直接从60%提升到了100%。2. 准备工作与环境配置2.1 获取必要脚本文件首先需要从Rancher的GitHub仓库获取三个关键文件rancher-images.txt包含该版本所有依赖镜像的清单rancher-save-images.sh镜像抓取脚本rancher-load-images.sh镜像推送脚本以Rancher 2.6.5为例可以在其Release页面的Assets部分找到这些文件。建议总是使用与目标版本完全匹配的文件避免兼容性问题。2.2 配置外网环境虽然最终要在离线环境部署但第一步还是需要在外网环境完成镜像抓取。准备一台可以访问Docker Hub的Linux主机确保已安装Docker并配置好权限磁盘空间充足全量镜像包可能超过10GB网络连接稳定下载中断需要重头再来# 检查Docker是否正常运行 docker ps # 查看磁盘空间 df -h3. 智能筛选最高版本镜像3.1 理解镜像版本管理打开rancher-images.txt文件你会发现每个组件可能对应多个版本。比如某个网络插件可能有1.0.1、1.0.2、1.1.0等多个版本同时存在。直接使用完整列表会下载大量冗余镜像既浪费时间又占用存储空间。3.2 使用AWK筛选最高版本这个命令组合能智能提取每个镜像的最新版本input_file~/rancher-images.txt awk -F : {print $1 : $2} $input_file | sort -V | awk -F : {seen[$1]$0} END {for (i in seen) print seen[i]} | sort ~/max-version.txt让我拆解下这个命令的工作原理首先用awk按冒号分割保留镜像名和标签用sort -V进行版本号排序V参数专门处理版本号再用awk保留每个镜像名的最后一条记录即最高版本最后整体排序并输出到max-version.txt3.3 验证筛选结果建议用head命令检查下输出文件head -n 10 ~/max-version.txt确认每个镜像确实只保留了最高版本没有重复条目。4. 批量抓取镜像实战4.1 执行抓取脚本给脚本添加执行权限并运行chmod x rancher-save-images.sh ./rancher-save-images.sh --image-list ./max-version.txt这个过程可能会持续数小时取决于你的网速和镜像数量。建议使用screen或tmux保持会话避免网络中断导致前功尽弃。4.2 监控下载进度可以通过以下命令实时查看下载情况# 查看正在下载的镜像 docker ps # 查看已下载的镜像列表 docker images # 查看生成的压缩包大小 ls -lh rancher-images.tar.gz4.3 处理常见问题如果遇到下载中断可以删除已下载的镜像docker rmi image_id清理临时文件docker system prune重新运行脚本特别注意某些大镜像如nvidia-driver可能需要特殊网络配置才能下载。5. 私有仓库推送指南5.1 准备离线环境将以下文件传输到内网环境rancher-images.tar.gzrancher-load-images.shmax-version.txt确保内网机器已安装Docker并且可以访问私有仓库如Harbor。5.2 配置仓库认证如果私有仓库需要认证先登录docker login harbor.example.com -u admin -p Harbor123455.3 执行推送脚本chmod x rancher-load-images.sh ./rancher-load-images.sh --image-list ./max-version.txt --registry harbor.example.com推送过程同样耗时较长可以通过以下命令验证进度# 查看已推送的镜像 curl -u admin:Harbor12345 -X GET https://harbor.example.com/api/v2.0/projects/rancher/repositories | jq6. 部署验证与排错6.1 验证镜像完整性在Harbor控制台检查所有镜像是否完整上传镜像数量是否与max-version.txt一致各镜像大小是否合理没有0KB的无效镜像6.2 模拟部署测试建议先在测试环境验证docker run --rm -it rancher/rancher:v2.6.5检查容器日志是否有镜像拉取失败的错误。6.3 常见问题解决问题1推送时报错unauthorized解决方案检查docker login状态确保有推送权限问题2某些镜像推送失败解决方案手动重新推送该镜像docker pull rancher/镜像名:版本 docker tag rancher/镜像名:版本 harbor.example.com/rancher/镜像名:版本 docker push harbor.example.com/rancher/镜像名:版本问题3部署时仍然报缺失镜像解决方案检查Rancher版本是否与镜像版本完全匹配7. 高级技巧与优化建议7.1 增量更新策略当Rancher版本升级时不需要重新下载所有镜像。可以对比新旧版本的max-version.txt只下载新增或升级的镜像合并到原有镜像包中# 找出新增的镜像 comm -13 old-version.txt new-version.txt diff.txt7.2 镜像存储优化对于磁盘空间紧张的环境使用docker save/load代替tar.gz按组件拆分镜像包启用Harbor的垃圾回收功能7.3 自动化集成将整个过程集成到CI/CD流水线中实现定时检查新版本自动下载验证测试后同步到生产仓库# 示例cron任务 0 2 * * * /path/to/update-rancher.sh在实际项目中这套方案已经帮助我成功部署了数十个离线Rancher环境。关键是要严格遵循版本匹配原则确保镜像列表、脚本版本和Rancher版本三者一致。虽然前期准备耗时较长但相比部署中断带来的麻烦这些投入绝对是值得的。