Docker Hub 自 2020 年 11 月 2 日起实施了对镜像拉取的速率限制,这让许多使用它的用户遇到了不少麻烦。以下为引入的限制:
-
限制如下:
- 未登录用户:每6小时内限制为100次抽取
- 已登录用户:每6小时内限制为200次抽取
我们中的许多人迁移到了私人仓库,比如quay.io、ghrc.io和registry.gitlab.com等。对于一些人而言,使用Docker Hub的认证令牌就已经足够了。
从2025年4月1日开始,就要有新的规定了:
- 个人(已认证):每小时限100次拉
- 未登录用户:每小时每个IPv4地址或每个IPv6 /64子网限10次拉
咱们来看看AWS有哪些方案可以解决速率限制的问题,甚至是更多意想不到的好处。
2021年11月,AWS新推出了一个功能,即亚马逊弹性容器注册表 (ECR) 的拉取缓存特性,这样可以帮我们解决一些问题。
- 使用身份验证令牌在您的私有ECR注册表中缓存公共和私有的镜像
- 加快从私有ECR拉取镜像到本地服务(如ECS、EKS、Lambda等)的速度
- 使用生命周期策略只保留所需的最新镜像标签
- 在拉取时进行镜像的安全扫描
- 当令牌需要轮换或过期(例如Gitlab不允许创建一年以上的令牌)时,有一个地方更新令牌。想象一下,您每年都需要逐个更新所有K8s集群中的令牌
那么,我们来看看如何实现这个功能。你需要创建:
- 一个拉取通过缓存规则,在那里你定义你想在注册表中使用的前缀以及你将所有请求转发到的目标注册表。
- 你想要用于对目标注册表进行验证(例如,用户名和密码)的密钥管理凭证。
- 如果你想要有一个生命周期策略或安全扫描,一个拉取通过缓存仓库模板。
还有一些其他功能,目前可以选择。
正如你看到的,你不会亲自创建这个仓库。它会在你第一次请求缓存时自动创建,使用默认设置,或者如果你指定了模板的话。
如果我在 **us-east-1**
区域创建了一条以 **dockerhub**
为前缀的规则,并将我的拉取请求转发到 **registry-1.docker.io**
,我就可以使用以下命令:
# 直接从Docker Hub拉取镜像
docker pull timberio/vector:0.45.0-alpine # 将timberio/vector版本0.45.0-alpine拉取到本地
# 通过ECR拉取镜像
docker pull 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/timberio/vector:0.45.0-alpine
如你所见,我只添加了我的仓库和 **dockerhub**
作为前缀,然后就是需要拉取的基础镜像。这正是你稍后需要更新 manifest,以便通过 ECR 拉取镜像的地方,非常简单直接。
听起来不难,但为什么不试试用 Terraform(加上一个 Terragrunt 包装器)来做呢?我创建了一个简单的 Terraform 模块,可以帮助你创建多个拉流规则,这些规则是从具有以下结构的基本 YAML 文件中生成的。
dockerhub:
registry: registry-1.docker.io
username: 用户名
accessToken: 访问令牌
gitlab:
registry: registry.gitlab.com
username: 用户名
accessToken: 访问令牌
模块将创建两个带前缀的规则:**dockerhub**
和 **gitlab**
,使用 **username**
和 **accessToken**
作为凭证管理器凭证,并创建一个基本的生命周期策略来保留缓存中的最新 3 个镜像,(为每个注册表添加设置扩展 YAML 是有意义的,但我目前没时间去做了)。
由于我使用了 Terragrunt,我可以使用Sops来加密这个文件,并安全地提交到仓库,所以我的**terragrunt.hcl**
文件看起来是这样的:
terraform {
source = "${get_parent_terragrunt_dir()}modules/ecr-pullthrough"
}
include "root" {
path = find_in_parent_folders("root.hcl")
expose = true
}
locals {
registries = yamldecode(sops_decrypt_file("${get_terragrunt_dir()}/secrets.enc.yaml"))
}
inputs = {
registries = local.registries
tags = merge(include.root.locals.default_tags)
}
您可以在这里找到我的模块插件https://github.com/opsworks-co/ecr-pull-through
如果你使用的是 https://github.com/terraform-aws-modules/terraform-aws-eks 模块来创建集群,并且使用为你工作节点创建的内置角色,不要忘了给角色添加一个新的策略,授权
**ecr:BatchImportUpstreamImage**
,因为默认附加的管理策略**arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPullOnly**
不能通过缓存拉取镜像。
期待您的意见、建议和改进,让我们在领英上连接!
共同学习,写下你的评论
评论加载中...
作者其他优质文章