
Dans Kubernetes, vous contrôlez quand et comment les images sont téléchargées via imagePullPolicy. Pour accéder à un registre privé, vous créez un Secret de type docker-registry et le référencez avec imagePullSecrets. Enfin, pour garantir que vos Pods utilisent toujours la même version d’image, préférez les digests aux tags mutables comme latest — un digest (ex: sha256:abc123...) identifie de façon unique et immuable une version précise de l’image.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre les trois valeurs d’
ImagePullPolicyet leur comportement - Distinguer tags et digests pour garantir la reproductibilité
- Configurer l’accès aux registres privés avec des Secrets
- Déboguer les erreurs
ImagePullBackOffetErrImagePull - Appliquer des policies d’admission pour sécuriser vos déploiements
Prérequis : connaître les bases des Pods et avoir compris comment construire une image.
Les trois mécanismes clés
Section intitulée « Les trois mécanismes clés »Avant d’entrer dans le détail, comprenons les trois mécanismes distincts qui interviennent :
| Question | Mécanisme | Exemple |
|---|---|---|
| Quelle image exacte exécuter ? | Tag ou digest | nginx:1.25.3 ou nginx@sha256:... |
| Quand contacter le registre ? | imagePullPolicy | Always, IfNotPresent, Never |
| Comment s’authentifier ? | imagePullSecrets | Secret de type docker-registry |
Ces trois mécanismes sont indépendants : vous pouvez utiliser un digest avec n’importe quelle pull policy, et imagePullSecrets n’affecte que l’authentification, pas la décision de pull.
Anatomie d’une référence d’image
Section intitulée « Anatomie d’une référence d’image »Avant de configurer le pull d’images, comprenons la structure d’une référence d’image complète :
[registre/][namespace/]nom[:tag][@digest]| Composant | Exemple | Description |
|---|---|---|
| Registre | registry.k8s.io, ghcr.io | Serveur hébergeant l’image. Par défaut : Docker Hub (docker.io) |
| Namespace | library, myorg | Organisation ou utilisateur. library pour les images officielles |
| Nom | nginx, myapp | Nom de l’image |
| Tag | :1.25.3, :latest | Version de l’image. Par défaut : latest |
| Digest | @sha256:abc123... | Hash unique et immuable de l’image |
ImagePullPolicy : contrôler le téléchargement
Section intitulée « ImagePullPolicy : contrôler le téléchargement »Le champ imagePullPolicy définit quand le kubelet tente de télécharger l’image depuis le registre.
Les trois valeurs possibles
Section intitulée « Les trois valeurs possibles »| Politique | Comportement | Cas d’usage typique |
|---|---|---|
| Always | Résout l’image auprès du registre à chaque démarrage du conteneur. Si l’image résolue existe déjà localement avec le même digest, les couches peuvent être réutilisées (pas de re-téléchargement complet). | Images avec tag latest, CI/CD |
| IfNotPresent | Utilise l’image locale si elle existe, sinon télécharge. Attention : en contexte supply chain strict, cette policy peut utiliser une image en cache sans vérifier si une version plus récente existe. | Production avec tags versionnés |
| Never | N’utilise que l’image locale, échoue si absente | Images pré-chargées, air-gapped |
Comportement par défaut (important pour le CKAD)
Section intitulée « Comportement par défaut (important pour le CKAD) »Kubernetes applique une politique implicite selon le tag spécifié :
# imagePullPolicy NON spécifiéspec: containers: - name: app image: nginx:latest # → Always (tag latest) image: nginx # → Always (pas de tag = latest implicite) image: nginx:1.25.3 # → IfNotPresent (tag explicite) image: nginx@sha256:... # → IfNotPresent (digest)Exemple complet avec imagePullPolicy
Section intitulée « Exemple complet avec imagePullPolicy »apiVersion: v1kind: Podmetadata: name: app-pod namespace: productionspec: containers: - name: app image: myregistry.example.com/myapp:v2.1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8080Garantir l’identité de l’image
Section intitulée « Garantir l’identité de l’image »Selon votre objectif, différents mécanismes s’appliquent :
imagePullPolicy: Always force le kubelet à contacter le registre à chaque démarrage pour résoudre le tag. Utile avec des tags mutables comme latest.
spec: containers: - name: app image: myapp:v1.0 imagePullPolicy: AlwaysUn digest garantit que vous exécutez exactement l’image voulue, sans ambiguïté. Le digest ne force pas un re-pull — si l’image est déjà en cache avec le bon digest, Kubernetes la réutilise.
spec: containers: - name: app image: myapp@sha256:1ff6c18fbef2045...L’admission controller AlwaysPullImages force tous les Pods du cluster à vérifier le registre. Utile en environnement multi-tenant pour empêcher un Pod de réutiliser une image privée déjà tirée par un autre workload.
# Dans les options kube-apiserver--enable-admission-plugins=AlwaysPullImagesTags vs Digests : garantir l’immutabilité
Section intitulée « Tags vs Digests : garantir l’immutabilité »Le problème des tags mutables
Section intitulée « Le problème des tags mutables »Un tag est un alias vers une version d’image. Le problème : il peut être déplacé vers une autre version.
Jour 1 : myapp:latest → sha256:abc123 (version 1.0)Jour 2 : myapp:latest → sha256:def456 (version 1.1)Conséquence : deux Pods déployés à des moments différents avec myapp:latest peuvent exécuter du code différent.
La solution : les digests
Section intitulée « La solution : les digests »Un digest est un hash SHA256 du contenu de l’image. Il est immuable par définition.
# ❌ Risqué en productionimage: myapp:latest
# ✅ Reproductible et vérifiableimage: myapp@sha256:1ff6c18fbef2045af6b9c16bf034cc421a29027b800e4f9b68ae9b1cb3e9ae07Récupérer le digest d’une image
Section intitulée « Récupérer le digest d’une image »Crane est l’outil le plus fiable pour manipuler les registres OCI :
# Installer cranego install github.com/google/go-containerregistry/cmd/crane@latest
# Récupérer le digestcrane digest nginx:1.25.3# sha256:6926dd802f40...skopeo inspect docker://nginx:1.25.3 | jq -r '.Digest'# sha256:6926dd802f40...Si l’image est déjà pullée localement :
docker inspect --format='{{index .RepoDigests 0}}' nginx:1.25.3# nginx@sha256:6926dd802f40...Note : Cette commande retourne le digest du manifest, qui est celui à utiliser dans vos références d’image Kubernetes.
Accéder aux registres privés
Section intitulée « Accéder aux registres privés »Par défaut, Kubernetes ne peut télécharger que les images publiques. Pour accéder à un registre privé, vous devez fournir des credentials.
Créer un Secret docker-registry
Section intitulée « Créer un Secret docker-registry »-
Créez le Secret avec vos credentials
Fenêtre de terminal kubectl create secret docker-registry regcred \--docker-server=myregistry.example.com \--docker-username=myuser \--docker-password=mypassword \--docker-email=myuser@example.com \-n production -
Vérifiez le Secret créé
Fenêtre de terminal kubectl get secret regcred -n production -o yamlLe champ
.dockerconfigjsoncontient vos credentials encodés en base64. -
Référencez le Secret dans votre Pod
apiVersion: v1kind: Podmetadata:name: private-appnamespace: productionspec:containers:- name: appimage: myregistry.example.com/myapp:v1.0imagePullSecrets:- name: regcred
Automatiser avec un ServiceAccount
Section intitulée « Automatiser avec un ServiceAccount »Pour éviter d’ajouter imagePullSecrets à chaque Pod, attachez le Secret au ServiceAccount par défaut :
apiVersion: v1kind: ServiceAccountmetadata: name: default namespace: productionimagePullSecrets:- name: regcredTous les Pods du namespace utilisant ce ServiceAccount hériteront automatiquement du Secret.
Structure d’un Secret docker-registry
Section intitulée « Structure d’un Secret docker-registry »apiVersion: v1kind: Secretmetadata: name: regcred namespace: productiontype: kubernetes.io/dockerconfigjsondata: .dockerconfigjson: eyJhdXRocyI6eyJteXJlZ2lzdHJ5LmV4YW1wbGUuY29tIjp7InVzZXJuYW1lIjoibXl1c2VyIiwicGFzc3dvcmQiOiJteXBhc3N3b3JkIiwiZW1haWwiOiJteXVzZXJAZXhhbXBsZS5jb20iLCJhdXRoIjoiYlhsMWMyVnlPbTE1Y0dGemMzZHZjbVE9In19fQ==Pour décoder et vérifier le contenu :
kubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 -d | jqDéboguer les erreurs d’image
Section intitulée « Déboguer les erreurs d’image »ImagePullBackOff et ErrImagePull
Section intitulée « ImagePullBackOff et ErrImagePull »Ces erreurs indiquent que Kubernetes n’arrive pas à télécharger l’image.
kubectl describe pod my-podCauses fréquentes :
| Erreur | Cause probable | Solution |
|---|---|---|
ImagePullBackOff | Échecs répétés de pull | Vérifiez les credentials et la connectivité |
ErrImagePull | Image introuvable ou accès refusé | Vérifiez le nom de l’image et les droits |
InvalidImageName | Syntaxe d’image incorrecte | Corrigez le format (registre/nom:tag) |
Checklist de diagnostic
Section intitulée « Checklist de diagnostic »-
Vérifiez que l’image existe
Fenêtre de terminal # Depuis une machine avec accès au registredocker pull myregistry.example.com/myapp:v1.0# oucrane manifest myregistry.example.com/myapp:v1.0 -
Vérifiez le Secret imagePullSecrets
Fenêtre de terminal # Le Secret existe-t-il dans le bon namespace ?kubectl get secret regcred -n production# Le Pod le référence-t-il ?kubectl get pod my-pod -o jsonpath='{.spec.imagePullSecrets}' -
Testez les credentials
Fenêtre de terminal # Décodez et testez manuellementkubectl get secret regcred -o jsonpath='{.data.\.dockerconfigjson}' | base64 -d -
Consultez les events du Pod
Fenêtre de terminal kubectl describe pod my-pod | grep -A 10 Events
Erreur FailedToRetrieveImagePullSecret
Section intitulée « Erreur FailedToRetrieveImagePullSecret »Events: Reason: FailedToRetrieveImagePullSecret Message: Unable to retrieve some image pull secrets (regcred)Cette erreur signifie que le Secret référencé dans imagePullSecrets n’existe pas dans le namespace du Pod. Vérifiez :
- Le nom du Secret est correct
- Le Secret existe dans le même namespace que le Pod
Images multi-architecture
Section intitulée « Images multi-architecture »Les images modernes supportent plusieurs architectures (amd64, arm64) via un manifest index (ou “fat manifest”).
# Voir les architectures supportéescrane manifest nginx:1.25.3 | jq '.manifests[].platform'Kubernetes sélectionne automatiquement la bonne architecture selon le node. Attention : le pull réussit automatiquement uniquement si l’image publiée supporte l’architecture du nœud cible. Si vous déployez une image amd64 sur un nœud arm64 sans manifest multi-arch, le conteneur échouera avec une erreur exec format error.
Commandes impératives CKAD
Section intitulée « Commandes impératives CKAD »Pour l’examen CKAD, maîtrisez ces commandes :
# Créer un Pod avec une image spécifiquekubectl run nginx --image=nginx:1.25.3
# Générer le YAML sans créer le Podkubectl run nginx --image=nginx:1.25.3 --dry-run=client -o yaml > pod.yaml
# Changer l'image d'un Deploymentkubectl set image deployment/myapp myapp=myapp:v2.0
# Créer un Secret docker-registrykubectl create secret docker-registry regcred \ --docker-server=registry.example.com \ --docker-username=user \ --docker-password=pass
# Voir les événements d'un Pod en erreurkubectl describe pod my-pod | tail -20À retenir
Section intitulée « À retenir »| Concept | Points clés |
|---|---|
| ImagePullPolicy | Always (latest), IfNotPresent (tags versionnés), Never (local only) |
| Tags | Mutables, pratiques pour le dev, risqués en prod |
| Digests | Immuables (sha256:...), garantissent la reproductibilité |
| imagePullSecrets | Secret de type docker-registry dans le même namespace |
| ImagePullBackOff | Vérifiez image, credentials, et connectivité réseau |
Testez vos connaissances
Section intitulée « Testez vos connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications