به گزارش از وبسایت cncf این مطلب که در ۲۴ فوریه ۲۰۲۶ توسط Dhruv Tyagi و Daniel Jiang ارسال شده، به معرفی و توصیه‌های مربوط به استقرار و آماده‌سازی Harbor — یک رجیستری کانتینری متن‌باز — می‌پردازد. Harbor تصاویر و دیگر مصنوعات را با سیاست‌ها و کنترل‌های مبتنی بر نقش ایمن نگه می‌دارد، آن‌ها را برای آسیب‌پذیری اسکن می‌کند و از امضا شدن موارد مورد اعتماد اطمینان حاصل می‌کند. برای کسب جزئیات بیشتر درباره نصب Harbor در ماشین مجازی (VM) و در Kubernetes (K8s)، بخش‌های 1 و 2 سری اصلی را مشاهده کنید.

اگرچه استقرار اولیه Harbor ساده است، آماده‌سازی آن برای محیط‌های تولیدی نیازمند بررسی دقیق چندین جنبه کلیدی است. در این نوشته تمرکز بر استقرار Harbor در Kubernetes از طریق Helm است و پیشنهاداتی برای حصول اطمینان از پایداری، امنیت و مقیاس‌پذیری ارائه می‌شود. ⚙️

1. دسترسی‌پذیری بالا (HA) و مقیاس‌پذیری

در محیط تولیدی، وجود single points of failure قابل قبول نیست؛ به‌خصوص برای یک رجیستری تصویری که به‌عنوان مخزن مرکزی تصاویر و مصنوعات عمل می‌کند. بنابراین پیاده‌سازی HA برای Harbor ضروری است و نکات زیر را دربر می‌گیرد:

استقرار با Ingress برای توزیع موثر ترافیک ورودی و فراهم کردن نقطه ورودی یکپارچه و مدیریت گواهی توصیه می‌شود. نمونه‌ای از پیکربندی در values.yaml به شکل زیر است:

expose:
  type: ingress
  tls:
    enabled: true
    certSource: secret
  ingress:
    hosts:
      core: harbor.yourdomain.com
  # کلاس ورودی خود را مشخص کنید
  kubernetes.io/ingress.class: traefik
  # ارجاع به Cluster-sCA. برای مثال:
  cert-manager.io/cluster-issuer: "harbor-cluster-issuer"

برای افزونگی، تعداد replicaها برای مؤلفه‌های حیاتی Harbor را افزایش دهید تا در صورت اختلال یکی از نمونه‌ها، سرویس ادامه یابد. مثال:

core:
  replicas: 3
jobservice:
  replicas: 3
portal:
  replicas: 3
registry:
  replicas: 3
trivy:
  replicas: 3
# برای بهبود دسترسی ingress نیز می‌توان replicas را افزایش داد:
nginx:
  replicas: 3

پیکربندی حافظه مشترک: برای داده‌های پایدار از StorageClasses و PersistentVolumes در Kubernetes استفاده کنید تا راهکارهای ذخیره‌سازی مشترک مانند vSAN یا فایل‌سیستم توزیع‌شده در دسترس باشد:

persistence:
  enabled: true
  sourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      # اگر خالی باشد، storageClass پیش‌فرض خوشه استفاده می‌شود
      storageClass: "your-storage-class"
    jobservice:
      storageClass: "class-class"
    storage: "your-storage-class"
    redis:
      storageClass: "your-storage-class"
    trivy:
      storageClass: "your-storage-class"

پایگاه داده HA (PostgreSQL): پایگاه داده داخلی تعبیه‌شده برای محیط تولید توصیه نمی‌شود زیرا می‌تواند نقطه ضعف تک باشد، مقیاس‌پذیری محدودی داشته باشد و مدیریت چرخه حیات آن پیچیده باشد. بهتر است یک خوشه PostgreSQL با دسترس‌پذیری بالا (مثلاً با Patroni یا CloudNativePG) در داخل کلاستر یا سرویس پایگاه داده مدیریت‌شده خارج از کلاستر مستقر شود. نمونه پیکربندی اتصال به دیتابیس خارجی:

database:
  type: "external"
  external:
    host: "192.168.0.1"
    port: "5432"
    username: "user"
    password: "password"
  coreDatabase: "registry"
  # sslmode می‌تواند require، verify-ca، یا verify-full باشد
  sslmode: "require"

Redis HA: از یک خوشه Redis با دسترس‌پذیری بالا (مثلاً Redis Sentinel یا Redis Cluster) یا یک سرویس مدیریت‌شده استفاده کنید و اتصال Harbor را مطابق آن در values.yaml تنظیم کنید:

redis:
  type: external
  external:
    addr: "192.168.0.2:6397"
    sentinelMasterSet: ""
    tlsOptions:
      enable: false
    username: ""
    password: ""

2. بهترین شیوه‌های امنیتی 🔒

امنیت برای هر سیستم تولیدی به‌ویژه رجیستری کانتینری حیاتی است. نکات کلیدی:

– فعال‌سازی TLS/SSL: همیشه TLS/SSL را برای همه اجزای Harbor فعال کنید. نمونه پیکربندی TLS:

expose:
  tls:
    enabled: true
    certSource: auto  # یا secret یا cert-manager بسته به روش شما
  internalTLS:
    enabled: true
  strong_ssl_ciphers: true

– احراز هویت و مجوز: از مکانیزم‌های احراز هویت و Authorization که Harbor پشتیبانی می‌کند استفاده کنید و Harbor را با ارائه‌دهنده هویت سازمانی مانند LDAP یا OIDC یکپارچه کنید تا کنترل دسترسی متمرکز و ایمن داشته باشید.

– اسکن آسیب‌پذیری: حتماً اسکن آسیب‌پذیری را فعال کنید. Harbor به‌طور پیش‌فرض از Trivy استفاده می‌کند:

trivy:
  enabled: true

– اعتماد به محتوا: از مکانیزم‌های امضای تصاویر مانند Cosign و Notation برای تضمین یکپارچگی و منشأ تصاویر استفاده کنید و در سطح پروژه سیاست‌هایی اعمال کنید که فقط تصاویر امضا شده و مورد اعتماد را مجاز به استقرار بدانند.

– نگهداری به‌روزرسانی‌ها: نمودار Helm و اجزای Kubernetes را مرتب به‌روزرسانی کنید تا وصله‌های امنیتی و رفع باگ‌ها را دریافت کنید.

– حساب‌های ربات برای اتوماسیون: در خطوط لوله CI/CD از حساب‌های ربات (robot accounts) استفاده کنید تا از استفاده از اعتبار کاربران جلوگیری شده و حداقل امتیاز لازم به هر ربات اختصاص یابد.

– گزارش حسابرسی: نسخه‌های جدید Harbor امکاناتی برای ارسال رویدادهای حسابرسی به نقطه‌پایانی‌های لاگ خارجی فراهم می‌کنند که برای پیگیری رخدادهای حساس مفید است.

3. ملاحظات ذخیره‌سازی 💾

ذخیره‌سازی قابل‌اطمینان و کارآمد برای عملکرد و پایداری Harbor ضروری است:

– انتخاب نوع فضای ذخیره‌سازی: StorageClassهای مناسب با زیرساخت خود (مثلاً nfs-client، aws-ebs، azure-disk، gcp-pd) تعریف کنید و در values.yaml تنظیمات مربوطه را وارد کنید:

persistence:
  enabled: true
  resourcePolicy: "keep"
  imageChartStorage:
    # نوع ذخیره‌سازی: "filesystem", "azure", "gcs", "s3", "swift", "oss"
    type: "filesystem"

– محاسبه فضای مورد نیاز: بر اساس اندازه تصاویر، سیاست‌های نگهداری و تعداد نمونه‌ها، ظرفیت PersistentVolumeClaimها را برآورد و تنظیم کنید.

– پشتیبان‌گیری و بازیابی: یک استراتژی پشتیبان‌گیری جامع برای تمام داده‌های Harbor داشته باشید. ابزارهایی مانند Velero برای بکاپ گرفتن از منابع Kubernetes و PVها مفید هستند و برای ذخیره‌سازی آبجکت‌ها از مکانیزم پشتیبان ارائه‌دهنده زیرساخت یا راه‌حل‌های خارجی استفاده کنید. بازیابی را به‌صورت منظم تست کنید.

– تنظیم و اجرای garbage collection: Garbage collection را زمان‌بندی و اجرا کنید تا تصاویر و لایه‌های بلا استفاده حذف شده و فضای ذخیره‌سازی بازیابی شود.

4. نظارت و هشدار 📊

نظارت و هشدار پیشگیرانه برای شناسایی مشکلات پیش از تأثیرگذاری بر کاربران ضروری است:

– جمع‌آوری معیارها: Prometheus را مستقر و پیکربندی کنید تا متریک‌های Harbor را جمع‌آوری کند و با Grafana آن‌ها را مصورسازی کنید. مثال پیکربندی متریک‌ها:

metrics:
  enabled: true
  core:
    path: /
    port: 8001
  registry:
    path: /
    port: 8001
  jobservice:
    path: /
    port: 8001
  exporter:
    path: /
    port: 8001
serviceMonitor:
  enabled: true
  # این برچسب تضمین می‌کند که اپراتور prometheus مناسب انتخاب شود
  release: kube-prometheus-stack

– گزارش متمرکز: یک سیستم لاگ متمرکز مانند ELK Stack یا Grafana Loki با Fluentd/Fluent Bit پیاده‌سازی کنید تا لاگ‌ها متمرکز و قابل جستجو باشند.

– پیکربندی هشدارها: قوانین هشدار برای شرایط حیاتی (مانند کاهش replicaها، افزایش خطاهای API، پر شدن دیسک، یا ناکارآمدی پایگاه داده) تعریف کنید تا تیم عملیاتی به‌موقع مطلع شود.

این نکات پایه‌ای به مدیران و تیم‌های عملیاتی کمک می‌کند تا نمونه Harbor خود را برای محیط‌های تولیدی مستحکم، امن و قابل‌مقیاس نگه دارند. اگر نیاز به نمونه‌های پیکربندی بیشتر یا راهنمای گام‌به‌گام دارید، خوشحال می‌شوم کمک کنم. 🙂