محدودیت های AWS و Docker Hub: استراتژی های هوشمند برای تغییرات مه 2025

مشکل
Docker Hub محدودیت های نرخ را در تصویر در تاریخ 2 نوامبر 2020 اجرا کرده است که باعث سردردهای زیادی برای کسانی که از آن در محیط خود استفاده می کنند ، ایجاد کرده است. محدودیت های زیر معرفی شد:
- کاربران ناشناس: در هر 6 ساعت محدود به 100 کشش
- کاربران معتبر: در هر 6 ساعت محدود به 200 کشش
بسیاری از ما به مخازن خصوصی AWS ، quay.io ، ghrc.io ، registry.gitlab.com و دیگران مهاجرت کردیم. برای برخی ، استفاده از نشانه تأیید اعتبار برای بیرون کشیدن از Docker Hub کافی بود.
با شروع از 1 آوریل 2025 محدودیت های جدیدی وجود دارد:
- شخصی (تأیید شده): محدود به 100 کشش در ساعت
- کاربران غیرمجاز: محدود به 10 کشش در هر آدرس IPv4 یا زیر شبکه IPv6 /64 در ساعت
راه حل
بیایید ببینیم چه چیزی در AWS داریم تا مشکل را با محدودیت نرخ و حتی قدرت بیشتر حل کنیم.
در نوامبر 2021 ، AWS ویژگی حافظه پنهان کشش را برای رجیستری کانتینر Elastic Amazon (Amazon ECR) معرفی کرد ، که می تواند در مشکلات زیر به ما کمک کند:
- ذخیره تصاویر عمومی و خصوصی با استفاده از یک نشانه تأیید اعتبار در ثبت خصوصی ECR شما
- سرعت کشیدن از ECR خصوصی به خدمات محلی خود (ECS ، EKS ، Lambdas و غیره)
- خط مشی چرخه عمر برای نگه داشتن فقط تعداد مورد نیاز آخرین برچسب ها
- اسکن امنیتی تصاویر در هنگام کشش
- یک مکان واحد برای به روزرسانی نشانه خود در صورت چرخش یا انقضا (به عنوان مثال Gitlab به شما اجازه نمی دهد تا نشانه هایی با تاریخ انقضا بیش از یک سال ایجاد کنید). فقط تصور کنید که برای به روزرسانی نشانه ها باید تمام اعتبار خود را در تمام خوشه های K8S یک بار طی کنید.
بنابراین ، بیایید به اجرای این ویژگی بپردازیم. برای کار کردن ، باید ایجاد کنید:
- یک قانون حافظه پنهان کشش ، جایی که پیشوند مورد نظر خود را در رجیستری و ثبت مقصد در جایی که تمام درخواست ها را ارسال می کنید تعریف می کنید
- اعتبارنامه Secrets Manager شما می خواهید برای تأیید اعتبار در رجیستری مقصد استفاده کنید
- اگر می خواهید یک خط مشی چرخه عمر داشته باشید ، اسکن امنیتی یک الگوی مخزن حافظه پنهان
و برخی از ویژگی های دیگر ، که در این مرحله اختیاری هستند.
همانطور که می بینید ، خود مخزن را ایجاد نمی کنید. در صورت اختصاص یکی از تنظیمات پیش فرض یا یک الگوی ، به طور خودکار در اولین درخواست حافظه پنهان از طریق کشش ایجاد می شود.
اگر من با پیشوند یک قانون ایجاد کردم dockerhub
در us-east-1
منطقه و گفتن درخواست های کشش من را به registry-1.docker.io
، می توانم از دستور زیر استفاده کنم:
# direct pull from Docker Hub
docker pull timberio/vector:0.45.0-alpine
# pull through ECR
docker pull 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/timberio/vector:0.45.0-alpine
همانطور که می بینید ، من فقط مخزن خود را اضافه کردم و dockerhub
به عنوان پیشوند ، و سپس تصویر اصلی برای کشیدن. این همان چیزی است که شما باید بعداً در مانیفست ها به روز کنید تا تصاویر را از طریق ECR بکشید ، که بسیار ساده است.
اتهام اتوماسیون
به نظر می رسد آسان است ، اما چرا آن را با استفاده از Terraform (با بسته بندی تراموی) درست نمی کنیم؟ من یک ماژول ساده Terraform ایجاد کردم که به شما در ایجاد چندین قانون کشش از پرونده اصلی YAML با ساختار زیر کمک می کند:
dockerhub:
registry: registry-1.docker.io
username: user
accessToken: token
gitlab:
registry: registry.gitlab.com
username: user
accessToken: token
و ماژول دو قانون با پیشوندها ایجاد می کند: 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)
}