Kubernetes 相关的docker镜像存放在Google的镜像仓库 k8s.gcr.io,在国内网络环境内无法访问。有人已经将这些镜像同步到了阿里云,你可以在阿里云容器镜像服务中搜索到它们。几乎所有的k8s镜像都已经同步到了阿里云。阿里云容器服务团队甚至还有一个开源项目sync-repo,专门做Docker Registry之间的同步。但是,如果你不放心别人同步的镜像,或者最新版本的镜像还没人同步过来,你可以按照本文将介绍的步骤,自己将gcr.io上的docker镜像搬到阿里云。
# 安装配置shadowsocks客户端
先简单介绍下Shadowsocks协议,详细的工作原理可以参考这篇博客:

当我们启动shadowsocks client时,实际上是启动了一个 ss-local 进程,左侧绿色的 Socks5 Client 可以是浏览器,也可以是Telegram等本地应用,它们和ss-local之间是使用 socks 协议进行通信。也就是说,浏览器像连接普通 socks 代理一样,连接到ss-local进程。ss-local 会将收到的请求,转发给ss-server,由ss-server完成实际的访问,并将结果通过ss-local返回给浏览器。ss-server部署在国内网络之外,和ss-local之间是加密传输,这样就实现了跨越长城。其实防火长城已经能够识别Shadowsocks协议,但发现我们是在努力学习先进技术,就先放我们过关。
好了,我们现在首先要做的是在本机安装配置shadowsocks客户端。推荐使用shadowsocks-libev,纯C实现的shadowsocks协议,已经在很多操作系统的官方repository中 ,安装非常方便。
macOS
|
|
Ubuntu
|
|
接下来填写shadowsocks client配置文件,JSON格式,简单易懂:
|
|
至于shadowsocks服务器端,可以租用国内网络外的云主机自己搭建,也可以购买现成的机场服务,本文就不讨论了。
然后启动shadowsocks client:
|
|
# 安装配置HTTP代理
shadowsocks client创建的是socks5代理,不过一些程序无法使用 socks5 ,它们需要通过 http_proxy 和 https_proxy 环境变量,使用 HTTP 代理。polipo 可以帮助我们将 socks5 代理转换为 HTTP 代理。
macOS下安装polipo
|
|
Ubuntu下安装polipo
|
|
启动HTTP代理
|
|
socksParentProxy配置为localhost和ss-local监听端口,proxyPort是启动的HTTP代理端口。
我们可以在命令行终端测试HTTP代理的效果:
|
|
应该可以正常访问到Google。
# 设置Docker HTTP代理
如果是在macOS上使用Docker Desctop,可以在Preference中的Proxies设置上一步启动的HTTP代理:

如果是Linux平台,请参考Docker的官方文档进行设置。
# 在阿里云创建容器镜像的命名空间
为了将镜像同步到阿里云,首先需要在阿里云的容器镜像服务控制台创建镜像的命名空间。

建议将仓库类型设置为“公开”,这样其他人也能搜索、下载到镜像。
#
从gcr.io下载镜像
在本机从gcr.io下载镜像,我们以镜像pause:3.1为例:
|
|
#
给镜像标记新的tag
根据前面在阿里云创建的命名空间,给镜像标记新的tag:
|
|
mz-k8s是在前面创建的命名空间。 查看tag结果:
|
|
通过IMAGE ID可以看出,两个镜像为同一个。
# 将镜像上传到阿里云
登录阿里云镜像仓库:
|
|
根据提示输入password,登录成功后,显示Login Succeeded。
上传镜像:
|
|
# 从阿里云下载镜像
现在可以在其他机器上从阿里云下载pause:3.1镜像,这时候已经不需要科学上网了:
|
|
给镜像打上原来的tag,这样kubeadm等工具就可以使用本地仓库中的pause:3.1镜像了:
|
|
至此,我们跨越长城,将一个docker镜像从gcr.io搬到了Aliyun。
如果是需要批量、定时的从gcr.io同步镜像,建议考虑使用阿里开源的sync-repo。