Utilisation de Harbor — Guide Étudiant

Ce guide décrit comment utiliser Harbor, un registre d’images Docker et Podman.
Le registre permet de stocker, versionner et distribuer des images de conteneurs.

Le service est accessible via Internet, ce qui permet son utilisation depuis des infrastructures internes ou externes à l’UGA.
Il peut également être intégré avec vos environnements Docker, Podman ou Kubernetes.

Le guide est structuré comme suit :

Accés à l’interface web d’Harbor

Rendez-vous sur l’interface web d’Harbor :
🔗 https://im2ag-harbor.univ-grenoble-alpes.fr

Connectez-vous avec votre login et mot de passe Agalan:

Login Harbor

Vous arriverez sur la page de vos projets.
Dashboard Harbor

Création et gestion d’un projet

Vous pouvez créer un projet en cliquant sur New Project et en précisant la visibilité de votre dépôt.

NewProject

Remarque:

Lorsqu’un projet est mis en public, n’importe qui a l’autorisation de lire les dépôts sous ce projet, et l’utilisateur n’a pas besoin d’exécuter “docker login” avant de prendre des images de ce projet.

Une fois le projet créé, cliquez sur son nom pour accéder à ses Repositories.

repository Harbor

Authentification et comptes robot

Avant de pouvoir pousser des images dans ce registre, il est recommandé de créer un compte robot (Robot Account) pour interagir avec ce dépôt.

CreateRobot

Vous obtiendrez un login et un mot de passe générés pour votre robot.

CreateRobot

Vous pouvez exporter ce mot de passe dans un fichier.

Pour info, si vous perdez le fichier du secret, vous pourrez régénérer un mot de passe en sélectionnant le compte robot, puis en cliquant sur Actions → Refresh Secret.
Vous pourrez alors soit rafraîchir, soit définir un mot de passe de votre choix.

RefreshMDP

⚠️ Remarque importante : le login contient le caractère spécial $.
Veillez à bien l’échapper. En effet, si on n’échappe pas ce caractère, le shell pourrait remplacer une partie de votre login par une chaîne de caractères vide!

RemarqueLogin

À ce stade, vous pouvez vous connecter, pousser et récupérer des images depuis votre dépôt.

Connexion à votre projet :

Le service est disponible sans avoir besoin d’être connecté au VPN de l’université. Il existe plusieurs moyens pour se connecter à votre projet. On va utiliser un moyen simple en ligne de commandes. Utilisez la commande suivante:

echo 'mot de passe' | docker login -u  'login' --password-stdin https://im2ag-harbor.univ-grenoble-alpes.fr

LoginOK

Depuis l’onglet Repositories, cliquez sur le bouton Push Command.
Vous y trouverez un modèle de commande à exécuter.

PushCommands

Gestion des images (build, tag, push)

Exemple complet pour montrer la création et la publication d’une image.

  1. Construire l’image Docker

Depuis le dossier contenant le Dockerfile :

docker build -t myapp .

Cela construit une image locale appelée myapp:latest
DockerBuild

  1. Nommer l’image avec l’URL de Harbor

Pour pouvoir la pousser dans Harbor, il faut la nommer avec le chemin complet du registre et du projet :

docker tag myapp:latest im2ag-harbor.univ-grenoble-alpes.fr/test-repo/myapp:v1

Ici, test-repo est le nom du projet dans Harbor et v1 est le tag choisi.
dockerTag

  1. Pousser l’image dans Harbor
docker push im2ag-harbor.univ-grenoble-alpes.fr/test-repo/myapp:v1

Les différentes couches sont envoyées dans le registre.
DockerPush

  1. Vérifier dans l’interface Harbor

Une fois le push terminé, connectez-vous à l’interface web Harbor. Vous verrez l’image myapp avec le tag v1 dans l’onglet Artifacts : Depot

imagePoussee

  1. Exécuter l’image depuis Harbor

Si l’image n’est pas disponible localement, Docker la téléchargera automatiquement depuis Harbor lors de l’exécution.

