自己动手将谷歌k8s镜像同步到阿里云

Kubernetes 相关的docker镜像存放在Google的镜像仓库 k8s.gcr.io,在国内网络环境内无法访问。有人已经将这些镜像同步到了阿里云,你可以在阿里云容器镜像服务中搜索到它们。几乎所有的k8s镜像都已经同步到了阿里云。阿里云容器服务团队甚至还有一个开源项目sync-repo,专门做Docker Registry之间的同步。但是,如果你不放心别人同步的镜像,或者最新版本的镜像还没人同步过来,你可以按照本文将介绍的步骤,自己将gcr.io上的docker镜像搬到阿里云。

# 安装配置shadowsocks客户端

先简单介绍下Shadowsocks协议,详细的工作原理可以参考这篇博客

ss

当我们启动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
1
brew install shadowsocks-libev
  • Ubuntu
1
sudo apt install shadowsocks-libev

接下来填写shadowsocks client配置文件,JSON格式,简单易懂:

1
2
3
4
5
6
7
8
{
    "server":"ss服务器IP",
    "server_port":443, // ss服务器port
    "local_port":1080, // 本地监听端口
    "password":"xxxx", // ss服务器密码
    "timeout":600,
    "method":"aes-256-cfb" // ss服务器加密方法
}

至于shadowsocks服务器端,可以租用国内网络外的云主机自己搭建,也可以购买现成的机场服务,本文就不讨论了。

然后启动shadowsocks client

1
nohup ss-local -c ss-client.conf &

# 安装配置HTTP代理

shadowsocks client创建的是socks5代理,不过一些程序无法使用 socks5 ,它们需要通过 http_proxyhttps_proxy 环境变量,使用 HTTP 代理。polipo 可以帮助我们将 socks5 代理转换为 HTTP 代理。

  • macOS下安装polipo
1
brew install polipo
  • Ubuntu下安装polipo
1
2
3
4
5
sudo apt install polipo

# 建议停掉polipo服务,需要的时候自己启动
sudo systemctl stop polipo.service
sudo systemctl disable  polipo.service

启动HTTP代理

1
sudo polipo socksParentProxy=127.0.0.1:1080 proxyPort=1087

socksParentProxy配置为localhostss-local监听端口,proxyPort是启动的HTTP代理端口。

我们可以在命令行终端测试HTTP代理的效果:

1
2
3
$ export http_proxy=http://localhost:1087
$ export https_proxy=http://localhost:1087
$ curl https://www.google.com

应该可以正常访问到Google。

# 设置Docker HTTP代理

如果是在macOS上使用Docker Desctop,可以在Preference中的Proxies设置上一步启动的HTTP代理:

docker proxy

如果是Linux平台,请参考Docker的官方文档进行设置。

# 在阿里云创建容器镜像的命名空间

为了将镜像同步到阿里云,首先需要在阿里云的容器镜像服务控制台创建镜像的命名空间。

aliyun docker image namespace

建议将仓库类型设置为“公开”,这样其他人也能搜索、下载到镜像。

#gcr.io下载镜像

在本机从gcr.io下载镜像,我们以镜像pause:3.1为例:

1
docker pull k8s.gcr.io/pause:3.1

# 给镜像标记新的tag

根据前面在阿里云创建的命名空间,给镜像标记新的tag

1
docker tag k8s.gcr.io/pause:3.1 registry.cn-shenzhen.aliyuncs.com/mz-k8s/pause:3.1

mz-k8s是在前面创建的命名空间。 查看tag结果:

1
2
3
4
5
$ docker images

REPOSITORY                                       TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/pause                                 3.1                 da86e6ba6ca1        17 months ago       742kB
registry.cn-shenzhen.aliyuncs.com/mz-k8s/pause   3.1                 da86e6ba6ca1        17 months ago       742kB

通过IMAGE ID可以看出,两个镜像为同一个。

# 将镜像上传到阿里云

登录阿里云镜像仓库:

1
$ docker login --username=(阿里云账号) registry.cn-shenzhen.aliyuncs.com

根据提示输入password,登录成功后,显示Login Succeeded。

上传镜像:

1
docker push registry.cn-shenzhen.aliyuncs.com/mz-k8s/pause:3.1

# 从阿里云下载镜像

现在可以在其他机器上从阿里云下载pause:3.1镜像,这时候已经不需要科学上网了:

1
$ docker pull registry.cn-shenzhen.aliyuncs.com/mz-k8s/pause:3.1

给镜像打上原来的tag,这样kubeadm等工具就可以使用本地仓库中的pause:3.1镜像了:

1
$ docker tag registry.cn-shenzhen.aliyuncs.com/mz-k8s/pause:3.1 k8s.gcr.io/pause:3.1

至此,我们跨越长城,将一个docker镜像从gcr.io搬到了Aliyun

如果是需要批量、定时的从gcr.io同步镜像,建议考虑使用阿里开源的sync-repo

comments powered by Disqus