Aller au contenu

Architecture de référence Harbor

Vue d'ensemble des composants

Harbor est compose de plusieurs services qui s'appuient sur un registre OCI (Distribution) en backend.

graph TD
    LB["Load Balancer<br/>(Traefik / Nginx)"] -->|:443| Core["Harbor Core<br/>(API, UI, Auth)"]
    Core --> Registry["Registry<br/>(Distribution)"]
    Core --> Jobs["Job Service<br/>(GC, Replic.)"]
    Core --> Trivy["Trivy Adapter<br/>(Scan vuln.)"]
    Registry --> S3["Object Store<br/>(S3/MinIO)"]
    Jobs --> PG["PostgreSQL<br/>(metadata)"]
    PG --> Redis["Redis<br/>(cache/queue)"]

Detail des composants

Harbor Core

Le composant central qui expose l'API REST et l'interface web.

Fonction Description
API v2.0 Gestion des projets, artefacts, utilisateurs, robots
Authentification OIDC, LDAP, base locale, robot tokens
Autorisation RBAC par projet et rôle
UI Web Interface de gestion complète
Webhook Notifications sur push, scan, réplication
Content trust Vérification des signatures Cosign/Notation

Registry (Distribution)

Le registre OCI sous-jacent qui stocke les blobs (layers) et les manifests.

  • Reçoit les push/pull via l'API Docker Registry v2 / OCI Distribution
  • Stocke les blobs dans le backend de stockage configure (filesystem, S3, MinIO)
  • Harbor Core intercepte les requêtes pour appliquer l'authentification et le RBAC

Trivy Adapter

Scanner de vulnerabilites integre qui analyse les images apres chaque push.

graph LR
    Push["Image poussee"] --> Core["Harbor Core"] --> Trivy["Trivy Adapter"] --> CVE["Base CVE<br/>(NVD, GitHub Advisory)"]
    Trivy --> Rapport["Rapport CVE<br/>stocke dans PostgreSQL"]
    Rapport --> Policy["Politique :<br/>bloquer si Critical/High"]
Configuration Valeur recommandee
Scan automatique À chaque push
Base de vulnerabilites Mise à jour quotidienne
Politique de blocage Critical et High bloques
Timeout de scan 300 secondes

Job Service

Service de tâches asynchrones :

  • Garbage collection : nettoyage des blobs orphelins
  • Réplication : synchronisation vers/depuis d'autres registres
  • Scan : orchestration des scans de vulnerabilites en lot
  • Retention : application des regles de retention des tags

Redis

Cache et file de messages :

  • Cache des sessions utilisateur et des tokens
  • File d'attente pour les jobs asynchrones (scan, réplication, GC)
  • Cache des résultats de scan recents

PostgreSQL

Base de données relationnelle stockant toutes les metadonnees :

Donnée Table/Schema
Projets project
Artefacts (manifests) artifact
Tags tag
Résultats de scan vulnerability_record
Robots accounts robot
Regles de réplication replication_policy
Audit log audit_log
Utilisateurs et rôles harbor_user, role

PostgreSQL externe obligatoire en production

Le PostgreSQL embarque dans Harbor est destine aux tests uniquement. En production, utiliser une instance PostgreSQL externe avec réplication et backups.

Object Storage (S3/MinIO)

Stockage des blobs (layers d'images, charts Helm, artefacts OCI).

Option Usage
MinIO Object storage on-premise, S3-compatible
S3 AWS Cloud AWS
GCS Cloud GCP
Azure Blob Cloud Azure
Filesystem Tests uniquement (pas de HA)

Modèle de projets

Harbor organise les artefacts en projets. Chaque projet est un namespace isole avec son propre RBAC, ses quotas et ses politiques.

Structure recommandee

harbor.example.com/
├── library/              # Images de base validees (public interne)
│   ├── debian:bookworm-slim
│   ├── python:3.12-slim
│   └── node:22-alpine
├── infra/                # Images d'infrastructure
│   ├── traefik:v3.1
│   ├── postgres:16
│   └── redis:7
├── app-frontend/         # Application frontend (equipe frontend)
│   ├── webapp:v2.1.0
│   └── webapp:sha-a1b2c3d
├── app-backend/          # Application backend (equipe backend)
│   ├── api:v3.0.1
│   └── worker:v3.0.1
├── charts/               # Charts Helm
│   ├── webapp-chart:1.0.0
│   └── api-chart:2.1.0
└── mirror/               # Miroir d'images publiques
    ├── docker.io/library/nginx:1.27
    └── quay.io/prometheus/prometheus:v2.53

Configuration de projet

Parametre Projet library Projet app-* Projet mirror
Visibilité Public (interne) Prive Public (interne)
Scan automatique Oui Oui Oui
Bloquer vulnerabilites Critical Critical + High Critical
Tag immutability Oui Oui Oui
Quota stockage 50 Go 20 Go 100 Go
Réplication Push vers DR Push vers DR Pull depuis publics

Robot accounts

Les robot accounts remplacent les credentials humains pour l'automatisation (CI/CD, Kubernetes).

Types de robots

Robot Scope Permissions Usage
robot-ci-push Projet app-backend Push, Pull CI/CD pousse les images
robot-k8s-pull Projets app-*, library Pull uniquement Kubernetes tire les images
robot-scanner Tous les projets Pull, Scan Scanner externe
robot-replicator Projet mirror Pull, Push, Réplication Réplication depuis publics

Creation d'un robot account

# Via l'API Harbor
curl -X POST https://harbor.example.com/api/v2.0/robots \
  -H "Content-Type: application/json" \
  -u admin:Harbor12345 \
  -d '{
    "name": "robot-ci-push",
    "description": "CI/CD push for app-backend",
    "duration": -1,
    "level": "project",
    "permissions": [
      {
        "namespace": "app-backend",
        "kind": "project",
        "access": [
          {"resource": "repository", "action": "push"},
          {"resource": "repository", "action": "pull"},
          {"resource": "tag", "action": "create"}
        ]
      }
    ]
  }'

Rotation des tokens robot

Les tokens robot doivent etre renouveles régulièrement. Utiliser duration pour définir une expiration automatique et automatiser le renouvellement via Vault ou le pipeline CI/CD.

Regles de réplication

Configuration type

Regle Mode Source Destination Filtre Déclencheur
DR cross-site Push harbor.example.com harbor-dr.example.com ** À chaque push
Miroir Docker Hub Pull docker.io harbor.example.com library/** Planifie (6h)
Miroir Quay Pull quay.io harbor.example.com prometheus/** Planifie (6h)
Edge sync Push harbor.example.com harbor-edge.local label=edge À chaque push

Topologie de réplication

graph TD
    Internet["Internet<br/>Docker Hub, Quay.io"] -->|Pull planifie| Principal["Harbor principal<br/>harbor.example.com"]
    Principal -->|Push chaque push| DR["Harbor DR<br/>(passif)"]
    Principal -->|Push chaque push<br/>label=edge| Edge["Harbor Edge<br/>(air-gapped)"]

Guide de sizing

Dimensionnement par profil

Profil Équipes Images Stockage Harbor Core PostgreSQL Redis MinIO
Small (lab) 1-5 < 500 50 Go 1 CPU, 1 Go 1 CPU, 1 Go 256 Mo 2 CPU, 2 Go
Medium (PME) 5-20 500-5000 500 Go 2 CPU, 2 Go 2 CPU, 4 Go 512 Mo 4 CPU, 4 Go
Large (DSI) 20+ 5000+ 2+ To 4 CPU, 4 Go 4 CPU, 8 Go 1 Go Cluster MinIO

Facteurs de croissance

Le stockage croit en fonction de :

  • Nombre de builds CI/CD par jour : chaque push ajoute des layers
  • Taille des images : images Go (~50 Mo) vs images Java (~300 Mo) vs images ML (~2 Go)
  • Retention des tags : combien de versions sont conservees
  • Deduplication : les layers partages entre images sont stockes une seule fois

Estimer le stockage

Formule approximative :

Stockage = Nb_images × Taille_moyenne × (1 - Taux_dedup) × Nb_versions_retenues

Exemple : 50 images × 200 Mo × 0.4 (60% dedup) × 10 versions = 40 Go

Haute disponibilité

Pour un déploiement HA :

Composant Replicas Notes
Harbor Core 2+ Stateless, derriere un load balancer
Registry 2+ Stateless si stockage S3/MinIO
Job Service 1 Un seul actif (leader election)
Trivy Adapter 2+ Stateless, scale horizontalement
PostgreSQL 2+ Primary + replica(s), failover automatique
Redis 3 Sentinel ou cluster pour la HA
MinIO 4+ Cluster distribue pour la redondance