dockerRun


Utiliser Harbor comme registre privé avec Kubernetes K3s

Pour permettre à votre cluster K3s de récupérer des images qui se trouvent sur ce registre, vous pouvez vous referer à la documentation de K3s.

Dans un cluster Kubernetes ou K3s, les images Docker sont téléchargées directement par les nœuds du cluster.
Si les images sont stockées dans un registre privé alors il faut configurer l’accès au registre pour que chaque nœud puisse les récupérer.

Supposons qu’on veut déployer l’image d’un serveur web Nginx dans notre cluster

kubectl create deployment nginx-harbor \
  --image=im2ag-harbor.univ-grenoble-alpes.fr/basel-depot/serveur-web-nginx:v1.0

1. Configurer l’accès au registre dans K3s

Sur chaque nœud du cluster (serveur master ou worker), créez le fichier /etc/rancher/k3s/registries.yaml.

Le repertoire /etc/rancher/k3s/ n’existe pas par défaut dans les workers.

sudo mkdir -p /etc/rancher/k3s # Il faut le créer

sudo nano /etc/rancher/k3s/registries.yaml # Puis créez le fichier registries.yaml

Exemple de configuration :

mirrors:
  "im2ag-harbor.univ-grenoble-alpes.fr":
    endpoint:
      - "https://im2ag-harbor.univ-grenoble-alpes.fr"

configs:
  "im2ag-harbor.univ-grenoble-alpes.fr":
    auth:
      username: 'robot$basel-depot+ca-config-file'
      password: '5yOr63Xv6OHOm3XK4RL94xdR5B5C8MjB'
    tls:
      insecure_skip_verify: true

2. Redémarrer K3s

Après avoir créé ou modifié ce fichier, redémarrez le service K3s pour appliquer la configuration.

Sur un nœud serveur :

sudo systemctl restart k3s

Sur un nœud worker :

sudo systemctl restart k3s-agent

3. Déployer une image depuis Harbor

Une fois le registre configuré, vous pouvez utiliser directement vos images Harbor dans Kubernetes.

Exemple :

# Création d'un déploiement
kubectl create deployment nginx-harbor \
  --image=im2ag-harbor.univ-grenoble-alpes.fr/basel-depot/serveur-web-nginx:v1.0

# Vérification de l'état du déploiement :  
kubectl get deploy nginx-harbor

# Vérification de l'état du pod :  
kubectl get pods

Alternative : utiliser un secret Kubernetes (imagePullSecret)

Dans certains cas, il n’est pas possible ou pas souhaitable de configurer le fichier /etc/rancher/k3s/registries.yaml sur les nœuds du cluster. Kubernetes permet alors d’utiliser un secret de type registre Docker pour fournir les identifiants d’accès à Harbor.

Cette méthode est pratique lorsque l’on veut gérer l’authentification au niveau du namespace ou du déploiement, sans modifier la configuration système des nœuds.

1. Créer le secret Docker Registry

kubectl create secret docker-registry harbor-regcred \
  --docker-server=im2ag-harbor.univ-grenoble-alpes.fr \
  --docker-username='robot$basel-depot+ca-config-file' \
  --docker-password='5yOr63Xv6OHOm3XK4RL94xdR5B5C8MjB'

Remarques :

2. Vérifier que le secret existe

kubectl get secret harbor-regcred

3. Utiliser le secret dans un Deployment

Exemple de manifeste Kubernetes :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-harbor
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-harbor
  template:
    metadata:
      labels:
        app: nginx-harbor
    spec:
      imagePullSecrets:
        - name: harbor-regcred
      containers:
        - name: nginx
          image: im2ag-harbor.univ-grenoble-alpes.fr/basel-depot/serveur-web-nginx:v1.0
          ports:
            - containerPort: 80

Appliquez ensuite le fichier :

kubectl apply -f deployment-harbor.yaml

4. Différence entre registries.yaml et imagePullSecret

Les deux solutions permettent d’accéder à un registre privé, mais elles ne s’appliquent pas au même niveau :