سجلات الصور في بيئة الإنتاج
سجلات الصور في بيئة الإنتاج
كل صورة حاوية تعمل في بيئة الإنتاج يتم سحبها من سجل — وهو مخزن للقطع الأثرية يُنظَّم حسب الاسم والوسم، ويعتمد على عنونة المحتوى. قد يكون Docker Hub مناسبًا للتجارب المفتوحة، لكن الفرق في بيئات الإنتاج الحقيقية تشغّل سجلات خاصة لأسباب تتعلق بالأمان وزمن الاستجابة والتكلفة والامتثال. يتناول هذا الدرس الخيارات المُدارة الرئيسية (ECR وGAR وHarbor)، والممارسات التشغيلية التي تُبقي هذه السجلات بصحة جيدة — من سياسات دورة حياة الصور وفحص الثغرات وذاكرة التخزين المؤقت للسحب، وصولًا إلى أنماط الفشل الشائعة التي تقع فيها الفرق التي تتجاهل هذه البنية التحتية.
لماذا تهم السجلات الخاصة
تفرض السجلات العامة قيودًا على معدل الطلبات (Docker Hub: 100 سحب مجهول / 200 سحب موثّق لكل ست ساعات لكل عنوان IP). في كتلة Kubernetes مكوّنة من 50 عقدة تسحب الصورة ذاتها عند بدء التشغيل، ستصل إلى هذا الحد في ثوانٍ. علاوةً على قيود المعدل، توفر السجلات الخاصة:
- التحكم في الوصول: تحكم سياسات IAM أو RBAC بمن يستطيع دفع الصور أو سحبها من أي مستودع.
- القرب الشبكي: الصور المسحوبة من سجل في نفس المنطقة السحابية تتفادى رسوم نقل البيانات الخارجية وتُقلل زمن الاستجابة من دقائق إلى ثوانٍ للصور الكبيرة.
- سجل المراجعة: كل عملية دفع أو سحب مُسجَّلة، وهو أمر إلزامي لامتثال معايير SOC 2 وISO 27001.
- تطبيق الثبات: يمكن تعطيل الكتابة فوق الوسوم، لضمان أن
v1.4.2يُشير دائمًا إلى نفس الملخص الرقمي.
Amazon ECR (سجل حاويات مرن)
ECR هو الخيار الطبيعي للأحمال العاملة على AWS (ECS وEKS وLambda). تعتمد المصادقة على رموز قصيرة العمر تُصدرها واجهة AWS السطرية — دون بيانات اعتماد طويلة الأمد مخزّنة في ~/.docker/config.json.
production بصورة معطوبة بصمت — والتراجع الذي ظننت أنه يشير إلى الملخص القديم بات يشير إلى الصورة المعطوبة الجديدة. الوسوم الثابتة تُلزم باستخدام وسم إصدار فريد لكل إصدار وتجعل عمليات التراجع حتمية.
تُؤتمت سياسات دورة حياة ECR عملية التنظيف. بدونها، يتراكم في المستودع الذي يتلقى 20 عملية دفع يوميًا آلاف الصور وتتصاعد فاتورة التخزين. تحتفظ السياسة التالية بآخر 30 إصدارًا موسومًا وتُنهي الطبقات غير الموسومة (المخلّفات من عمليات البناء الفاشلة) تلقائيًا:
Google Artifact Registry (GAR)
GAR هو خلف Google Container Registry (GCR) والخيار الأمثل لأحمال العمل على GKE. يدعم صيغًا متعددة (Docker وHelm وnpm وMaven) في خدمة واحدة. تعتمد المصادقة على Workload Identity Federation في GKE — دون ملفات مفاتيح حسابات الخدمة.
Harbor — سجل مستضاف ذاتيًا، مستقل عن السحابة
Harbor هو السجل مفتوح المصدر الحاصل على شهادة CNCF، والذي تختاره الفرق عندما تحتاج إلى تخزين محلي (بيئات معزولة عن الشبكة، اشتراطات صارمة لمحلية البيانات، بيئات متعددة السحب دون الارتباط بمورد واحد). يضيف Harbor واجهة مستخدم وRBAC وحصصًا وقواعد نسخ متماثل وفحص Trivy المدمج فوق مواصفة OCI Distribution.
ذاكرة التخزين المؤقت للسحب العابر (Pull-Through Cache)
ذاكرة التخزين المؤقت للسحب العابر هي وكيل سجل يقف بين عقدك وسجل المصدر (Docker Hub أو Quay أو حتى سجلك الخاص في منطقة بعيدة). عند السحب الأول، يجلب الوكيل طبقة الصورة ويخزنها. تُخدَّم عمليات السحب اللاحقة محليًا — وتنجو من انقطاع المصدر وقيود المعدل.
تدعم ECR قواعد ذاكرة التخزين المؤقت للسحب العابر بشكل أصلي منذ عام 2022. الإعداد عملية Terraform أو CLI تتم مرة واحدة:
harbor.internal/dockerhub-cache/library/nginx:1.27 بدلًا من Docker Hub مباشرةً. يحترم Harbor ترويسات التحكم في التخزين المؤقت للمصدر ويعيد الجلب عند تحديث الصورة.
الاحتفاظ بالصور وأفضل ممارسات دورة الحياة
على نطاق الشركات الكبرى، تُولّد خدمة واحدة تتلقى 10 عمليات دفع يوميًا 3,650 صورة في السنة. اضرب ذلك في 200 خدمة وستحصل على 730,000 صورة — معظمها لم يُسحب أبدًا بعد النشر الأولي. تتبع إدارة دورة الحياة الجيدة هذه القواعد:
- وسم إصدارات semver بوضوح (
v1.4.2)، ولا تنشر أبدًا منlatest. يجب أن تُنهي سياسات دورة الحياة فقط الصور الموسومة ببادئة تعكس بنيات مؤقتة (مثلsha-أوbranch-). - الاحتفاظ بنافذة متجددة من الإصدارات الحديثة (30–90 يومًا أو آخر N إصدار) لضمان إمكانية التراجع دائمًا دون الحاجة لإعادة البناء.
- إنهاء الكتل غير الموسومة بسرعة (24–48 ساعة). الصور غير الموسومة هي قطع أثرية من عمليات دفع CI الفاشلة أو الملغاة — تستهلك مساحة تخزين ولا يُنشر منها شيء.
- الحجب عند اكتشاف ثغرات حرجة وقت الدفع. يمكن ربط ECR Enhanced Scanning (المدعوم بـ AWS Inspector) وفحص GAR المدمج بـ CI لفشل الأنبوب عند اكتشاف ثغرة CRITICAL، قبل أن تصل الصورة إلى الإنتاج.
ImagePullBackOff. احتفظ على الأقل بالملخص الرقمي للإصدار المنشور حاليًا مثبتًا، أو استخدم وسوم الملخص (sha256:abc123) التي تديرها بشكل صريح بمعزل عن نافذة الإنهاء.
أنماط المصادقة على نطاق واسع
بيانات الاعتماد طويلة الأمد في imagePullSecrets تُشكل خطرًا أمنيًا — تحديثها يستلزم تعديل كل namespace. النمط الإنتاجي هو IAM على مستوى العقدة: في EKS، أسند أذونات قراءة ECR لدور IAM الخاص بالعقدة؛ في GKE، استخدم Workload Identity. يستوثق kubelet آنئذٍ بشفافية باستخدام موفر بيانات اعتماد العقدة، ولا حاجة لإدارة أي أسرار على مستوى التطبيق.
للسحب عبر الحسابات أو المشاريع (مثلًا سجل "صور ذهبية" مشترك تصل إليه فرق عديدة)، استخدم سياسات ECR عبر الحسابات أو ربط IAM في GAR الذي يمنح حساب خدمة المشروع المستهلك دور roles/artifactregistry.reader على المشروع المصدر — مصادقة عبر تفويض IAM دون أي بيانات اعتماد.