如何解决国内网络环境下 k8s.gcr.io无法直接下载镜像的问题

在国内部署k8s最大的难点是镜像下载,比如这个错误信息:

Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

由于众所周知的原因,国内的网络环境是很难从k8s.gcr.io等镜像源里面下载镜像。这种情况下的普遍解决办法是:

  1. 直接使用国内镜像代理仓库(如阿里云代理仓库)进行镜像拉取下载,pull成功拉取之后,再将镜像tag打成k8s.gcr.io对应的镜像。但这种方式有时候会遇到版本滞后等问题。
  2. 有时候访问mirrorgooglecontainers是没问题的,也可以从mirrorgooglecontainers上获取镜像,pull之后再将镜像tag打成k8s.gcr.io对应的镜像。
  3. 在nat网关处部署代理服务,对k8s.gcr.io域名进行直接代理。这种方案应该是最简单的。

在国内使用k8s,一般建议将imagePullPolicy策略改为IfNotPresent,即如果本地有镜像就优先使用本地镜像,不每次都进行额外的拉取动作,或者在上面的步骤中,直接将镜像放到自建harbor私有仓库里面,后续直接指向harbor私有仓库的地址。

补充上述第一条中阿里云代理仓库的地址,其地址为:registry.aliyuncs.com/google_containers

比如以下载 k8s.gcr.io/coredns:1.6.5 为例,就可以代理为:registry.aliyuncs.com/google_containers/coredns:1.6.5 详细步骤如下:

首先尝试直接从k8s.gcr.io上拉取

# docker pull k8s.gcr.io/coredns:1.6.5
Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

看到以上这个错误,就知道无法直接访问了,于是直接使用代理仓库去拉取

# docker pull registry.aliyuncs.com/google_containers/coredns:1.6.5
1.6.5: Pulling from google_containers/coredns
c6568d217a00: Pull complete
fc6a9081f665: Pull complete
Digest: sha256:7ec975f167d815311a7136c32e70735f0d00b73781365df1befd46ed35bd4fe7
Status: Downloaded newer image for registry.aliyuncs.com/google_containers/coredns:1.6.5
registry.aliyuncs.com/google_containers/coredns:1.6.5

然后对拉取完成的镜像进行tag打标签

# docker tag registry.aliyuncs.com/google_containers/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5

执行docker images可以看到刚打好的镜像名称

# docker images
REPOSITORY                                        TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/coredns                                1.6.5               70f311871ae1        1 years ago        41.6MB
registry.aliyuncs.com/google_containers/coredns   1.6.5               70f311871ae1        1 years ago        41.6MB

我们要的镜像就成功被拉取啦,你可以把多余的代理镜像的tag删掉,不删也没啥问题。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享