利用github ci拉取 registry.k8s.io 镜像,并上传到指定ACR镜像地址。

因为众所周知的原因,registry.k8s.io在境内服务器是无法稳定访问的,

比如,我要安装ingress-nginx,执行命令

sudo docker pull registry.k8s.io/ingress-nginx/controller:v1.7.0

很快就会提示

Error response from daemon: Get "https://registry.k8s.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

这时要么找一个国内的公共镜像地址,要么找一台境外的机器先pull过来,然后将其push到自己的ACR上,

然而,这两个方法都不好找。

后来,突然想到,github的ci不就是现成的境外服务器吗,

只要设置下github action,就可以自动执行对应镜像pull和push。

过程也不复杂,

在github建一个空的仓库,最好是私有,

然后在根目录建立一个ci文件: .github/workflows/acr.yml

acr.yml的内容如下

name: Pull and Push to ACK

on:
  push:
    branches: [ "master" ]

    - name: Login to ACR with the AccessKey pair
      uses: aliyun/acr-login@v1
      with:
        login-server: "registry.cn-beijing.aliyuncs.com"
        region-id: "cn-beijing"
        username: "${{ secrets.ACR_USERNAME }}"
        password: "${{ secrets.ACR_PASSWORD }}"
    - name: push ingress-nginx
      run: |
        docker pull registry.k8s.io/ingress-nginx/controller:v1.7.0
        docker tag registry.k8s.io/ingress-nginx/controller:v1.7.0 registry.cn-beijing.aliyuncs.com/tiyee/ingress-nginx-controller:v1.7.0
        docker push registry.cn-beijing.aliyuncs.com/tiyee/ingress-nginx-controller:v1.7.0

这里头的 secrets.ACR_USERNAME secrets.ACR_PASSWORD 需要在github的Actions secrets and variables里去设置,具体以参考(https://docs.github.com/en/actions/security-guides/encrypted-secrets)

当然了,如果不怕acr的用户名和密码泄露,你也可以直接这样写死用户名和密码


name: Pull and Push to ACK

on:
  push:
    branches: [ "master" ]

    - name: push ingress-nginx
      run: |
        docker login  -u xxxxx -p xxxxx registry.cn-beijing.aliyuncs.com
        docker pull registry.k8s.io/ingress-nginx/controller:v1.7.0
        docker tag registry.k8s.io/ingress-nginx/controller:v1.7.0 registry.cn-beijing.aliyuncs.com/tiyee/ingress-nginx-controller:v1.7.0
        docker push registry.cn-beijing.aliyuncs.com/tiyee/ingress-nginx-controller:v1.7.0

在执行push之前,记得在阿里云acr上选择一个地域,并创建命名空间。

这样只要随便往这个仓库的master分支push任何提交,就会触发拉取和上传,然后,就可以直接用acr的镜像地址去服务器拉取镜像了。

不止是 registry.k8s.io,其他的镜像仓库也可以用此方法,

另外,acr是可以内网地址访问的,对于没有开外网的机器,可以用此方法将image安装到机器上。

关于 github action的详细用法可以参考 Github Action

aliyun acr的使用说明,可以看这里使用企业版实例推送和拉取镜像-阿里云