Lab 02 : Premiers Pods, Labels & Sélecteurs¶
Objectifs Pédagogiques :¶
- Comprendre la structure atomique d'un Pod Kubernetes et son cycle de vie.
- Maîtriser la génération de manifests déclaratifs YAML grâce à
--dry-run=client -o yaml. - Injecter des variables d'environnement (
env) et inspecter l'intérieur du conteneur (kubectl exec,logs). - Dimensionner les ressources système avec les Requests et Limits (CPU et mémoire vive).
- Mettre en œuvre le pattern d'initialisation avec les InitContainers.
- Exploiter les Labels et Selectors pour organiser et filtrer les composants applicatifs.
- Constater les limites de résilience d'un Pod isolé (bare pod).
📌 Note Compatibilité OS :
Les commandeskubectl(kubectl apply,kubectl get,kubectl describe,kubectl exec,kubectl label) sont rigoureusement identiques sous Windows (PowerShell), Linux (Ubuntu) et macOS (Terminal).💡 Modalités d'exécution (Au choix) :
* Option A (Recommandée - Confort DevOps Local) : Exécutez les commandes directement depuis votre terminal local avec votrekubectlet lekubeconfigconfiguré au Lab 00. Vous modifiez vos YAML directement dans votre IDE sans transfert !
* Option B (Secours - PC d'entreprise verrouillé) : Connectez-vous en SSH surk8s-control(via MobaXterm ou terminal) :kubectlet tous les dossiers de TP sont déjà pré-déployés dans~/labs/.
Contexte Métier¶
Le portail Horizon Stages doit démarrer par la mise en ligne d'une première version de son interface web statique. En tant qu'administrateur, vous devez déployer ce premier conteneur dans un Pod, encadrer ses besoins en ressources CPU/RAM, lui injecter ses paramètres d'exécution et l'étiqueter correctement pour que les équipes d'exploitation puissent l'identifier sans ambiguïté.
- Image Docker du frontend :
regaieg/campus:frontend-1.0.0 - Port exposé par le conteneur :
8080(Nginx unprivileged)
Exercice 1 : Déploiement Impératif vs Déclaratif¶
- Lancez un premier pod nommé
frontend-testde manière impérative avec l'imageregaieg/campus:frontend-1.0.0sur le port8080: - Observez l'état du pod jusqu'à ce qu'il passe au statut
Running: - Supprimez ce pod de test :
Exercice 2 : La Technique DevOps du --dry-run & Manifeste Déclaratif¶
En production, on n'écrit jamais de YAML à partir d'une page blanche. On utilise la commande kubectl run combinée avec --dry-run=client -o yaml pour générer un squelette propre et valide.
- Générez un manifest nommé
pod-frontend.yamlsans exécuter la création sur le cluster :
Sous Windows (PowerShell) :¶
kubectl run campus-frontend --image=regaieg/campus:frontend-1.0.0 --port=8080 --dry-run=client -o yaml | Out-File -Encoding utf8 pod-frontend.yaml
Sous Linux (Ubuntu) / macOS (Bash) :¶
kubectl run campus-frontend --image=regaieg/campus:frontend-1.0.0 --port=8080 --dry-run=client -o yaml > pod-frontend.yaml
- Enrichissez la section
metadata.labelsde votre fichier YAML pour y inclure les labels d'entreprise : app: campustier: frontendenvironment: devversion: "1.0.0"
💡 Indice 1 : Structure YAML attendue
- Appliquez le manifest de manière déclarative :
Exercice 3 : Variables d'Environnement & Inspection Interne¶
Un Pod ne doit pas être une boîte noire. Vous devez savoir lui injecter des paramètres dynamiques et inspecter son fonctionnement interne.
- Modifiez votre fichier
pod-frontend.yamlpour injecter deux variables d'environnement dans le conteneur via la sectionenv: CAMPUS_APP_NAME:"Horizon Stages"CAMPUS_ENV:"development"
💡 Indice 2 : Exemple d'ajout de variables d'environnement
-
Réappliquez le manifest :
(Un Pod existant ne peut pas modifier ses variables à chaud : l'option--forcedétruit et recrée le pod avec la nouvelle définition). -
Exécuter une commande à l'intérieur du conteneur (
kubectl exec) : Vérifiez que la variable est bien présente dans le système Linux du conteneur : -
Tester la réponse HTTP locale du serveur web :
💡 Précision réseau : Nous ciblons
127.0.0.1:8080plutôt quelocalhost:8080car sous les distributions légères comme Alpine Linux,localhostrésout par défaut sur IPv6 (::1), alors que le serveur Nginx écoute sur le socket IPv40.0.0.0:8080. -
Consulter les journaux d'accès (logs) :
Exercice 4 : Allocation & Gouvernance des Ressources (Requests & Limits)¶
En environnement d'entreprise partagé, ne pas borner la mémoire et le CPU d'un conteneur expose le serveur physique à la saturation (phénomène du Noisy Neighbor).
requests(demande garantie) : Quantité minimale de CPU et de RAM réservée par le Scheduler sur le nœud worker pour accepter de placer le Pod.-
limits(plafond absolu) : Plafond maximal autorisé. Si le conteneur dépasse la limite mémoire, le noyau Linux le tue immédiatement (OOMKilled). S'il dépasse la limite CPU, il subit du bridage temporel (CPU Throttling). -
Complétez la définition du conteneur dans
pod-frontend.yamlavec les ressources suivantes : - Requests :
100mde CPU (10% d'un cœur vCPU) et128Mide RAM. - Limits :
250mde CPU (25% d'un cœur vCPU) et256Mide RAM.
💡 Indice 3 : Bloc resources dans le manifest
-
Appliquez la mise à jour :
-
Vérifiez la prise en compte des quotas dans la description officielle de Kubernetes :
Exercice 5 : Pattern Avancé d'Initialisation (InitContainers)¶
Un InitContainer s'exécute et se termine avant que le conteneur applicatif principal ne démarre. C'est le pattern recommandé par la CNCF pour télécharger des dépendances, attendre qu'une base de données réponde ou valider des prérequis réseau.
-
Ajoutez un bloc
initContainersdans votre fichierpod-frontend.yaml: -
Appliquez le manifest et observez la transition d'état en direct :
Observez la progression des statuts :Init:0/1→PodInitializing→Running! -
Affichez les logs spécifiques du conteneur d'initialisation :
Exercice 6 : Maîtrise des Labels, Annotations & Limites du Pod Isolé¶
- Filtrer avec des sélecteurs stricts :
- Filtrer par composant frontend :
- Filtrer par application et environnement :
-
Filtrer par négation (tous les pods qui ne sont pas backend) :
-
Labels vs Annotations (Différence Fondamentale) :
- Les Labels sont indexés par le Control Plane pour l'ordonnancement, les Services et les sélecteurs (
kubectl get -l). Ils obéissent à une syntaxe stricte (alphanumérique, pas d'arobase ni d'espaces). - Les Annotations servent aux métadonnées non sélectionnables (adresses e-mail, numéros de commit Git, payloads JSON, timestamps) :
-
Tentez de filtrer les pods par le contact annoté :
Constat : Aucune ressource trouvée (No resources found) ! Même avec une syntaxe valide, les annotations ne sont pas indexées par le sélecteur d'etcd. -
Le crash-test du Pod isolé : Supprimez le pod
Question de réflexion : Le pod est-il réapparu tout seul ?campus-frontend:
Réponse : Non ! Un Pod isolé (bare pod) n'est rattaché à aucun contrôleur. S'il plante, meurt ou est supprimé, il est définitivement perdu.
👉 C'est la raison d'être des Deployments, étudiés dans le Lab 03 !
Critères de Validation (Checklist)¶
- Vous maîtrisez la génération rapide de manifest avec
--dry-run=client -o yaml. - Vous savez injecter des variables d'environnement (
env) et inspecter l'intérieur du conteneur aveckubectl exec. - Vous savez encadrer la consommation mémoire et processeur avec
resources.requestsetresources.limits. - Vous avez vu tourner un
initContaineret compris son rôle dans le cycle de vie du Pod. - Vous savez filtrer les ressources avec le paramètre
-l / --selectoret faites la distinction entre Label et Annotation. - Vous avez constaté par vous-même l'absence de haute disponibilité d'un pod nu.