亚马逊AWS官方博客

在 AWS 中国区方便安全的使用海外公开容器镜像

Kubernetes生态中常见开源组件的公开容器镜像注册表(container image registry)主要有Docker Hub, Google Container Registry(gcr.io)和Quay(quay.io)等。对于这些容器镜像的使用,我们通常有以下两种需求:

  1. 从国内访问这些镜像仓库时通常会碰到网络不稳定或无法访问的问题,因此需要将这些镜像复制到国内镜像仓库以提供稳定快速的访问。
  2. 出于安全合规的需要,ECS容器实例或EKS工作节点被禁止访问外网,需要将部分海外容器镜像复制到通过ECR内,只能通过VPC endpoint来访问ECR容器镜像。

本文将介绍如何自己搭建一套容器镜像复制方案,以方便快速的将指定的海外容器镜像复制到中国区AWS ECR镜像仓库内,该方案的代码已经在github开放 (https://github.com/aws-samples/amazon-ecr-replication-for-pub-container-images)。方案原理和架构如下:

工作原理

  1. 管理员将增加需要的镜像路径及其tag修改到txt并提交到AWS CodeCommit仓库中。
  2. 根据预先配置好的触发规则,AWS CodeCommit会触发AWS CodeBuild启动构建任务。
  3. AWS CodeBuild构建任务根据txt中的镜像列表从公开镜像仓库中拉取这些镜像。
  4. AWS CodeBuild构建任务将拉取到本地的镜像重新打tag以指向ECR仓库,然后从AWS Secrets Manager中获取预先保存的AWS国内区域的访问秘钥以登录国内ECR, 最后将这些镜像推送到国内ECR仓库。
  5. 容器管理平台如Amazon ECS或EKS从本地ECR拉取这些镜像以运行容器。

部署步骤

将本方案部署在AWS海外区域,如东京、新加坡、香港等区域。

  1. 请按照AWS CDK的Getting started with the AWS CDK安装AWS CLI, Node.js及其它工具。
  2. 准备好AWS中国区IAM用户的Access Key和Secret Access Key,此用户需要有所有ECR registry的权限。
  3. 克隆github 项目并构建此CDK项目:
$ git clone https://github.com/aws-samples/amazon-ecr-replication-for-pub-container-images.git
$ cd amazon-ecr-replication-for-pub-container-images
$ npm install
  1. 部署此方案到AWS海外区域,其中targetRegion,targetRegionAK和targetRegionSK分别代表AWS国内区域AWS用户的access key和secret access key。此秘钥会保存在AWS Secrets Manager中以供CodeBuild登录AWS国内区域ECR。
$ npx cdk deploy --parameters targetRegion=cn-northwest-1 --parameters targetRegionAK=AKABCD12345 --parameters targetRegionSK=SK12345
  1. 在创建的CodeCommit仓库内,将需要复制的镜像列表写入txt文件中并提交给CodeCommit仓库,提交后会自动触发CodeBuild将指定的镜像复制到中国AWS账户的ECR仓库中。
  2. 如果不再需要此复制方案,可以删除CDK stack
$ npx cdk destroy

使用复制后的ECR方式

同步至ECR的镜像路径规则如下,其中{account-id}是您的AWS账号ID

  • Docker Hub
    • 原始镜像路径: [library/]repo:tag
    • ECR镜像路径: {account-id}.dkr---ecr---cn-northwest-1.amazonaws.com.rproxy.goskope.com.cn/dockerhub/[library/]repo:tag
  • GCR
    • 原始镜像路径: gcr.io/namespace/repo:tag
    • ECR镜像路径: {account-id}.dkr---ecr---cn-northwest-1.amazonaws.com.rproxy.goskope.com.cn/gcr/namespace/repo:tag
    • 原始镜像路径: k8s.gcr.io/repo:tag
    • ECR镜像路径: {account-id}.dkr---ecr---cn-northwest-1.amazonaws.com.rproxy.goskope.com.cn/gcr/google_containers/repo:tag
  • Quay
    • 原始镜像路径: quay.io/namespace/repo:tag
    • ECR镜像路径: {account-id}.dkr---ecr---cn-northwest-1.amazonaws.com.rproxy.goskope.com.cn/quay/namespace/repo:tag

使用方法

根据部署方式的不同,有以下各种使用ECR镜像的方法:

  1. 直接修改 kubernetes deployment manifest 或ECS的 task definition 中的 image 指向本项目 ECR 中相应镜像的路径。
  2. 不方便修改 image 路径,或者想自动替换所有 Kubernetes Pod 中 image 到相应 ECR 路径,可以使用Kubernetes的 Mutating admission webhook(https://github.com/aws-samples/amazon-api-gateway-mutating-webhook-for-k8) 实现自动替换。
  3. 利用 Helm Charts 部署应用,并且chart template支持自定义Pod image,可以设置 chart 参数,指向本项目 ECR 中相应镜像的路径。
  4. 如果您的 kubernetes 集群直接使用 kubectl 部署,且kubectl版本在14或以上,可以使用kustomize将原始 image 路径指向指向本项目 ECR 中相应镜像的路径。

总结

本文描述的方案可以将常见的海外公开容器镜像自动复制到中国AWS ECR镜像仓库中,部署方法简单易用,后期只需维护镜像列表即可。复制到中国AWS ECR镜像仓库后,即可以共享给其他用户,也可以配合VPC private link让ECS或EKS服务更安全稳定的使用这些镜像。

 

本篇作者

何归丽

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广。加入AWS之前在外企软件部门担任系统架构师,有十多年的软件研发和架构设计经验,在微服务架构和容器、企业应用信息安全、DevOps等领域有丰富的经验。

张峻忠

西云数据解决方案架构师。十余年软件/互联网研发、设计经验。2019年加入西云数据解决方案团队,专注构建企业使用AWS方案。