Rancher2.x内网隔离环境,不停拉取rancher/shell:v0.1.19导致资源开销过大问题

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

以上,就是该版本需要的 容器镜像。

导入的方法也有有两种:

  1. 手动导入
  • 找一台可以访问外网并且安装 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
  1. 利用 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。

1 个赞

真复杂