Aller au contenu
Conteneurs & Orchestration medium

Varnish Orca : Accélérer vos pipelines CI/CD

16 min de lecture

logo orca

Vos pipelines CI/CD passent 30% de leur temps à télécharger des dépendances — images Docker, packages NPM, modules Go. Chaque docker pull ou npm install sollicite les mêmes registres, encore et encore.

Varnish Orca résout ce problème en plaçant un cache intelligent entre vos outils et les registres. Résultat : des pulls 4x plus rapides, une résilience face aux pannes de Docker Hub, et une réduction massive de la bande passante sortante.

  • Installer Orca en 2 minutes avec Docker
  • Configurer Docker pour utiliser Orca comme mirror
  • Ajouter des registres multiples (Quay, GHCR, NPM, PyPI)
  • Mesurer le gain de performance sur vos builds
  • Déployer en production avec TLS et observabilité

Imaginez une équipe de 10 développeurs. Chacun lance 5 builds par jour. Chaque build télécharge les mêmes dépendances :

  • L’image node:20-alpine (50 Mo)
  • 200 packages NPM (100 Mo)
  • Quelques images de base (200 Mo)

Calcul rapide : 10 devs × 5 builds × 350 Mo = 17,5 Go par jour. Multipliez par 20 jours ouvrés = 350 Go par mois téléchargés depuis Internet. Et ce sont toujours les mêmes fichiers !

Le constat : vos pipelines CI/CD passent leur temps à re-télécharger des artefacts qu’ils ont déjà récupérés la veille, l’heure d’avant, ou même 5 minutes plus tôt sur un autre runner.

Orca agit comme un proxy cache entre vos outils et les registres distants.

Comment ça marche, concrètement ?

  1. Votre CI exécute docker pull node:20-alpine
  2. Orca reçoit la requête (il se fait passer pour Docker Hub)
  3. Premier cas : l’image n’est pas en cache → Orca la télécharge depuis Docker Hub, la stocke, et vous la renvoie
  4. Deuxième cas : l’image est déjà en cache → Orca vous la renvoie instantanément, sans aller sur Internet

Analogie du quotidien : c’est comme avoir un frigo au bureau plutôt que d’aller au supermarché à chaque fois que vous voulez un café. Le premier achat remplit le frigo, les suivants sont instantanés.

Analogie technique : Orca est à vos registres ce qu’un CDN est à votre site web. Il rapproche les données de là où elles sont consommées.

Architecture Varnish Orca : les clients (Docker, npm, Go, Helm) passent par le cache HTTP qui intercepte les requêtes vers les registres distants

Sans OrcaAvec Orca
Chaque build tire depuis Docker HubPremier build tire, les suivants servent du cache
Latence réseau à chaque pullLatence locale (< 10ms)
Vulnérable aux pannes Docker HubContinue de servir depuis le cache
Coûts d’egress élevés75%+ de réduction de trafic sortant

Orca cache tous types d’artefacts binaires immuables :

TypeRegistre par défautSubdomain Orca
Images Docker/OCIDocker Hubdockerhub.localhost
Images DockerQuay.ioquay.localhost
Images DockerGitHub Container Registryghcr.localhost
Images Kubernetesregistry.k8s.iok8s.localhost
Packages NPMregistry.npmjs.orgnpmjs.localhost
Modules Goproxy.golang.orggo.localhost
Repositories Gitgithub.comgithub.localhost
Repositories Gitgitlab.comgitlab.localhost
  • Docker 20.10+ installé
  • Accès root pour modifier /etc/docker/daemon.json
  • Port 80 ou 8888 disponible sur la machine hôte
  1. Téléchargez l’image Orca

    Fenêtre de terminal
    docker pull varnish/orca --platform linux/amd64
  2. Lancez Orca

    Fenêtre de terminal
    docker run -d --rm \
    -p 80:80 \
    --name orca \
    --platform linux/amd64 \
    varnish/orca
  3. Vérifiez que Orca répond

    Fenêtre de terminal
    curl -I http://localhost/healthz

    Vous devez obtenir HTTP/1.1 200 OK.

