部署 K8S 时,关键组件的镜像地址通常存放在 k8s.gcr.io,国内直接访问受限。常见思路是搭代理或换国内镜像地址:搭代理有配置门槛,换国内地址又可能碰上某些版本找不到对应镜像的问题。这里记录两种更实际的做法:找第三方缓存源替换,以及用国外服务器离线中转。
做法一:用第三方镜像源替换
以拉取 gcr.io/kubernetes-helm/tiller:v2.16.10 为例。先搜索哪些源提供了这个镜像:
docker search tiller
%

%
结果里 sapcc/tiller 是缓存 gcr.io/kubernetes-helm 的镜像,去 Docker Hub 上搜一下 sapcc/tiller 验证源信息:
%

%
版本信息吻合,就可以直接把地址换成这个第三方源:
docker pull sapcc/tiller:v2.16.10
拉下来后用 docker images 确认本地镜像存在,再把镜像改回 k8s.gcr.io 域名下的名字:
docker tag sapcc/tiller:v2.16.10 gcr.io/kubernetes-helm/tiller:v2.16.10
这相当于镜像已经从官方地址拉到了本地,YAML 里不需要做任何修改。
做法二:国外服务器离线中转
更稳妥的方式:买一台国外服务器,把镜像下载后打包,导入国内服务器,再重新命名打 TAG。以部署 ingress-nginx 为例,先确认清单里用到哪些镜像:
[root@k8s-master1 ingress-nginx]# grep image deploy.yaml
%

%
在国外的服务器上下载对应镜像:
docker pull k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0
docker pull k8s.gcr.io/ingress-nginx/controller:v1.0.0
查看镜像 ID:
docker images | grep ingress-nginx
%

%
按 ID 打包成 tar:
docker save ef43679c2cae -o /root/ingress-nginx-controller_v1.tar
docker save 17e55ec30f20 -o /root/ingress-nginx-kube-webhook-certgen_v1.tar
拷到国内服务器导入:
docker load -i ingress-nginx-controller_v1.tar
docker load -i ingress-nginx-kube-webhook-certgen_v1.tar
注意:导入的镜像名称和 TAG 会显示为 <none>,但镜像 ID 和打包前一致,按 ID 确认名称后重新打 TAG:
docker tag ef43679c2cae k8s.gcr.io/ingress-nginx/controller:v1.0.0
docker tag 17e55ec30f20 k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0
其他方式
还有两个思路:一是直接用公共镜像代理服务 dockerproxy.com;二是在国外服务器上部署 Docker 官方开源的 registry,做 k8s.gcr.io 仓库的代理缓存,这种方式配置环节多,比较麻烦。镜像数量少时离线中转最省心,长期维护多套环境再考虑自建 registry。

















暂无评论内容