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:
Vous arriverez sur la page de vos projets.

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.

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.
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.

- Créez un compte robot et choisissez sa date d’expiration.
- Cliquez sur Next et définissez ses permissions.
Vous obtiendrez un login et un mot de passe générés pour votre robot.

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.

⚠️ 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!

À 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

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

Gestion des images (build, tag, push)
Exemple complet pour montrer la création et la publication d’une image.
- Construire l’image Docker
Depuis le dossier contenant le Dockerfile :
docker build -t myapp .
Cela construit une image locale appelée myapp:latest

- 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.

- 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.

- 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 :


- 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.

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 :
--docker-servercorrespond au registre Harbor.--docker-usernameest le login complet du Robot Account.--docker-passwordest le secret / token du robot account. Si le login contient un caractère spécial comme$, il faut bien l’échapper avec des guillemets simples'robot$...'.
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 :
registries.yaml: configuration du nœud (K3s / containerd)imagePullSecret: configuration Kubernetes (namespace / pod / deployment)