一.问题概述
国内网络使用docker部署,local集群会报错,并在创建rke2自定义集群时不成功,会卡住;
二.问题分析
这个问题主要是由于在使用docker run命令启动Rancher容器时,错误地映射了数据目录/var/lib/rancher到宿主机所导致的。下面是详细的问题分析和解决方案整理:
1.内置镜像的tar包
因为通过 docker run 启动的 Rancher 镜像中内置了 rancher/mirrored-coredns-coredns 和 rancher/mirrored-pause 这两个镜像的 tar 包,这样在离线环境上也能自动启动这两个服务。
但是这两个镜像的离线 tar 包默认存储在了 /var/lib/rancher/k3s/agent/images/k3s-airgap-images.tar。
2.数据目录映射
当通过docker run命令启动Rancher容器,并使用-v选项将/var/lib/rancher目录映射到宿主机上时,容器内部的/var/lib/rancher目录将不再指向其原始的、包含tar包的位置,而是指向了宿主机上的一个(可能是空的)目录。
3.离线tar包缺失
由于数据目录的映射,新启动的Rancher容器内缺少了必要的离线tar包(k3s-airgap-images.tar),导致无法自动加载rancher/mirrored-coredns-coredns和rancher/mirrored-pause等镜像。
4.环境限制
在国内网络环境下,使用Docker Hub拉取镜像可能存在问题,而CATTLE_SYSTEM_DEFAULT_REGISTRY环境变量对这些特定pod(由tar包中的镜像启动)不生效,进一步加剧了问题。
三.解决方案
1.取消目录映射
最简单的解决方案是取消-v选项对数据目录/var/lib/rancher的映射,让Rancher容器使用其内置的数据和tar包来启动服务。
2.手动传输tar包:
如果需要映射数据目录,可以手动从Rancher镜像中提取k3s-airgap-images.tar文件,并将其复制到宿主机上的对应目录(如/data/rancher/k3s/agent/images/)。
步骤1:创建映射路径:
mkdir -p /data/rancher/k3s/agent/images/
步骤2:使用Docker命令从Rancher镜像中提取tar包:
docker run --rm --entrypoint "" -v $(pwd):/output rancher/rancher:<version> cp /var/lib/rancher/k3s/agent/images/k3s-airgap-images.tar /output/
步骤3:将提取的tar包复制到宿主机上的目标目录:
mv k3s-airgap-images.tar /data/rancher/k3s/agent/images/
步骤4:使用修改后的docker run命令启动Rancher容器,并确保/var/lib/rancher目录正确映射到宿主机:
docker run -d --restart=unless-stopped --privileged -p 80:80 -p 443:443 -e TZ=Asia/Shanghai -e CATTLE_SYSTEM_DEFAULT_REGISTRY=registry.cn-hangzhou.aliyuncs.com -e CATTLE_BOOTSTRAP_PASSWORD=rancher -v /data/rancher:/var/lib/rancher rancher/rancher:<version>
通过以上任一方法,都可以解决因数据目录映射不当导致的Rancher服务启动问题。
参考链接:https://forums.rancher.cn/t/docker-run-rancher-rancher-mirrored-pause/3546/2