Introduction à Kubernetes : L'Orchestrateur de Conteneurs
· 8 min read · Filippo Spinella
Si vous travaillez dans le monde du développement logiciel, vous avez certainement entendu parler de Kubernetes. Mais qu'est-ce que c'est exactement, et pourquoi est-il devenu la norme de facto pour la gestion des applications conteneurisées ? Ce guide vous emmènera des bases aux concepts fondamentaux, avec des exemples pratiques et des diagrammes pour vous aider à comprendre.
Avant Kubernetes : Un peu d'histoire
Pour comprendre pourquoi Kubernetes est si révolutionnaire, faisons un pas en arrière.
- Déploiement traditionnel: Au départ, les applications étaient exécutées sur des serveurs physiques. Cette approche était coûteuse, difficile à mettre à l'échelle et sujette aux conflits de ressources.
- Déploiement virtualisé: Puis sont venues les machines virtuelles (VM). Les VM ont permis d'exécuter plusieurs applications isolées sur le même matériel, améliorant l'utilisation des ressources et la sécurité. Cependant, chaque VM exécute un système d'exploitation complet, consommant beaucoup de ressources.
- Déploiement conteneurisé: Les conteneurs (comme Docker) sont l'évolution suivante. Ils partagent le même système d'exploitation hôte mais exécutent des processus isolés. Ils sont légers, rapides à démarrer et portables.
Les conteneurs ont résolu le problème de la portabilité mais en ont créé un autre : comment gérer des centaines (voire des milliers) de conteneurs dans un environnement de production ? Comment s'assurer qu'ils sont toujours en cours d'exécution, qu'ils peuvent communiquer entre eux et qu'ils s'adaptent à la charge ?
C'est là qu'intervient Kubernetes.
Qu'est-ce que Kubernetes ?
Kubernetes (souvent abrégé en K8s) est une plateforme open-source pour l'orchestration de conteneurs. En termes simples, il automatise le déploiement, la mise à l'échelle et la gestion des applications conteneurisées. Créé par Google et maintenant maintenu par la Cloud Native Computing Foundation (CNCF), Kubernetes est devenu l'outil de référence pour quiconque travaille avec des microservices à grande échelle.
L'architecture d'un cluster Kubernetes
Un environnement Kubernetes est appelé un cluster. Un cluster est composé d'un ensemble de machines, appelées nœuds, qui exécutent nos applications. L'architecture est divisée en deux parties principales : le Control Plane et les Worker Nodes.
Control Plane
Le Control Plane est le "cerveau" du cluster. Il prend des décisions globales (comme la planification) et détecte et répond aux événements du cluster. Ses principaux composants sont :
- API Server (
kube-apiserver): C'est la passerelle du cluster. Il expose l'API Kubernetes, qui est utilisée par les utilisateurs (viakubectl), les composants du cluster et les outils externes pour communiquer. - etcd: Une base de données clé-valeur cohérente et hautement disponible. Elle stocke toutes les données du cluster, représentant l'état souhaité et actuel du système.
- Scheduler (
kube-scheduler): Attribue les Pods nouvellement créés à un Worker Node disponible, en tenant compte des besoins en ressources, des politiques et d'autres contraintes. - Controller Manager (
kube-controller-manager): Exécute les contrôleurs, qui sont des boucles de contrôle qui surveillent l'état du cluster et s'efforcent de l'amener à l'état souhaité. Par exemple, leNode Controllergère les nœuds, tandis que leReplication Controllers'assure que le bon nombre de Pods est en cours d'exécution.
Worker Node
Les Worker Nodes sont les machines (physiques ou virtuelles) où les applications sont réellement exécutées. Chaque nœud est géré par le Control Plane et contient les composants suivants :
- Kubelet: Un agent qui s'exécute sur chaque nœud. Il s'assure que les conteneurs décrits dans les Pods sont en cours d'exécution et en bonne santé.
- Kube-proxy: Un proxy réseau qui gère les règles réseau sur les nœuds. Il permet la communication réseau vers les Pods depuis des sessions réseau à l'intérieur ou à l'extérieur du cluster.
- Container Runtime: Le logiciel responsable de l'exécution des conteneurs. Docker est le plus célèbre, mais Kubernetes prend également en charge d'autres runtimes comme
containerdetCRI-O.
Objets fondamentaux de Kubernetes
Dans Kubernetes, tout est représenté par des objets. Ces objets sont des "enregistrements d'intention" : une fois que vous créez un objet, Kubernetes travaille constamment pour s'assurer qu'il existe et correspond à l'état souhaité.
Voici les plus importants :
Pod
Le Pod est la plus petite unité d'exécution dans Kubernetes. Il représente un ou plusieurs conteneurs qui sont exécutés ensemble sur le même nœud, partageant des ressources comme le réseau et le stockage.
Généralement, vous n'exécutez qu'un seul conteneur par Pod, mais dans des scénarios avancés (comme les "conteneurs sidecar" pour la journalisation ou la surveillance), vous pouvez en avoir plusieurs.
Vous ne créez presque jamais de Pods directement. Vous utilisez des abstractions de plus haut niveau comme les Déploiements.
Deployment
Un Deployment est l'objet que vous utiliserez le plus souvent. Il décrit l'état souhaité pour un groupe de Pods identiques. Le contrôleur de déploiement est responsable de :
- Créer et gérer un ReplicaSet (un autre objet qui garantit qu'un nombre spécifique de répliques d'un Pod est toujours en cours d'exécution).
- Mettre à l'échelle le nombre de Pods à la hausse ou à la baisse.
- Gérer les mises à jour d'application de manière contrôlée (par ex., Rolling Update), sans temps d'arrêt.
Voici un exemple de fichier YAML pour un déploiement qui exécute 3 répliques d'un serveur NGINX :
# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
Service
Les Pods dans Kubernetes sont éphémères : ils peuvent être créés et détruits à tout moment. Chaque Pod a sa propre adresse IP, mais cette IP n'est pas stable. Alors, comment exposons-nous de manière fiable notre application ?
Avec un Service. Un Service est une abstraction qui définit un ensemble logique de Pods et une politique pour y accéder. Il fournit un point d'accès stable (une adresse IP virtuelle et un nom DNS) pour un groupe de Pods.
Le Service utilise un selector basé sur des labels pour trouver les Pods vers lesquels il doit acheminer le trafic.
Voici comment créer un Service pour notre déploiement NGINX :
# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP # Par défaut - expose le service uniquement à l'intérieur du cluster
Il existe différents types de Services :
ClusterIP: Expose le service sur une IP interne au cluster (par défaut).NodePort: Expose le service sur un port statique sur chaque Worker Node.LoadBalancer: Crée un équilibreur de charge externe dans le fournisseur de cloud (par ex., AWS, GCP) et attribue une IP publique au service.
Ingress
Un Service de type LoadBalancer est excellent, mais en créer un pour chaque service peut être coûteux. Pour exposer plusieurs services HTTP/HTTPS au monde extérieur, vous utilisez un Ingress.
Un Ingress agit comme un "routeur intelligent" pour le trafic externe. Il vous permet de définir des règles de routage basées sur l'hôte (par ex., api.monsite.com) ou le chemin (par ex., monsite.com/api).
Voici un exemple d'Ingress :
# example-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: monsite.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 8080 - path: /ui pathType: Prefix backend: service: name: ui-service port: number: 3000
Autres objets utiles
- Namespace: Vous permet de créer des "clusters virtuels" à l'intérieur d'un cluster physique. Utile pour isoler des environnements (par ex.,
development,staging,production) ou des équipes. - ConfigMap et Secret: Pour gérer les données de configuration et les secrets (comme les mots de passe ou les clés API) découplés de l'image du conteneur.
- StatefulSet: Similaire à un déploiement, mais spécifique aux applications avec état (comme les bases de données) qui nécessitent des identités réseau stables et un stockage persistant.
- PersistentVolume (PV) et PersistentVolumeClaim (PVC): Pour gérer le stockage persistant dans le cluster.
Conclusion
Kubernetes est un outil incroyablement puissant, mais sa courbe d'apprentissage peut être abrupte. Ce guide n'a fait qu'effleurer la surface, mais nous espérons qu'il vous a donné une solide-compréhension des concepts de base.
Que faire maintenant ?
- Expérimentez localement: Installez Minikube ou Kind pour créer un cluster Kubernetes sur votre ordinateur.
- Utilisez
kubectl: Familiarisez-vous avec la commandekubectl, votre principal outil pour interagir avec le cluster. Essayez de créer le déploiement NGINX et le service de cet article. - Explorez les tutoriels officiels: La documentation Kubernetes est une ressource fantastique pleine d'exemples.
L'orchestration de conteneurs est une compétence fondamentale dans le monde du cloud-native, et maîtriser Kubernetes vous ouvrira un monde de possibilités. Amusez-vous bien !