Ressources de base de Kubernetes
Mise à jour :
Dans Kubernetes, tout tourne autour des ressources. Ces objets représentent les éléments clés de votre infrastructure : vos applications, leur configuration, leur exposition au réseau et bien plus encore. Pour bien démarrer avec Kubernetes, il est indispensable de comprendre ces ressources fondamentales et leur rôle dans l’écosystème.
Dans ce guide, nous allons explorer les NameSpaces, Pods, Services, Deployments, ainsi que les ConfigMaps et Secrets. Ces ressources constituent les briques de base sur lesquelles tout est construit. En maîtrisant leur fonctionnement, vous serez capable de :
- Déployer vos applications de manière cohérente.
- Exposer vos services aux utilisateurs internes ou externes.
- Gérer les configurations et les données sensibles efficacement.
Prérequis
Avant de plonger dans ce guide, il est important de s’assurer que vous avez les bases nécessaires pour tirer le meilleur parti des concepts abordés. Voici ce qu’il faut maîtriser :
-
Connaissances en ligne de commande Linux
- Être à l’aise avec les commandes de base dans un terminal.
- Savoir naviguer dans un système de fichiers et exécuter des commandes simples.
-
Connaissances de base sur Kubernetes
- Comprendre l’architecture globale (plan de contrôle, nœuds de travail).
- Savoir ce qu’est un cluster Kubernetes et comment il fonctionne.
-
Un environnement Kubernetes opérationnel
Si ces prérequis sont en place, vous êtes prêt à démarrer ce guide et à explorer en profondeur les ressources essentielles de Kubernetes.
Les Pods : L’unité fondamentale de Kubernetes
Les pods sont au cœur de Kubernetes. Ce sont les plus petites unités déployables dans un cluster Kubernetes. Comprendre leur fonctionnement est essentiel pour maîtriser Kubernetes, car toutes les applications conteneurisées s’exécutent dans des pods.
Qu’est-ce qu’un pod
Un pod est une abstraction qui représente une ou plusieurs instances de conteneurs exécutés ensemble dans un environnement partagé. Tous les conteneurs d’un même pod partagent :
- Le réseau : Ils ont la même adresse IP et les mêmes ports.
- Le stockage : Ils peuvent partager des volumes montés dans le pod.
Cependant, chaque conteneur dans un pod reste indépendant en termes d’exécution et de ressources comme le CPU ou la mémoire.
Pourquoi utiliser des pods
-
Encapsulation des conteneurs Kubernetes ne gère pas directement les conteneurs individuels (comme ceux créés avec Docker). Au lieu de cela, il utilise les pods pour encapsuler ces conteneurs et les gérer de manière uniforme.
-
Cas d’utilisation des pods avec plusieurs conteneurs Bien que la plupart des pods contiennent un seul conteneur, il est possible d’en exécuter plusieurs dans un pod. Cela peut être utile pour des scénarios comme :
- Un conteneur principal et un conteneur d’agent chargé de collecter des logs.
- Un conteneur principal accompagné d’un conteneur proxy pour gérer les communications.
Cycle de vie des pods
Un pod a un cycle de vie bien défini :
- Pending : Le pod est en attente d’être planifié sur un nœud.
- Running : Le pod a été déployé et au moins un conteneur est en cours d’exécution.
- Succeeded : Tous les conteneurs se sont terminés avec succès.
- Failed : Un ou plusieurs conteneurs ont échoué.
- Unknown : L’état du pod ne peut pas être déterminé (généralement en raison de problèmes réseau).
Les contrôleurs Kubernetes, comme les deployments ou les ReplicaSets, surveillent constamment l’état des pods et s’assurent qu’ils sont dans l’état souhaité.
Communication entre pods
Les pods sont conçus pour communiquer entre eux via :
-
Cluster Networking Chaque pod dans un cluster Kubernetes a une adresse IP unique, ce qui facilite la communication directe entre pods.
-
Services Kubernetes Pour une communication stable entre pods, surtout lorsque des pods peuvent être redémarrés ou déplacés, les services jouent le rôle d’intermédiaire. Ils fournissent un point d’accès stable pour accéder aux pods.
Limitations des pods
-
Éphémérité Les pods sont conçus pour être temporaires. Si un pod échoue ou est supprimé, Kubernetes ne le recrée pas automatiquement (sauf s’il est géré par un deployment ou un ReplicaSet).
-
Gestion manuelle Gérer directement des pods est rarement recommandé en production. On utilise généralement des abstractions comme les deployments pour garantir la scalabilité et la résilience.
Commandes de base kubectl
Pour gérer les pods, voici quelques commandes essentielles :
-
Lister les pods du Namespace courant :
-
Lister les pods de tous les namespaces :
Exemple de sortie de la commande
kubectl get pods -A
sur un cluster kind. -
Obtenir les détails d’un pod :
-
Supprimer un pod :
-
Afficher les logs d’un pod :
Évidement, nous l’avons détruit.
Les services : Exposer et connecter vos pods
Les services sont une ressource essentielle de Kubernetes qui permet de connecter vos pods entre eux ou de les rendre accessibles à l’extérieur du cluster. Alors que les pods sont éphémères et peuvent être recréés à tout moment, les services offrent un point d’accès stable et persistent, facilitant la communication dans vos applications.
Qu’est-ce qu’un service
Un service agit comme une couche d’abstraction réseau pour un ensemble de pods. Il fournit :
- Une adresse IP et un port fixe pour accéder aux pods correspondants.
- Une méthode pour répartir le trafic (load balancing) entre plusieurs pods.
Un service sélectionne les pods à gérer à l’aide de labels et de selectors, ce qui permet de définir dynamiquement quels pods font partie du service.
Types de services
-
ClusterIP
- Par défaut, le service est uniquement accessible depuis l’intérieur du cluster.
- Idéal pour connecter des composants internes, comme un backend qui communique avec une base de données.
-
NodePort
- Permet d’exposer un service à l’extérieur du cluster via un port spécifique sur chaque nœud.
- Utile pour des tests ou des déploiements simples sans gestion avancée du trafic.
-
LoadBalancer
- Utilisé principalement dans les environnements cloud.
- Configure automatiquement un équilibrage de charge pour rendre un service accessible depuis Internet.
-
ExternalName
- Redirige les requêtes vers un nom DNS externe.
- Utile pour connecter des applications à des services externes.
Cas d’utilisation des services
-
Communication interne entre pods
- Exemple : Un frontend communique avec un backend via un service ClusterIP.
-
Accès aux applications depuis l’extérieur
- Exemple : Une API exposée à des clients via un service LoadBalancer.
-
Gestion de la persistance
- Un service garantit que même si un pod est recréé ou déplacé, l’adresse d’accès reste stable.
Fonctionnement des services
-
Découverte de service Kubernetes intègre un DNS interne qui permet aux pods de résoudre automatiquement les noms des services en adresses IP. Par exemple, un pod peut accéder à un service appelé
backend
viabackend.default.svc.cluster.local
. -
Sélection dynamique de pods Les services utilisent des labels pour déterminer quels pods sont connectés. Si un pod avec les labels correspondants est ajouté ou supprimé, le service s’adapte automatiquement.
-
Répartition du trafic Les services répartissent les requêtes entrantes entre tous les pods correspondants, assurant un équilibre de charge simple.
Commandes de base kubectl
-
Lister les services dans le cluster :
-
Obtenir les détails d’un service :
Voici une explication détaillée des informations importantes fournies par cette commande concernant le service Kubernetes kube-dns.
-
Type:
ClusterIP
Ce service est de type ClusterIP, ce qui signifie qu’il est accessible uniquement à l’intérieur du cluster via une adresse IP interne. -
Ports et targetPorts:
dns 53/UDP
Le service est accessible sur le port 53 en UDP, qui est le port standard pour les requêtes DNS.- TargetPort:
53/UDP
Le port sur lequel les pods cibles (CoreDNS) écoutent réellement pour le trafic DNS UDP.
- TargetPort:
dns-tcp 53/TCP
Même fonction que ci-dessus, mais pour les requêtes DNS utilisant TCP.- TargetPort:
53/TCP
Le port TCP correspondant sur les pods cibles.
- TargetPort:
metrics 9153/TCP
Ce port est utilisé pour exposer des métriques liées au DNS, accessibles sur le port 9153 via TCP.- TargetPort:
9153/TCP
Le port sur lequel les pods cibles exposent les métriques.
- TargetPort:
-
Endpoints:
10.244.0.4:53,10.244.0.5:53
Les adresses IP des pods cibles (CoreDNS) et les ports sur lesquels ils écoutent. Ces endpoints représentent les instances effectives du service.- Les mêmes endpoints sont exposés pour le DNS (ports 53 UDP/TCP) et pour les métriques (port 9153 TCP).
Les deployments : Gérer vos applications à grande échelle
Les deployments sont une abstraction essentielle de Kubernetes, conçue pour déployer et gérer vos pods de manière déclarative et automatisée. Ils offrent des fonctionnalités avancées comme le scaling, les mises à jour progressives et la tolérance aux pannes, simplifiant la gestion de vos applications.
Qu’est-ce qu’un deployment
Un deployment gère les pods et les ReplicaSets pour garantir que vos applications s’exécutent dans l’état souhaité. Contrairement aux pods créés directement, les pods gérés par un deployment sont automatiquement recréés ou redéployés si nécessaire.
Pourquoi utiliser un deployment
-
Automatisation des tâches complexes
- Les deployments gèrent automatiquement la création, la mise à jour et la suppression des pods.
- Ils garantissent un nombre constant de réplicas.
-
Mises à jour sans interruption
- Les rolling updates permettent de déployer une nouvelle version de votre application sans interrompre le service.
-
Revenir facilement en arrière
- Les rollbacks permettent de revenir rapidement à une version précédente en cas de problème.
Commandes de base avec kubectl
-
Créer un deployment :
-
Mettre à jour un deployment :
-
Lister les deployments :
-
Supprimer un deployment :
ConfigMaps et Secrets : Gérer les configurations et les données sensibles
Dans Kubernetes, la gestion des configurations et des données sensibles est une nécessité pour séparer le code de son environnement d’exécution. C’est ici qu’interviennent les ConfigMaps et les Secrets, deux ressources essentielles pour injecter des paramètres et des informations confidentielles dans vos pods.
Qu’est-ce qu’un ConfigMap
Un ConfigMap est une ressource qui permet de stocker des données non sensibles sous forme de paires clé-valeur. Il est utilisé pour externaliser des configurations de votre application, comme des URL d’API, des paramètres, ou des fichiers de configuration.
Qu’est-ce qu’un Secret
Un Secret est similaire à un ConfigMap, mais il est conçu pour stocker des données sensibles, comme des mots de passe, des clés API, ou des certificats. Les données dans un Secret sont encodées en Base64 et peuvent être configurées pour être mieux sécurisées.
Pourquoi utiliser ConfigMaps et Secrets
-
Séparation des préoccupations
- Le code de l’application reste identique, tandis que les paramètres et configurations spécifiques à l’environnement sont gérés séparément.
-
Flexibilité
- Les configurations peuvent être modifiées sans avoir à redéployer l’application.
-
Sécurité
- Les Secrets permettent de gérer des informations sensibles de manière plus sûre, en évitant leur inclusion dans le code ou les fichiers manifest.
Fonctionnement
-
Création
- Les ConfigMaps et Secrets sont créés comme des objets Kubernetes indépendants.
-
Injection dans les pods
- Ils peuvent être montés comme volumes, injectés comme variables d’environnement, ou utilisés directement dans des fichiers de configuration.
-
Mise à jour dynamique
- Les pods peuvent utiliser les nouvelles valeurs des ConfigMaps sans redémarrage, selon leur configuration.
Commandes de base avec kubectl
-
Créer un ConfigMap :
-
Créer un Secret :
-
Voir un ConfigMap ou un Secret :
-
Supprimer un ConfigMap ou un Secret :
Les Namespaces : Organiser et Isoler vos Ressources dans Kubernetes
Dans un cluster Kubernetes, les namespaces permettent de segmenter, organiser et isoler les ressources. Ils sont particulièrement utiles lorsque vous gérez plusieurs projets, environnements ou équipes dans un même cluster. Grâce aux namespaces, il devient plus facile de structurer et de sécuriser vos ressources.
Qu’est-ce qu’un namespace ?
Un namespace est une division logique au sein d’un cluster Kubernetes. Pensez-y comme un espace virtuel dans lequel vous pouvez créer et gérer des ressources (pods, services, configmaps, etc.). Chaque namespace est indépendant des autres, bien qu’il partage les mêmes ressources physiques (CPU, mémoire, stockage) du cluster.
Pourquoi utiliser des namespaces ?
-
Organisation Les namespaces permettent de regrouper les ressources par projet, application ou environnement (par exemple : développement, test, production).
-
Isolation Chaque namespace est isolé des autres. Les ressources d’un namespace ne peuvent pas accéder directement à celles d’un autre sans configuration explicite.
-
Gestion des quotas Kubernetes permet de définir des quotas de ressources (CPU, mémoire, etc.) au niveau des namespaces pour éviter qu’un projet ne monopolise les ressources du cluster.
-
Facilité d’administration En segmentant les ressources, il devient plus facile de gérer les permissions avec Role-Based Access Control (RBAC).
Namespaces par défaut dans Kubernetes
Lorsque vous créez un cluster Kubernetes, plusieurs namespaces sont déjà disponibles :
default
: Utilisé si aucun namespace spécifique n’est mentionné.kube-system
: Contient les composants internes du cluster (API Server, Scheduler, etc.).
Commandes de base avec kubectl
-
Lister tous les namespaces :
-
Créer un namespace :
-
Travailler dans un namespace spécifique :
-
Changer temporairement de namespace par défaut :
Mise en œuvre des ressources Kubernetes
Dans ce chapitre, nous allons explorer comment créer et gérer des ressources Kubernetes comme les pods, services, configmaps et secrets en utilisant le mode impératif. Cette approche permet de rapidement tester ou déployer des ressources sans écrire de fichiers YAML, ce qui peut être utile pour des tests ou des environnements temporaires.
Créer un pod
Lancer un pod contenant un conteneur nginx avec une commande impérative :
Vérifier que le pod a été créé :
Afficher les logs du pod pour vérifier qu’il fonctionne :
Créer un service pour exposer le pod
Exposer le pod nginx-pod via un service de type NodePort
pour le rendre
accessible localement :
Lister les services pour obtenir le port d’accès :
On recherche l’IP du node :
Tester l’accès local :
Créer un ConfigMap
Créer un ConfigMap contenant une configuration simple :
Lister les ConfigMaps pour vérifier la création :
Voir le contenu du ConfigMap :
Créer un Secret
Créer un Secret pour stocker une clé API :
Vérifier la création :
Afficher les détails encodés :
Décoder la clé pour la lire :
Limites du mode impératif
Bien que rapide et pratique pour des tests locaux, le mode impératif présente des limites importantes :
- Pas de traçabilité : Les configurations créées directement dans le terminal ne sont pas versionnées ni documentées.
- Difficulté de réplication : Reproduire une infrastructure exacte devient difficile sans un fichier YAML décrivant les ressources.
- Manque de standardisation : Il est plus difficile de collaborer ou d’automatiser les déploiements avec cette approche.
Nettoyer les ressources créées
Pour supprimer les ressources créées lors des tests en mode impératif, voici les commandes nécessaires :
Supprimer le pod nginx-pod :
Supprimer le service exposant le pod :
Supprimer le ConfigMap app-config :
Supprimer le Secret api-secret :
Pour s’assurer que toutes les ressources ont bien été supprimées, vous pouvez lister les ressources restantes :
Conclusion
Félicitations, vous avez maintenant une bonne compréhension des ressources de base dans Kubernetes : pods, services, configmaps et secrets. Ces briques essentielles forment le socle sur lequel vous pouvez construire et gérer vos applications conteneurisées.
En expérimentant avec le mode impératif, vous avez appris à rapidement déployer et manipuler ces ressources. Toutefois, nous avons également vu les limites de cette approche pour des environnements complexes ou collaboratifs. La prochaine étape naturelle est de passer au mode déclaratif en écrivant vos premiers manifests YAML.
Avec cette méthode, vous pourrez :
- Versionner vos configurations pour une meilleure traçabilité.
- Répliquer vos déploiements sur différents environnements.
- Automatiser vos workflows avec des pipelines CI/CD robustes.
Dans le prochain guide, nous aborderons l’écriture et la gestion de votre premier manifest Kubernetes, pour exploiter tout le potentiel de Kubernetes. Préparez votre éditeur de code et votre curiosité, car nous allons franchir une grosse étape vers la maîtrise de Kubernetes. 🚀