Comprendre et Gérer les Déploiements Kubernetes
Kubernetes s’impose comme une plateforme d’orchestration de premier plan pour l’automatisation du déploiement, de la mise à l’échelle et de la gestion des applications conteneurisées sur un ensemble d’hôtes ou de nœuds.
Cet article se penche sur un élément crucial de Kubernetes : le déploiement. Nous explorerons son fonctionnement, ainsi que les méthodes pour le créer, le mettre à jour et le supprimer.
Qu’est-ce qu’un Déploiement ?
Un déploiement représente un type d’objet utilisé pour le lancement de pods. Les pratiques recommandées de Kubernetes encouragent l’usage de déploiements pour les applications sans état. En l’absence de déploiement, il serait nécessaire de créer, mettre à jour et supprimer manuellement plusieurs pods, ce qui s’avérerait complexe et impossible à gérer à grande échelle.
Un déploiement se définit par un unique objet YAML qui non seulement crée les pods, mais veille également à leur maintien en fonctionnement et à leur mise à jour. Il facilite également la mise à l’échelle automatique de vos applications dans Kubernetes. Ainsi, le déploiement sert à adapter, déployer et restaurer des versions de vos applications dans des pods.
Un déploiement communique à Kubernetes le nombre de copies d’un pod à exécuter, Kubernetes se chargeant du reste. Lors de la création d’un déploiement, le contrôleur associé génère un ReplicaSet à partir de la configuration. Le contrôleur lié au ReplicaSet, quant à lui, crée une série de pods à partir de la configuration du ReplicaSet.
Les avantages de l’emploi d’un déploiement au lieu de la création directe d’un ReplicaSet sont :
- Mémorisation des versions : chaque modification de l’objet (par « apply » ou « edit ») crée une sauvegarde de la version précédente.
- Gestion du déploiement et de la restauration : il est possible de revenir à une configuration antérieure grâce au point précédent.
Création d’un Déploiement
Deux approches sont possibles pour créer un déploiement Kubernetes :
Méthode Impérative
Les API de Kubernetes autorisent une approche plus directe, impérative, sans nécessité de fichiers de configuration ou de manifestes YAML. Avec cette méthode, il suffit d’indiquer ce que vous souhaitez faire, Kubernetes s’occupant de définir les étapes pour atteindre le résultat attendu.
Pour utiliser cette méthode, la commande à exécuter est la suivante :
kubectl create deployment nginx-deployment --image nginx --port=80
Méthode Déclarative
Dans cette approche, vous devez déclarer tous les paramètres. Kubernetes lit ces définitions et crée le déploiement exactement tel que défini.
Pour un déploiement déclaratif, il est nécessaire de créer un fichier YAML.
Voici un exemple de fichier YAML nommé `new_deployment.yaml` :
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
#Indique le nombre de copies de Pod
replicas: 3
#Sélectionne le Pod géré par le déploiement
selector:
#Associe les étiquettes définies
matchLabels:
deploy: example
template:
metadata:
#Indique les étiquettes du Pod
labels:
deploy: example
spec:
containers:
- name: nginx
image: nginx:1.20.2
Dans ce fichier YAML, après avoir spécifié la version de l’API Kubernetes, le type d’objet et le nom du déploiement, on retrouve la section `spec`. Dans cette section, la clé `replicas` définit le nombre d’instances de pod que le déploiement doit maintenir actives.
Un sélecteur est utilisé pour identifier les pods dans le déploiement. L’étiquette de déploiement permet de regrouper les pods correspondant à ces étiquettes dans le déploiement.
Ensuite, on trouve l’objet `template`, qui inclut un modèle de pod. Le déploiement crée les pods en utilisant ce modèle. La spécification d’un pod standard se trouve sous la clé `template`.
Ce déploiement déploie des images Nginx sur les pods en utilisant les étiquettes définies. Le Pod représente l’unité de mise à l’échelle dans Kubernetes, il est donc crucial de bien réfléchir au modèle lors de la mise en place de plusieurs conteneurs dans le même Pod.
Pour appliquer le fichier YAML `new_deployment.yaml`, utilisez la commande suivante :
kubectl apply -f new_deployment.yaml
Après quelques instants, l’état du déploiement peut être consulté via :
kubectl get all
Récupérer et Mettre à Jour le Déploiement
Notez que la création du déploiement a également généré les pods et un ReplicaSet. Un déploiement gère toujours un ReplicaSet. Pour obtenir des informations détaillées sur le déploiement, vous pouvez utiliser la commande :
kubectl describe deployment nginx-deployment
Cette commande fournit une description complète du déploiement, y compris la stratégie de mise à jour utilisée, définie ici comme `RollingUpdate`.
La stratégie `RollingUpdate` permet une migration progressive d’une version d’application vers une version plus récente. C’est la stratégie par défaut dans Kubernetes.
En plus de cette stratégie, on trouve :
- `Recreate` : arrête les instances de pod existantes et les recrée avec la nouvelle version.
- `Bleu/Vert` : crée deux environnements identiques distincts. L’application s’exécute dans l’environnement bleu, tandis que l’environnement vert est utilisé pour la nouvelle version.
- `Canary` : une stratégie de déploiement impliquant un sous-ensemble d’utilisateurs dans la version incrémentale d’une application ou d’un service.
Pour la stratégie `RollingUpdate`, le comportement peut être configuré en termes de nombre de répliques :
- `maxSurge` indique le nombre maximal de pods à créer en plus du nombre de réplicas actuel (en pourcentage ou en valeur absolue).
- `maxUnavailable` indique le nombre maximal de pods pouvant être indisponibles durant la mise à jour (en pourcentage ou en valeur absolue).
Ces paramètres permettent d’ajuster la QoS et la vitesse de déploiement en fonction de l’application et de l’autoscaler.
Pour redimensionner les pods à 10 et modifier l’étiquette de l’image Nginx pour la version la plus récente, utilisez :
kubectl scale deployment nginx-deployment --replicas=10

Notez que 5 conteneurs sont en cours de création et que, sur les 10 Pods, 5 sont disponibles.
Après quelques secondes, pour vérifier l’état, utilisez :
kubectl get all
Tous les pods ont été créés et les conteneurs sont en cours d’exécution.

Supprimer votre Déploiement
Pour supprimer un déploiement Kubernetes, utilisez l’une des commandes suivantes :
kubectl delete deploy nginx-deployment kubectl delete -f new_deployment.yaml
Helm : Simplifier les Déploiements
Pour le déploiement d’applications complexes utilisant de nombreuses ressources Kubernetes, l’outil `kubectl` peut s’avérer insuffisant. C’est pourquoi l’outil Helm a été créé. Helm est un gestionnaire de paquets pour Kubernetes qui se base sur `kubectl` et simplifie les déploiements d’applications.
Dans le vocabulaire Helm, une application est une *release*. Elle est associée à un *chart*, c’est-à-dire un ensemble de fichiers de configuration YAML contenant des variables globales et des templates décrivant les ressources Kubernetes.
Conclusion
Le déploiement est un objet Kubernetes fondamental. Sa configuration doit être effectuée avec précaution afin d’éviter des comportements inattendus. Pour une configuration avancée, référez-vous à la documentation Kubernetes.
Pour approfondir vos connaissances, explorez les tutoriels Kubernetes disponibles pour devenir un expert.