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 Controller
gĂšre les nĆuds, tandis que leReplication Controller
s'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
containerd
etCRI-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 !