Table Des Matieres
Table Des Matieres
Table Des Matieres
Avant-propos
Chapitre 1
Principes fondamentaux
1. Positionnement de Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.1 La problématique racine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2 Approche par augmentation des ressources physiques . . . . . . . . . . . . 20
1.3 Approche par parallélisation des traitements . . . . . . . . . . . . . . . . . . . . 21
1.4 L'approche par virtualisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.5 Tentatives de réduction de la consommation de ressources . . . . . . . . 24
1.6 Comment Docker règle radicalement le problème . . . . . . . . . . . . . . . . 25
1.7 Positionnement de Docker par rapport à la virtualisation. . . . . . . . . . 28
1.8 Positionnement de Docker par rapport aux clusters . . . . . . . . . . . . . . 30
1.9 Positionnement de Docker par rapport
aux approches de bacs-à-sable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2. Principe des conteneurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.1 Les apports de Docker. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.2 Principe des conteneurs industriels . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.3 Docker et l'approche normalisée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3. Les fondements de Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.1 Les technologies Linux clés pour Docker. . . . . . . . . . . . . . . . . . . . . . . . 40
3.1.1 Namespaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.1.2 Mise en œuvre d'un namespace . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1.3 cgroups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.1.4 chroot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2 Autres dépendances du système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.1 netfilter et iptables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.2.2 capabilities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2.3 AppArmor et SELinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2 Docker
Concepts et déploiement d'applications conçues en services
Chapitre 2
Installation
1. Éditions et canaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
1.1 Un standard sous Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
1.2 Les canaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
1.3 Les éditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
2. Utiliser des machines dans le cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
2.1 Amazon AWS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
2.1.1 Offre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
2.1.2 Création de la machine virtuelle . . . . . . . . . . . . . . . . . . . . . . . . 76
2.1.3 Accès à la machine virtuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
2.1.4 Gestion de la consommation . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
2.1.5 Suppression de la machine virtuelle . . . . . . . . . . . . . . . . . . . . . 88
2.2 Microsoft Azure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
2.2.1 Offre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
2.2.2 Création de la machine virtuelle . . . . . . . . . . . . . . . . . . . . . . . . 91
2.2.3 Accès à la machine virtuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
2.2.4 Suppression de la machine virtuelle . . . . . . . . . . . . . . . . . . . . 106
2.3 Google Cloud Platform. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
2.3.1 Offre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
2.3.2 Création de la machine virtuelle . . . . . . . . . . . . . . . . . . . . . . . 109
2.3.3 Accès à la machine virtuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
2.3.4 Suppression de la machine virtuelle . . . . . . . . . . . . . . . . . . . . 116
3. Installation de Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
3.1 Installation de Docker sur Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
3.1.1 Prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
3.1.2 Gestionnaires de paquets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.1.3 Installation par script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.1.4 Cas particulier de l'installation sur Clear Linux . . . . . . . . . . . 120
3.2 Le paradoxe Docker sous Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . 123
3.2.1 Des technologies différentes . . . . . . . . . . . . . . . . . . . . . . . . . . 123
3.2.2 Docker et Hyper-V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
3.2.3 L'âge de la maturité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
3.3 L'outil Docker pour Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
3.3.1 Outil d'installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
3.3.2 Choix du canal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
4 Docker
Concepts et déploiement d'applications conçues en services
Chapitre 3
Premiers pas avec Docker
1. Hello World, Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
1.1 Démarrage d'un conteneur simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
1.2 Détails des opérations effectuées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
1.2.1 Récupération d'une image . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
1.2.2 Identité de l'image. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
1.2.3 Taille des images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
1.2.4 Anatomie de l'image Linux. . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
1.2.5 Anatomie de l'image Windows . . . . . . . . . . . . . . . . . . . . . . . . 187
1.2.6 Lancement du processus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
1.2.7 Exécution du processus dans un conteneur . . . . . . . . . . . . . . 189
1.2.8 Opérations suivant l'exécution . . . . . . . . . . . . . . . . . . . . . . . . 190
Table des matières 5
Chapitre 4
Création et gestion d’images Docker
1. Création manuelle d'une nouvelle image . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
1.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
1.2 Approche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
1.3 Difficultés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
1.4 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
2. Utilisation d’un fichier Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
2.1 Intérêt des fichiers Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
2.2 Utilisation d'un fichier Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
2.3 Anatomie d'un fichier Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
2.3.1 FROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
2.3.2 RUN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
2.3.3 ENV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
2.3.4 VOLUME. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
2.3.5 COPY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
2.3.6 ENTRYPOINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
2.3.7 EXPOSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
2.3.8 CMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
2.4 Notre premier fichier Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
2.4.1 Fonctionnalité souhaitée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
2.4.2 Création et test du script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
2.4.3 Création du Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
2.4.4 Génération de l'image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
2.4.5 Lancement du conteneur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
2.4.6 Arrêt et relance du conteneur. . . . . . . . . . . . . . . . . . . . . . . . . . 283
2.4.7 Une méthode moins brutale. . . . . . . . . . . . . . . . . . . . . . . . . . . 284
2.4.8 Gestion des paramètres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
2.4.9 Reconstruction de l'image et cache . . . . . . . . . . . . . . . . . . . . . 287
2.5 Commandes additionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
2.5.1 Gestion des fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
2.5.2 Notion de contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
2.5.3 Retours sur l'affectation du processus à démarrer . . . . . . . . . 290
2.5.4 Remarque sur le format ligne de commande ou exécution . . 293
2.5.5 Commandes diverses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Table des matières 7
Chapitre 5
Mise en œuvre pratique
1. Présentation de l'application exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
1.1 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
1.2 Création d'un fichier des mots de passe . . . . . . . . . . . . . . . . . . . . . . . 410
1.2.1 Principe de sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
1.2.2 Installation de KeePass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
1.2.3 Création du fichier de sécurité. . . . . . . . . . . . . . . . . . . . . . . . . 411
1.2.4 Remplissage du fichier de mots de passe. . . . . . . . . . . . . . . . . 416
1.3 Mise en place des certificats de sécurité . . . . . . . . . . . . . . . . . . . . . . . 418
1.3.1 Certificat racine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
1.3.2 Certificat client. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
1.4 Prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
1.5 Paramétrage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
1.5.1 Paramétrage de l'IAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
1.5.2 Paramétrage de RecepteurMessages . . . . . . . . . . . . . . . . . . . . 435
1.5.3 Paramétrage du projet API . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
1.5.4 Autres projets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
1.5.5 Paramétrage de la solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
1.6 Première utilisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
1.6.1 Scénario nominal de test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
1.6.2 Persistance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
1.6.3 Observation des documents. . . . . . . . . . . . . . . . . . . . . . . . . . . 446
1.7 Utilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
1.8 Principes à l'œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
1.8.1 Un mot sur les architectures de services . . . . . . . . . . . . . . . . . 448
1.8.2 Lien avec la programmation SOLID . . . . . . . . . . . . . . . . . . . . 448
2. Adaptation à Docker de l'application exemple . . . . . . . . . . . . . . . . . . . . . . 449
2.1 Préparation de l'environnement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
2.2 Principes de construction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
2.3 Détails du service RecepteurMessages . . . . . . . . . . . . . . . . . . . . . . . . 451
2.3.1 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
2.3.2 Construction du fichier Dockerfile de base. . . . . . . . . . . . . . . 453
2.3.3 Classification du support des paramètres . . . . . . . . . . . . . . . . 457
2.3.4 Cas particulier des paramètres de sécurité . . . . . . . . . . . . . . . 460
2.3.5 Modification du projet pour gestion des paramètres . . . . . . . 460
10 Docker
Concepts et déploiement d'applications conçues en services
Chapitre 6
Orchestration par Docker Compose
1. Redéployer automatiquement avec Docker Compose . . . . . . . . . . . . . . . . 533
1.1 Principe de Docker Compose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
1.2 Écriture du fichier docker-compose.yml . . . . . . . . . . . . . . . . . . . . . . . 535
1.2.1 Remarques préliminaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
1.2.2 Préparation du squelette du fichier . . . . . . . . . . . . . . . . . . . . . 536
1.2.3 Mise en place des dépendances externes . . . . . . . . . . . . . . . . . 536
1.2.4 Ajout de la détection de statut des services . . . . . . . . . . . . . . 539
1.2.5 Inclusion du projet RecepteurMessages . . . . . . . . . . . . . . . . . 542
1.2.6 Ajout du projet API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
1.2.7 Finalisation avec le projet Server . . . . . . . . . . . . . . . . . . . . . . . 547
1.3 Mise en œuvre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
1.3.1 Exclusion du mode HTTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
1.3.2 Premier lancement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
1.3.3 Retour sur le problème d'authentification . . . . . . . . . . . . . . . 551
1.3.4 Tentative de résolution par le réseau hôte . . . . . . . . . . . . . . . 553
1.3.5 Stratégie d'externalisation de l'IAM . . . . . . . . . . . . . . . . . . . . 555
1.4 Mise en œuvre avec IAM externalisée. . . . . . . . . . . . . . . . . . . . . . . . . 556
1.4.1 Préparation d'une machine dans le cloud . . . . . . . . . . . . . . . . 556
1.4.2 Ajout de Docker dans Clear Linux . . . . . . . . . . . . . . . . . . . . . 559
1.4.3 Préparation de l'application Keycloak complète . . . . . . . . . . . 561
1.4.4 Passage de Keycloak en HTTPS . . . . . . . . . . . . . . . . . . . . . . . . 563
1.4.5 Ajout de la persistance pour la configuration Keycloak. . . . . 567
1.4.6 Gestion de la robustesse par un service Linux . . . . . . . . . . . . 572
1.4.7 Ajustement de l'application exemple . . . . . . . . . . . . . . . . . . . 577
1.4.8 Test final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
12 Docker
Concepts et déploiement d'applications conçues en services
Chapitre 7
Déploiement en cluster par une usine logicielle
1. Le besoin d'orchestration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
1.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
1.2 Approche théorique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
1.2.1 La problématique de montée en charge. . . . . . . . . . . . . . . . . . 636
1.2.2 La solution découplée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
1.2.3 Conséquences sur l'approche initiale. . . . . . . . . . . . . . . . . . . . 639
1.3 Lien aux microservices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
1.3.1 Orchestration des services . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
1.3.2 Elasticité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
1.3.3 Robustesse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
1.4 Fonctionnement pratique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
1.4.1 Notion de réseau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
1.4.2 Les différents types de nœuds . . . . . . . . . . . . . . . . . . . . . . . . . 643
1.4.3 Fonctionnalités du cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
2. L'approche Docker Swarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
2.1 Gestion du cluster Swarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
2.1.1 Prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
2.1.2 Alternative aux prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
2.1.3 Initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
2.1.4 Liaison des agents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
14 Docker
Concepts et déploiement d'applications conçues en services
Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Table des matières 1
Avant-propos
1. Présentation de Kubernetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
1.1 Un peu d’histoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
1.2 Qu’est-ce qu’un container ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
1.3 Les containers avant Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
1.4 Pourquoi utiliser des containers ? . . . . . . . . . . . . . . . . . . . . . . . . 45
1.5 Problèmes introduits avec les containers . . . . . . . . . . . . . . . . . . 46
1.6 À quoi va servir Kubernetes ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
1.7 Ressources externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2. Un mot sur l’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.1 Rien ne sert de courir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.2 Les douze facteurs applicatifs . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.3 Microservices vs Monolithes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Chapitre 1
Introduction
1. Cibles et objectifs de l’ouvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2. Prérequis techniques et ressources documentaires . . . . . . . . . . . . . . . 50
2.1 Prérequis techniques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.2 Ressources documentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.3 Récupération des fichiers d’exemples . . . . . . . . . . . . . . . . . . . . . 51
2 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
3. Présentation générale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.1 Prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2 Utilisation de Kubernetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.3 Installation et configuration de Kubernetes . . . . . . . . . . . . . . . . 52
3.4 Extension du cluster Kubernetes et notions avancées . . . . . . . . 53
3.5 Déploiement et intégration continue . . . . . . . . . . . . . . . . . . . . . 53
3.6 Conventions utilisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Chapitre 2
Installation de l’environnement Kubernetes
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2. Alternative à l’installation en local . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.1 Pourquoi ces alternatives ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.2 Utilisation d’un service managé . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.3 Service Katacoda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3. Mise en place de la commande kubectl. . . . . . . . . . . . . . . . . . . . . . . . 57
3.1 À quoi sert kubectl ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.2 Installation de kubectl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.2.1 Installation sous Debian/Ubuntu . . . . . . . . . . . . . . . . . . . 58
3.2.2 Installation sous CentOS/RHEL ou Fedora . . . . . . . . . . . 58
3.2.3 Installation à l’aide d’Arkade . . . . . . . . . . . . . . . . . . . . . . . 59
3.3 Vérification de l’installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.4 Configuration de l’autocomplétion. . . . . . . . . . . . . . . . . . . . . . . 62
3.4.1 Présentation du mécanisme d’autocomplétion . . . . . . . . 62
3.4.2 Fichier profile à modifier . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.4.3 Autocomplétion sur kubectl . . . . . . . . . . . . . . . . . . . . . . . 63
3.4.4 Utilisation de la variable SHELL . . . . . . . . . . . . . . . . . . . . 63
3.4.5 Mise en place d’un alias . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Table des matières 3
Chapitre 3
Tableau de bord et ligne de commande
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
2. Préambule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
2.1 Origine du nom et du logo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
2.2 Pourquoi utiliser Kubernetes ?. . . . . . . . . . . . . . . . . . . . . . . . . . . 86
2.3 Origine de Kubernetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
2.4 Fondation CNCF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
2.5 Les orchestrateurs du marché . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3. Le tableau de bord de Kubernetes (dashboard) . . . . . . . . . . . . . . . . . . 89
3.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.2 Tableau de bord Kubernetes sur service managé . . . . . . . . . . . . 89
3.3 Déploiement du dashboard sur Minikube . . . . . . . . . . . . . . . . . 89
3.4 Accès au dashboard sur Minikube . . . . . . . . . . . . . . . . . . . . . . . . 90
3.5 Structure du tableau de bord . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.6 Création d’un déploiement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
3.6.1 Un petit mot sur MailHog . . . . . . . . . . . . . . . . . . . . . . . . . 92
3.6.2 Lancement du déploiement . . . . . . . . . . . . . . . . . . . . . . . . 93
3.7 État d’un déploiement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
3.7.1 Consultation de l’état du déploiement . . . . . . . . . . . . . . . 95
3.7.2 Consultation du gestionnaire de réplicats . . . . . . . . . . . . 96
3.7.3 Consultation de l’état d’un pod. . . . . . . . . . . . . . . . . . . . . 98
3.7.4 Journal d’activité du container . . . . . . . . . . . . . . . . . . . . . 99
3.7.5 Scalabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
3.7.6 Mise à jour de l’application . . . . . . . . . . . . . . . . . . . . . . . 101
3.7.7 Pour résumer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4. Présentation de l’outil kubectl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.1 Préambule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.2 Consultation des éléments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.3 Liste des pods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Table des matières 5
Chapitre 4
Automatisation et publication d’une application
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
2. Gestion par kubectl d’une application . . . . . . . . . . . . . . . . . . . . . . . 111
2.1 Suppression d’un déploiement. . . . . . . . . . . . . . . . . . . . . . . . . . 111
2.2 Création d’un déploiement . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
2.3 État du déploiement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
2.4 Mécanisme des réplicats. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
2.4.1 Consultation des réplicats . . . . . . . . . . . . . . . . . . . . . . . . 115
2.4.2 Description des réplicats . . . . . . . . . . . . . . . . . . . . . . . . . 116
2.5 État du pod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
2.5.1 Liste des pods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
2.5.2 Détails de l’état d’un pod . . . . . . . . . . . . . . . . . . . . . . . . . 118
2.6 Accès aux logs des containers . . . . . . . . . . . . . . . . . . . . . . . . . . 120
2.7 Accéder à l’application MailHog . . . . . . . . . . . . . . . . . . . . . . . . 120
3. Exposition de services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
3.1 Pourquoi utiliser un service ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
3.2 Exposition d’un déploiement via un service . . . . . . . . . . . . . . . 123
3.3 Vérification du service mailhog . . . . . . . . . . . . . . . . . . . . . . . . . 123
3.4 Que faire en cas d’absence de shell ? . . . . . . . . . . . . . . . . . . . . . 125
3.4.1 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
3.4.2 Utilisation d’un pod éphémère . . . . . . . . . . . . . . . . . . . . 126
3.4.3 Lancement d’un pod de test. . . . . . . . . . . . . . . . . . . . . . . 127
6 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 5
Cycle de vie d’un container dans Kubernetes
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
2. Gestion des crashs d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
2.1 Consultation de l'état des pods . . . . . . . . . . . . . . . . . . . . . . . . . 156
2.2 Connexion au pod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
2.3 Container associé à MailHog . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
2.4 Comportement en cas de crash . . . . . . . . . . . . . . . . . . . . . . . . . 159
2.5 État du container après redémarrage du pod . . . . . . . . . . . . . . 160
2.6 Container vu depuis Containerd (Minikube) . . . . . . . . . . . . . . 160
2.7 Attention au nettoyage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
3. État d’un container. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
3.1 Pourquoi scruter l’état d’un container ? . . . . . . . . . . . . . . . . . . 162
3.2 Readiness vs Liveness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
3.3 Utilisation et bonne pratique. . . . . . . . . . . . . . . . . . . . . . . . . . . 164
3.4 Structure des champs de surveillance . . . . . . . . . . . . . . . . . . . . 164
3.5 Vérification de la présence d’un port. . . . . . . . . . . . . . . . . . . . . 166
3.5.1 Définition de la surveillance . . . . . . . . . . . . . . . . . . . . . . 166
3.5.2 Test d’indisponibilité sur un pod non prêt . . . . . . . . . . . 167
3.5.3 État des pods en cas d’indisponibilité . . . . . . . . . . . . . . . 168
3.5.4 Test d’indisponibilité sur un pod en mauvaise santé . . . 168
3.5.5 État des pods en cas de problème sur un pod . . . . . . . . . 169
3.5.6 Attention à la consistance des tests . . . . . . . . . . . . . . . . 169
3.5.7 Uniformisation des tests . . . . . . . . . . . . . . . . . . . . . . . . . 171
8 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 6
Persistance des données
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
2. Persistance des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
2.1 Origine du besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
2.2 Utilisation d’un volume persistant externe . . . . . . . . . . . . . . . 190
2.3 Volumes persistants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
2.3.1 Structure du volume persistant . . . . . . . . . . . . . . . . . . . . 191
2.3.2 Création du volume persistant . . . . . . . . . . . . . . . . . . . . 192
2.4 Persistance de données avec MailHog . . . . . . . . . . . . . . . . . . . . 192
2.4.1 Opérations à réaliser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
2.4.2 Déclaration de l’objet PersistentVolumeClaim . . . . . . . 193
2.4.3 État des objets de volume persistant. . . . . . . . . . . . . . . . 194
2.4.4 État de la demande de volume persistant . . . . . . . . . . . . 195
2.4.5 Déclaration du point de montage . . . . . . . . . . . . . . . . . . 195
2.4.6 Ajout d’un point de montage sur le container . . . . . . . . 196
2.4.7 Options de lancement de MailHog . . . . . . . . . . . . . . . . . 196
2.4.8 Déclaration entière suite aux modifications . . . . . . . . . . 197
2.5 Test de la persistance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
2.5.1 Installation de mhsendmail . . . . . . . . . . . . . . . . . . . . . . . 199
2.5.2 Ouverture de la communication avec le port SMTP . . . 200
2.5.3 Envoi d’un mail. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
2.5.4 Droits du répertoire de persistance des données. . . . . . . 201
2.5.5 Consultation de l’interface MailHog. . . . . . . . . . . . . . . . 202
2.5.6 Suppression des pods . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
2.5.7 Vérification du fonctionnement de la persistance . . . . . 203
3. Classes de stockage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
3.1 Origine du besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
3.2 Liste des classes de stockage. . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
3.3 Détail d’une classe de stockage . . . . . . . . . . . . . . . . . . . . . . . . . 206
3.4 Classe de stockage par défaut . . . . . . . . . . . . . . . . . . . . . . . . . . 206
10 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 7
Hébergement d’application en cluster
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
2. Déploiement d’une base de données MariaDB . . . . . . . . . . . . . . . . . 217
2.1 Origine du besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
2.2 Déploiement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
2.2.1 Choix de l’image Docker . . . . . . . . . . . . . . . . . . . . . . . . . 218
2.2.2 Version initiale du fichier de déploiement . . . . . . . . . . . 218
2.2.3 Gestion de la réentrance. . . . . . . . . . . . . . . . . . . . . . . . . . 219
2.3 Volume persistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
2.3.1 Demande de volume persistant . . . . . . . . . . . . . . . . . . . . 220
2.3.2 État de la demande de volume persistant . . . . . . . . . . . . 220
2.3.3 Ajout d’une persistance sur le container de MariaDB . . 221
2.3.4 Consultation de l'état du déploiement . . . . . . . . . . . . . . 222
2.4 Configuration de la base de données. . . . . . . . . . . . . . . . . . . . . 223
2.5 Consultation de l’état du pod . . . . . . . . . . . . . . . . . . . . . . . . . . 224
2.5.1 Liste des pods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
2.5.2 Connexion au container. . . . . . . . . . . . . . . . . . . . . . . . . . 225
2.5.3 Création de l’entrée de service . . . . . . . . . . . . . . . . . . . . . 225
Table des matières 11
Chapitre 8
Mise en place d’une réplication entre pods
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
2. Synchronisation des pods MariaDB . . . . . . . . . . . . . . . . . . . . . . . . . 246
2.1 Exposition de la problématique . . . . . . . . . . . . . . . . . . . . . . . . . 246
2.2 Principe de fonctionnement de la synchronisation . . . . . . . . . 246
2.2.1 Opérations à réaliser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
2.2.2 Nombre de réplicats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
2.3 Identifiants des serveurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
2.3.1 Connexion aux pods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
2.3.2 Connexion à la base de données . . . . . . . . . . . . . . . . . . . 247
2.3.3 Identifiants des serveurs. . . . . . . . . . . . . . . . . . . . . . . . . . 248
2.3.4 ID du maître . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
2.3.5 Création du compte de réplication sur le maître . . . . . . 249
2.3.6 Configuration de l’esclave . . . . . . . . . . . . . . . . . . . . . . . . 250
2.4 Activation de la synchronisation. . . . . . . . . . . . . . . . . . . . . . . . 250
2.4.1 Activer les journaux pour la réplication . . . . . . . . . . . . . 250
2.4.2 Commande docker-entrypoint.sh . . . . . . . . . . . . . . . . . . 251
2.4.3 Consultation de l’état du maître . . . . . . . . . . . . . . . . . . . 252
2.4.4 Configuration de l’esclave . . . . . . . . . . . . . . . . . . . . . . . . 253
2.5 Test de la réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
2.5.1 Connexion au maître . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
2.5.2 Création d’une table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
2.5.3 Connexion à l’esclave . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
3. Automatisation de la synchronisation . . . . . . . . . . . . . . . . . . . . . . . 256
3.1 Scripts de démarrage et synchronisation . . . . . . . . . . . . . . . . . 256
3.1.1 Script de démarrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
3.1.2 Configuration de la synchronisation. . . . . . . . . . . . . . . . 257
3.1.3 Scripts SQL additionnels . . . . . . . . . . . . . . . . . . . . . . . . . 258
3.1.4 Script d’arrêt de la base . . . . . . . . . . . . . . . . . . . . . . . . . . 258
3.2 Scripts et objet ConfigMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
3.3 Création du ConfigMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Table des matières 13
Chapitre 9
Gestion des briques internes de Kubernetes
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
2. Espace de noms kube-system. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
2.1 Pods présents dans l’espace de noms kube-system. . . . . . . . . . 269
2.2 CoreDNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
2.3 etcd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
2.4 Le gestionnaire de réseau Kindnet . . . . . . . . . . . . . . . . . . . . . . . 271
2.5 Le gestionnaire d’extensions de Minikube . . . . . . . . . . . . . . . . 271
2.6 Le serveur d'API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
2.7 Le proxy Kubernetes (kube-proxy) . . . . . . . . . . . . . . . . . . . . . . 272
2.8 Le gestionnaire de tâches (scheduler) . . . . . . . . . . . . . . . . . . . . 272
2.9 Le gestionnaire de contrôle (controller manager) . . . . . . . . . . . 272
2.10 Kubelet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
3. Configuration des serveurs maîtres. . . . . . . . . . . . . . . . . . . . . . . . . . 273
3.1 Principe de lancement des pods système. . . . . . . . . . . . . . . . . . 273
3.2 Contenu du répertoire /etc/kubernetes/manifests. . . . . . . . . . 273
3.3 Contenu des fichiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
14 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 10
Helm - Gestionnaire de package
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
2. Présentation de Helm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
2.1 Pourquoi faire appel à Helm ? . . . . . . . . . . . . . . . . . . . . . . . . . . 287
2.2 Principe de fonctionnement. . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Table des matières 15
Chapitre 11
Contextes et outils tiers Kubernetes
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
2. Gestion des contextes avec kubectl . . . . . . . . . . . . . . . . . . . . . . . . . . 324
2.1 Origine du besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
2.2 Lister les contextes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
2.3 Variable d’environnement KUBECONFIG . . . . . . . . . . . . . . . . 325
2.3.1 Spécifier l’emplacement du fichier . . . . . . . . . . . . . . . . . 325
2.3.2 Spécifier plusieurs fichiers . . . . . . . . . . . . . . . . . . . . . . . . 325
2.4 Changement de contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
2.5 Créer un contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
2.6 Supprimer un contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
2.7 Outils de gestion de contexte . . . . . . . . . . . . . . . . . . . . . . . . . . 328
2.7.1 Présentation de kubectx et kubens . . . . . . . . . . . . . . . . . 328
2.7.2 Installation de kubectx et kubens . . . . . . . . . . . . . . . . . . 329
2.7.3 Mise en place de l’autocomplétion . . . . . . . . . . . . . . . . . 330
2.7.4 Test des commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
2.8 Contexte dans le prompt utilisateur . . . . . . . . . . . . . . . . . . . . . 331
2.8.1 Pourquoi afficher le contexte ? . . . . . . . . . . . . . . . . . . . . 331
2.8.2 Activation à l’aide de oh-my-zsh . . . . . . . . . . . . . . . . . . . 331
2.8.3 Activation avec bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
2.8.4 Exemple d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Table des matières 17
Chapitre 12
Services managés Kubernetes
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
2. Service managé de Google : GKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
2.1 Présentation du service Google . . . . . . . . . . . . . . . . . . . . . . . . . 350
2.2 Administration depuis la console Google . . . . . . . . . . . . . . . . . 350
2.3 Installation de la commande gcloud en local . . . . . . . . . . . . . . 352
2.3.1 Installation sur Debian/Ubuntu . . . . . . . . . . . . . . . . . . . 352
2.3.2 Mise en place de l’autocomplétion . . . . . . . . . . . . . . . . . 353
2.4 Configuration de l'environnement . . . . . . . . . . . . . . . . . . . . . . 354
2.4.1 Authentification auprès de Google Cloud . . . . . . . . . . . 354
2.4.2 Projet associé avec le contexte courant . . . . . . . . . . . . . . 356
2.4.3 Activation de l’API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
2.5 Gestion du cluster GKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
2.5.1 Consultation de la liste des clusters . . . . . . . . . . . . . . . . 357
2.5.2 Versions et régions disponibles . . . . . . . . . . . . . . . . . . . . 358
2.6 Création d’un cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
2.6.1 Options de création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
2.6.2 Lancement de la création du cluster . . . . . . . . . . . . . . . . 359
2.6.3 Récupération du fichier d’accès au cluster . . . . . . . . . . . 360
2.7 Consultation du cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
2.7.1 Liste des nœuds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
2.7.2 Services démarrés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
2.8 Délégation des droits d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
2.8.1 Configuration des accès . . . . . . . . . . . . . . . . . . . . . . . . . . 363
2.8.2 Principe du mécanisme sous-jacent. . . . . . . . . . . . . . . . . 364
2.9 Suppression d’un cluster GKE . . . . . . . . . . . . . . . . . . . . . . . . . . 365
3. Service managé Microsoft Azure : AKS . . . . . . . . . . . . . . . . . . . . . . 366
3.1 Présentation du service Azure . . . . . . . . . . . . . . . . . . . . . . . . . . 366
3.2 Administration depuis la console Azure . . . . . . . . . . . . . . . . . . 366
3.2.1 Présentation de la console . . . . . . . . . . . . . . . . . . . . . . . . 366
3.2.2 Consultation du tableau de bord Kubernetes . . . . . . . . . 368
Table des matières 19
Chapitre 13
Installation de Kubernetes en interne
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
2. Installation à l’aide de Kubespray . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
2.1 Origine du besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
2.2 Pourquoi Kubespray ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
2.3 Principe de Kubespray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
2.4 Prérequis des machines à administrer avec Ansible . . . . . . . . . 411
2.4.1 Échange de clés SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
2.4.2 Escalade de droits sudo. . . . . . . . . . . . . . . . . . . . . . . . . . . 411
2.5 Structure du cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
2.5.1 Architecture du cluster Kubespray . . . . . . . . . . . . . . . . . 413
2.5.2 Groupes de machines . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
2.6 Préparation des éléments d’installation . . . . . . . . . . . . . . . . . . 414
2.6.1 Clonage du dépôt Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
2.6.2 Installation des prérequis . . . . . . . . . . . . . . . . . . . . . . . . . 414
2.7 Préparation de l’inventaire Ansible . . . . . . . . . . . . . . . . . . . . . . 415
2.7.1 Qu’est-ce qu’un inventaire ? . . . . . . . . . . . . . . . . . . . . . . 415
2.7.2 Fichier d’inventaire d’exemple . . . . . . . . . . . . . . . . . . . . . 415
2.7.3 Test de la communication Ansible/SSH . . . . . . . . . . . . . 417
2.8 Installation du cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
2.8.1 Configuration du cluster . . . . . . . . . . . . . . . . . . . . . . . . . 418
2.8.2 Lancement de l’installation . . . . . . . . . . . . . . . . . . . . . . . 419
2.8.3 Mise à jour du cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
2.9 Accès au cluster. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
2.9.1 Configuration de l’accès au cluster . . . . . . . . . . . . . . . . . 420
2.9.2 Utilisation d’un répartiteur de charge . . . . . . . . . . . . . . . 420
2.9.3 Vérification de la communication avec le cluster. . . . . . 421
22 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 14
Exposition des applications sur Internet
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
2. Gestion des entrées DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
2.1 Principe de fonctionnement. . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
2.2 Prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
2.3 Retour sur le fonctionnement du domaine DNS nip.io. . . . . . 429
2.4 Activation du service DNS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
2.4.1 Console Cloud DNS Google . . . . . . . . . . . . . . . . . . . . . . 430
2.4.2 Service DNS Zones d’Azure. . . . . . . . . . . . . . . . . . . . . . . 433
2.4.3 Service Route 53 d’AWS. . . . . . . . . . . . . . . . . . . . . . . . . . 434
2.5 Configuration DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
2.5.1 Opération à réaliser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
2.5.2 Console DNS OVH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
2.5.3 Vérification de la délégation . . . . . . . . . . . . . . . . . . . . . . 437
2.6 Gestionnaire de DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
2.6.1 Présentation de la brique external-dns . . . . . . . . . . . . . . 438
2.6.2 Création du compte d’administration DNS
de Google Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
2.6.3 Création du compte d’administration DNS
service Azure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
2.6.4 Création du compte d’administration DNS Amazon
(Route 53) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
2.6.5 Création d’un secret (Google et Azure). . . . . . . . . . . . . . 444
2.6.6 Déploiement d’external-dns . . . . . . . . . . . . . . . . . . . . . . 445
2.6.7 Vérification du fonctionnement d’external-dns. . . . . . . 447
Table des matières 23
Chapitre 15
Sécurisation : accès aux applications
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
2. Mise en place de Let’s Encrypt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
2.1 Présentation de Let’s Encrypt . . . . . . . . . . . . . . . . . . . . . . . . . . 488
2.2 Installation du chart Helm cert-manager . . . . . . . . . . . . . . . . . 488
2.2.1 Présentation du chart Helm. . . . . . . . . . . . . . . . . . . . . . . 488
2.2.2 Prérequis avant installation . . . . . . . . . . . . . . . . . . . . . . . 489
Table des matières 25
Chapitre 16
Polices réseau
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
2. Les polices réseau (network policies). . . . . . . . . . . . . . . . . . . . . . . . . 527
2.1 Présentation du mécanisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
2.2 Kubernetes Network Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
2.3 Polices réseau sur services managés et installation maison . . . 528
2.4 Installation de Calico sur Minikube . . . . . . . . . . . . . . . . . . . . . 529
2.4.1 Activation de CNI sur Minikube. . . . . . . . . . . . . . . . . . . 529
2.4.2 Installation de Calico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Table des matières 27
Chapitre 17
Montée en charge automatique
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
2. Le serveur de métriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
2.1 Présentation de la brique metrics-server . . . . . . . . . . . . . . . . . . 544
2.2 Activation du serveur de métriques. . . . . . . . . . . . . . . . . . . . . . 544
2.2.1 Vérification de la présence du serveur de métriques . . . 544
2.2.2 Activation sous Minikube . . . . . . . . . . . . . . . . . . . . . . . . 545
2.2.3 Activation sur Amazon EKS . . . . . . . . . . . . . . . . . . . . . . 545
2.3 Consultation de la consommation des pods et des nœuds . . . 546
2.3.1 État des nœuds d’un cluster. . . . . . . . . . . . . . . . . . . . . . . 546
2.3.2 État des pods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
28 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 18
Surveillance à l’aide de Prometheus
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
2. Mise en place de Prometheus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
2.1 À propos de Prometheus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
2.2 Fonctionnement de Prometheus . . . . . . . . . . . . . . . . . . . . . . . . 583
2.2.1 Architecture de Prometheus . . . . . . . . . . . . . . . . . . . . . . 583
2.2.2 Le moteur Prometheus . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
2.2.3 Les exporteurs Prometheus . . . . . . . . . . . . . . . . . . . . . . . 584
2.3 Installation de Prometheus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
2.3.1 Choix du chart Prometheus . . . . . . . . . . . . . . . . . . . . . . . 585
2.3.2 Qu’est-ce qu’un opérateur ?. . . . . . . . . . . . . . . . . . . . . . . 585
2.3.3 Déploiement de l’opérateur Prometheus. . . . . . . . . . . . . 586
2.3.4 Pods démarrés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
2.3.5 Objets déploiements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
30 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 19
Centralisation des journaux d’activité
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
2. Principe de la centralisation des journaux. . . . . . . . . . . . . . . . . . . . . 616
2.1 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
2.2 Caractéristiques de l’agent déployé . . . . . . . . . . . . . . . . . . . . . . 617
2.3 Mécanisme de centralisation des journaux. . . . . . . . . . . . . . . . 617
3. Centralisation dans le cloud. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
3.1 Centralisation à l’aide d’un service managé . . . . . . . . . . . . . . . 618
3.2 Google Stackdriver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
3.2.1 Présentation de Stackdriver . . . . . . . . . . . . . . . . . . . . . . . 618
3.2.2 Pod Fluentbit (cluster GKE) . . . . . . . . . . . . . . . . . . . . . . . 619
3.2.3 Consultation des journaux . . . . . . . . . . . . . . . . . . . . . . . 619
3.3 Azure Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
3.3.1 Présentation d'Azure Monitor . . . . . . . . . . . . . . . . . . . . . 620
3.3.2 Consultation des journaux . . . . . . . . . . . . . . . . . . . . . . . 620
3.4 Amazon Cloudwatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
3.4.1 Présentation de Cloudwatch . . . . . . . . . . . . . . . . . . . . . . 621
3.4.2 Activation de Cloudwatch sur le centre de contrôle . . . 621
3.4.3 Configuration de Cloudwatch. . . . . . . . . . . . . . . . . . . . . 623
3.4.4 Création de la police de communication
avec Cloudwatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
3.4.5 Création d’un compte et rattachement à la police. . . . . 625
3.4.6 Création d’une clé d’accès . . . . . . . . . . . . . . . . . . . . . . . . 625
3.4.7 Envoi des journaux dans Cloudwatch. . . . . . . . . . . . . . . 626
3.4.8 État des pods déployés . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
3.4.9 Consultation des journaux dans Cloudwatch . . . . . . . . 628
4. Centralisation des journaux avec Loki . . . . . . . . . . . . . . . . . . . . . . . 630
4.1 Présentation de Loki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
4.1.1 Origine de Loki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
4.1.2 Loki vs Elasticsearch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
4.1.3 Conseil d’utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
32 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 20
Maillage de services avec Istio
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
2. Présentation d'Istio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
2.1 Micro-services et mise en réseau de services . . . . . . . . . . . . . . . 648
2.2 Présentation d’Istio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Table des matières 33
Chapitre 21
Compilation et stockage d’images Docker
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
2. Création d’une image Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
2.1 Application d’exemple Flask HealthCheck . . . . . . . . . . . . . . . . 680
2.1.1 Présentation de l’application . . . . . . . . . . . . . . . . . . . . . . 680
2.1.2 Présentation des dépendances . . . . . . . . . . . . . . . . . . . . . 680
2.1.3 Description des dépendances . . . . . . . . . . . . . . . . . . . . . . 680
2.1.4 Installation des dépendances . . . . . . . . . . . . . . . . . . . . . . 681
2.1.5 Initialisation de l’application . . . . . . . . . . . . . . . . . . . . . . 681
2.1.6 Fonction racine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
2.1.7 Lancement du programme . . . . . . . . . . . . . . . . . . . . . . . . 682
2.2 Environnement de compilation . . . . . . . . . . . . . . . . . . . . . . . . . 685
2.3 Le fichier Dockerfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
2.3.1 Présentation du format . . . . . . . . . . . . . . . . . . . . . . . . . . 685
2.3.2 Création de l’image. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
2.3.3 Compilation et tag de l’image . . . . . . . . . . . . . . . . . . . . . 687
2.3.4 Authentification sur le registre d’images Docker . . . . . . 688
2.3.5 Pousser l’image sur le registre . . . . . . . . . . . . . . . . . . . . . 688
3. Image Docker multi-étape (multi-stage). . . . . . . . . . . . . . . . . . . . . . 690
3.1 Origine du besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
3.2 Exemple de compilation avec Maven . . . . . . . . . . . . . . . . . . . . 690
4. Analyse d’images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
4.1 Historique des commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
4.2 Analyse de l’image : Dive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
4.2.1 Présentation de Dive . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
4.2.2 Installation de Dive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
4.2.3 Consultation du contenu d’une image . . . . . . . . . . . . . . 692
Table des matières 35
Chapitre 22
Usine logicielle
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
2. Compilation à l’aide de GitLab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
2.1 Application à compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
2.2 Mécanisme de pipeline GitLab. . . . . . . . . . . . . . . . . . . . . . . . . . 706
2.3 Adresse et contenu du dépôt . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
2.4 Structure du fichier .gitlab-ci.yml . . . . . . . . . . . . . . . . . . . . . . . 707
2.5 Exemple de fichier .gitlab-ci.yml de compilation d’image . . . . 708
2.6 Construction d’image à l’aide de Kaniko . . . . . . . . . . . . . . . . . 710
2.7 Pour la suite. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
36 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 23
Packager son application avec Helm
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
2. Helm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738
2.1 Origine du besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738
2.2 Création d’un chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738
2.3 Contenu d’un package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
2.3.1 Structure d’un package. . . . . . . . . . . . . . . . . . . . . . . . . . . 739
2.3.2 Variables .Values, .Chart et .Release . . . . . . . . . . . . . . . . 739
2.4 Adaptation à l’application MailHog . . . . . . . . . . . . . . . . . . . . . 740
2.4.1 Résumé des travaux à réaliser . . . . . . . . . . . . . . . . . . . . . 740
2.4.2 Utilisation de l’image de MailHog. . . . . . . . . . . . . . . . . . 740
2.4.3 Correction sur les ports de service . . . . . . . . . . . . . . . . . . 740
2.4.4 Ajout d’un ConfigMap. . . . . . . . . . . . . . . . . . . . . . . . . . . 741
2.4.5 Ajout du volume persistant . . . . . . . . . . . . . . . . . . . . . . . 742
2.4.6 Montage du volume dans le container . . . . . . . . . . . . . . 743
2.4.7 Test de déploiement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
2.5 Dépendances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
2.5.1 Déclaration des dépendances . . . . . . . . . . . . . . . . . . . . . . 745
2.5.2 Récupération des dépendances . . . . . . . . . . . . . . . . . . . . 746
2.5.3 Déploiement du chart avec les dépendances. . . . . . . . . . 747
3. Template Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748
3.1 Principe de fonctionnement. . . . . . . . . . . . . . . . . . . . . . . . . . . . 748
3.2 Substitution du contenu d’une variable . . . . . . . . . . . . . . . . . . 748
3.3 Blocs conditionnels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
38 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Chapitre 24
Restriction et délégation d’accès
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
2. Mise en place de quotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 762
2.1 Origine du besoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 762
2.2 Quotas par défaut sur un espace de noms . . . . . . . . . . . . . . . . 762
2.2.1 Création d’un espace de noms . . . . . . . . . . . . . . . . . . . . . 762
2.2.2 Structure d’un objet LimitRange. . . . . . . . . . . . . . . . . . . 763
2.2.3 Exemple de définition de limitations . . . . . . . . . . . . . . . 764
Table des matières 39
Chapitre 25
Les opérateurs Kubernetes
1. Objectifs du chapitre et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . 809
2. Utilisation des opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
2.1 Présentation du principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
2.2 L’opérateur de Prometheus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
2.2.1 Retour sur le chart prometheus-operator . . . . . . . . . . . . 810
2.2.2 Structure d’un objet Prometheus . . . . . . . . . . . . . . . . . . 811
2.3 Ressources externes sur les opérateurs existants . . . . . . . . . . . 812
2.4 Présentation de l’opérateur MySQL . . . . . . . . . . . . . . . . . . . . . 813
2.4.1 Justification du choix de MySQL . . . . . . . . . . . . . . . . . . 813
2.4.2 Choix de l’opérateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
2.5 Déploiement de l’opérateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
2.6 Création d’une instance MysqlCluster . . . . . . . . . . . . . . . . . . . 815
2.6.1 Création d’un secret pour l’instance MysqlCluster . . . . 815
2.6.2 Création du cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 816
2.6.3 Problèmes de droits sur le volume persistant . . . . . . . . . 818
2.7 Objets créés au déploiement du cluster. . . . . . . . . . . . . . . . . . . 818
2.7.1 Volumes persistants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
2.7.2 Services MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
2.8 Tableau de bord de l’opérateur . . . . . . . . . . . . . . . . . . . . . . . . . 819
42 Kubernetes
Plateforme de déploiement de vos applications conteneurisées
Annexes
1. bash vs zsh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
1.1 Les shells Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
1.2 zsh et oh-my-zsh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
1.3 Tester zsh et oh-my-zsh. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
1.4 Configurer zsh comme shell pour l’utilisateur courant . . . . . . 829
2. Déploiement du tableau de bord Kubernetes . . . . . . . . . . . . . . . . . . 830
2.1 Installation du tableau de bord (application dashboard) . . . . . 830
2.2 Création du compte d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
2.3 Récupération du jeton de connexion . . . . . . . . . . . . . . . . . . . . 832
2.4 Décodage du contenu du jeton . . . . . . . . . . . . . . . . . . . . . . . . . 833
2.5 Connexion au tableau de bord. . . . . . . . . . . . . . . . . . . . . . . . . . 835
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837