docker-compose.yaml
services:
orca:
image: varnish/orca
platform: linux/amd64
ports:
- "80:80"
volumes:
- ./config.yaml:/etc/varnish-supervisor/default.yaml:ro
restart: unless-stopped
Fenêtre de terminal
helm pull oci://docker.io/varnish/orca-chart
helm install orca oci://docker.io/varnish/orca-chart
Fenêtre de terminal
# Ajouter le dépôt
curl -s https://packagecloud.io/install/repositories/varnishplus/60-enterprise/script.deb.sh | sudo bash
# Installer
sudo apt -y install varnish-supervisor
# Vérifier
varnish-supervisor --version

Pour que Docker utilise Orca comme registry mirror, modifiez la configuration du daemon Docker.

  1. Éditez /etc/docker/daemon.json

    /etc/docker/daemon.json
    {
    "registry-mirrors": ["http://localhost"],
    "insecure-registries": ["localhost"]
    }
  2. Redémarrez Docker

    Fenêtre de terminal
    sudo systemctl restart docker
  3. Vérifiez la configuration

    Fenêtre de terminal
    docker info | grep -A2 "Registry Mirrors"

    Vous devez voir http://localhost/.

Avec le registry mirror configuré, tous vos docker pull passent par Orca automatiquement. Aucune modification de vos Dockerfiles ou scripts n’est nécessaire.

Testons ensemble pour voir la différence :

Fenêtre de terminal
# Étape 1 : Premier pull (Orca télécharge depuis Docker Hub)
docker pull alpine:3.19
# → Orca n'a pas l'image, il la récupère sur Internet
# Étape 2 : Supprimez l'image de votre machine
docker rmi alpine:3.19
# → L'image n'est plus sur VOTRE machine, mais Orca l'a gardée
# Étape 3 : Deuxième pull (Orca sert depuis son cache)
docker pull alpine:3.19
# → Cette fois, Orca répond instantanément !

Résultats que j’ai mesurés (sur l’image node:20-alpine, 50 Mo) :

PullTempsCe qui se passe
Premier6.0sOrca télécharge depuis Docker Hub, stocke en cache
Second1.5sOrca sert directement depuis son cache local
Gain4xLe transfert Internet est évité

Pour les packages NPM, c’est un peu différent. Docker utilise automatiquement le registry mirror configuré, mais NPM doit être configuré explicitement.

Option 1 : Ponctuellement (pour un seul npm install) :

Fenêtre de terminal
npm install express --registry=http://npmjs.localhost

Option 2 : Globalement (recommandé pour le CI/CD) :

Fenêtre de terminal
npm config set registry http://npmjs.localhost

Pour Go, définissez la variable d’environnement GOPROXY :

Fenêtre de terminal
# Pour une commande
GOPROXY=http://go.localhost go mod tidy
# Ou exportez-la dans votre profil shell
export GOPROXY=http://go.localhost

Helm 3.8+ supporte les registres OCI. Utilisez le subdomain correspondant :

Fenêtre de terminal
# Chart depuis GitHub Container Registry via Orca
helm pull oci://ghcr.localhost/prometheus-community/charts/prometheus --plain-http

La configuration par défaut d’Orca inclut déjà les registres les plus courants (Docker Hub, NPM, Go, GitHub). Vous n’avez rien à configurer pour commencer.

Créez un fichier config.yaml personnalisé uniquement si vous avez besoin de :

  • Ajouter un registre privé d’entreprise
  • Configurer des politiques de cache (TTL)
  • Activer la haute disponibilité avec plusieurs remotes
config.yaml
varnish:
http:
- port: 80
virtual_registry:
registries:
# Docker Hub comme registre par défaut
- name: dockerhub
default: true
remotes:
- url: https://docker.io
- url: https://mirror.gcr.io # Fallback sur le mirror Google
# GitHub Container Registry
- name: ghcr
remotes:
- url: https://ghcr.io
# Quay.io
- name: quay
remotes:
- url: https://quay.io
# NPM
- name: npmjs
remotes:
- url: https://registry.npmjs.org
# PyPI
- name: pypi
remotes:
- url: https://pypi.org
# Registre privé d'entreprise
- name: internal
remotes:
- url: https://registry.entreprise.local

Montez ce fichier dans le conteneur :

Fenêtre de terminal
docker run -d --rm \
-p 80:80 \
--name orca \
--platform linux/amd64 \
-v $(pwd)/config.yaml:/etc/varnish-supervisor/default.yaml:ro \
varnish/orca
OptionDéfautDescription
name-Identifiant unique, utilisé pour le routing par subdomain
defaultfalseSi true, reçoit les requêtes sans subdomain
load_balancerfallbackStratégie : fallback, random, ou hash
default_ttl120TTL en secondes pour les objets sans politique spécifique
auth_ttl3600TTL du cache d’autorisation (Premium)

