rancher2.7.3版本部署在内网离线环境,不通外网,无法从公网拉取镜像的情况下,不断地在尝试拉取rancher/shell:v0.1.19,导致主机开销很大,影响到正常应用从harbor拉取镜像。请问可以解决么?
首先,docker run 启动的 rancher 只适合测试和开发环境,不适合上生产。
其次,这个问题是因为 docker run 启动的 rancher,里面只内置了 pause 和 coredns 的镜像,rancher 启动后,还需要启动一些其他的服务,所以还需要拉取一些其他的镜像。
对于这个问题,有两个解决方案:
1. 配置私有镜像仓库
因为 docker run 启动的 rancher 容器里内置 K3s,所以可以将容器中的 K3s 私有镜像仓库的配置文件映射到本地,然后通过这个文件连接到私有镜像仓库去拉取镜像,参考:https://mp.weixin.qq.com/s/AgKpijFXDZ40t06JHGqquw
2. 手动导入镜像
由于 docker run 启动的 rancher 内置的 K3s 是封装在容器中的,所以你在本地主机导入镜像,容器里的 K3s 根本不会识别,所以需要将镜像导入到容器中。
首先,你需要获取对应版本的 rancher 中需要的镜像,这里介绍个简单方法,就是找个在线的环境启动一个相同版本的 rancher,启动后 exec 到rancher 容器里去执行:
a7065429e785:/var/lib/rancher # crictl images | awk '{print $1":"$2}'
docker.io/rancher/fleet-agent:v0.6.0
docker.io/rancher/fleet:v0.6.0
docker.io/rancher/gitjob:v0.1.37
docker.io/rancher/mirrored-coredns-coredns:1.9.4
docker.io/rancher/mirrored-pause:3.6
docker.io/rancher/rancher-webhook:v0.3.3
docker.io/rancher/shell:v0.1.19
以上,就是该版本需要的 容器镜像。
导入的方法也有有两种:
- 手动导入
- 找一台可以访问外网并且安装 docker 的主机,将镜像拉取到本地,并使用
docker save
保存为 tar 镜像包。例如:
root@v27-1:~# docker save -o shell.tar rancher/shell:v0.1.19
- 将镜像复制到容器内
root@v27-1:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2e494e6066a rancher/rancher:v2.7.3 "entrypoint.sh" 9 seconds ago Up 7 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp practical_lederberg
root@v27-1:~# docker cp shell.tar e2e:/tmp
- 手动导入镜像
root@v27-1:~# docker exec -it e2e bash
e2e494e6066a:/var/lib/rancher # crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/rancher/mirrored-coredns-coredns 1.9.4 a81c2ec4e946d 49.8MB
docker.io/rancher/mirrored-pause 3.6 6270bb605e12e 686kB
e2e494e6066a:/var/lib/rancher # ctr -n k8s.io images import /tmp/shell.tar
e2e494e6066a:/var/lib/rancher # crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/rancher/mirrored-coredns-coredns 1.9.4 a81c2ec4e946d 49.8MB
docker.io/rancher/mirrored-pause 3.6 6270bb605e12e 686kB
docker.io/rancher/shell v0.1.19 0d3d2da4b3086 352MB
- 利用 K3s 自动加载镜像
K3s 在启动时会自动检查/var/lib/rancher/k3s/agent/images/
目录中是否包含镜像的 tar 包,如果包含,会自动导入镜像到 K3s 中
root@v27-1:~# docker run -itd -p 80:80 -p 443:443 --privileged rancher/rancher:v2.7.3
aef515fb84c79b2ddd7519ee84a166a17984352c0bb21690b5c1bf3489fe7391
root@v27-1:~# docker cp shell.tar aef:/var/lib/rancher/k3s/agent/images/
root@v27-1:~# docker restart ae
ae
root@v27-1:~# docker exec -it aef crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/rancher/mirrored-coredns-coredns 1.9.4 a81c2ec4e946d 49.8MB
docker.io/rancher/mirrored-pause 3.6 6270bb605e12e 686kB
docker.io/rancher/shell v0.1.19 0d3d2da4b3086 352MB
问题已经按照ksd大佬的方式解决,我这里总结下:
1、rancher启动环境变量增加私有仓库地址
- name: CATTLE_SYSTEM_DEFAULT_REGISTRY
value: 私有仓库IP/域名:端口(80和443端口可以不加)
2、在私有仓库中创建 rancher这个项目并将一下镜像推送到这个项目
docker.io/rancher/fleet-agent:v0.6.0
docker.io/rancher/fleet:v0.6.0
docker.io/rancher/gitjob:v0.1.37
docker.io/rancher/mirrored-coredns-coredns:1.9.4
docker.io/rancher/mirrored-pause:3.6
docker.io/rancher/rancher-webhook:v0.3.3
docker.io/rancher/shell:v0.1.19
3、重新apply 以后,删除报错的pod,等待启动新的就好了。
重点:
1、rancher环境变量中的harbor地址不能带项目名称。
2、项目名称必须是rancher。
真复杂