Un registre peut avoir plusieurs remotes pour la haute disponibilité :

- name: dockerhub
default: true
load_balancer: fallback
remotes:
- url: https://docker.io
priority: 1 # Essayé en premier
- url: https://mirror.gcr.io
priority: 2 # Fallback si Docker Hub échoue
- name: dockerhub
remotes:
- url: https://docker.io
probe:
url: /v2/
interval: 5 # Vérification toutes les 5s
timeout: 2 # Timeout de 2s
threshold: 3 # 3 succès requis pour être "healthy"
window: 8 # Sur les 8 derniers checks

En production, utilisez toujours HTTPS. Orca supporte plusieurs méthodes :

config.yaml
varnish:
http:
- port: 80
https:
- port: 443
certificates:
- cert: /certs/tls.crt
private_key: /certs/tls.key

Orca expose des métriques via OpenTelemetry pour surveiller :

  • Taux de cache hit/miss par registre
  • Latence des requêtes
  • Bande passante économisée
  • Santé des backends
config.yaml
otel:
service_name: orca-production
metrics:
endpoint: http://prometheus:9090/api/v1/otlp/v1/metrics
protocol: http/protobuf
export_interval: 60

Par défaut, le cache est en mémoire et perdu au redémarrage. La version Premium permet de persister le cache sur disque :

config.yaml
varnish:
storage:
stores:
- name: disk1
path: /var/cache/orca/disk1
size: 100G
SymptômeCauseSolution
Port 80 occupéAutre service (nginx, apache)Utilisez -p 8888:80 ou arrêtez le service
mlock() failedLimite mémoire verrouilléeWarning bénin, Orca fonctionne quand même
SymptômeCauseSolution
failed to do request: EOFDocker attend du HTTPSAjoutez "insecure-registries": ["localhost"]
UNAUTHORIZEDRegistre privé sans authConfigurez docker login
404 Not FoundMauvais routing de registreVérifiez le subdomain (ex: quay.localhost)
Fenêtre de terminal
# Health check
curl -I http://localhost/healthz
# Voir les logs
docker logs orca
# Métriques de cache (si varnishstat disponible)
docker exec orca varnishstat -1 | grep "cache_hit\|cache_miss"

Ce message apparaît au démarrage :

Warning: mlock() of VSM failed: Cannot allocate memory (12)

C’est bénin. Varnish tente de verrouiller sa mémoire partagée (VSM) en RAM pour éviter qu’elle soit swappée. Sur Docker avec des limites mémoire, cette opération peut échouer, mais Orca fonctionne correctement sans.

FonctionnalitéFreePremium
Cache registres publics
TLS (HTTPS)
Cache mémoire
Métriques OpenTelemetry
Tracing OpenTelemetry
Cache registres privés
Stockage persistant (disque)
Programmabilité VCL
Mirror Git
Support

La licence Free est embarquée et valide 1 an après la date de release. Pour continuer à utiliser Orca gratuitement, mettez simplement à jour vers une nouvelle version.

Si vous utilisez un gestionnaire d’artefacts payant comme JFrog Artifactory, AWS ECR, Azure ACR ou Google Artifact Registry, Orca peut réduire votre facture.

Pourquoi ? Ces services facturent généralement le transfert de données (egress). Chaque docker pull ou npm install depuis votre CI/CD compte comme du trafic sortant facturable.

Avec Orca, vos pipelines tirent les artefacts depuis le cache local au lieu du registre distant. Résultat : moins de transfert = moins de coûts.

  • Orca est un Virtual Registry Manager : il cache les artefacts (Docker, NPM, Go, Helm) au niveau HTTP
  • Gain de performance 4x sur les pulls d’images Docker depuis le cache
  • Réduction de 75%+ du trafic sortant vers les registres
  • Résilience : continue de servir les artefacts même si Docker Hub tombe
  • Configuration YAML simple : pas de VCL à écrire, déploiement en 2 minutes
  • Routing par subdomain : npmjs.localhost pour NPM, ghcr.localhost pour GHCR, etc.
  • OpenTelemetry intégré pour surveiller le taux de cache hit
  • Économies JFrog/ECR/ACR : réduction de 50-70% sur les factures de registres payants grâce à la diminution du transfert de données

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.