Ecrire ses Premiers Manifests Kubernetes
Mise à jour :
Kubernetes, connu pour sa puissance et sa flexibilité dans la gestion des applications conteneurisées, repose sur des fichiers YAML ou JSON pour décrire l’état souhaité des ressources déployées dans un cluster. Ces fichiers, connus sous le nom de manifests, spécifient tout, des pods simples aux déploiements plus complexes, en passant par les services, les volumes et bien plus encore. Comprendre comment écrire ces manifests est essentiel pour tirer pleinement parti de l’infrastructure cloud native offerte par Kubernetes.
Je vais donc vous guider dans le monde passionnant des manifests Kubernetes. Si vous connaissez déjà les bases de Kubernetes, vous êtes probablement conscient de l’importance des manifests dans ce système. Les manifests ne sont pas seulement le cœur de Kubernetes, ils en sont l’âme, permettant aux développeurs et aux administrateurs système de définir et de gérer leurs ressources dans l’écosystème Kubernetes de manière efficace et organisée.
Prérequis et Environnement de Travail
Avant de plonger dans la création de nos premiers manifests Kubernetes, il est essentiel de s’assurer que nous avons un environnement de travail adapté et les connaissances de base requises. Voici ce dont vous avez besoin pour suivre efficacement ce guide :
Prérequis
- Compréhension des Concepts de Base de Kubernetes : Vous devriez être familier avec les concepts fondamentaux de Kubernetes, tels que les Pods, les Services, les Déploiements et les Volumes. Une compréhension de base de l’architecture et du fonctionnement de Kubernetes facilitera grandement l’apprentissage de la rédaction de manifests.
- Connaissance de Base de YAML : Les manifests Kubernetes sont écrits en YAML (YAML Ain’t Markup Language). Une compréhension de base de la syntaxe YAML, telle que la structure des clés-valeurs, les listes et comment YAML gère les types de données, est important.
Configuration de l’Environnement
- Installation de Kubernetes : Vous avez plusieurs options pour installer Kubernetes. Si vous débutez, minkiube, k3s ou Kind sont d’excellentes solutions pour créer un cluster Kubernetes local sur votre machine.
- Outils de Ligne de Commande : Installez
kubectl,
l’outil en ligne de commande pour interagir avec votre cluster Kubernetes.
kubectl
sera votre principal outil pour appliquer les manifests, surveiller les ressources du cluster et déboguer si nécessaire. - Environnement de Développement : Un éditeur de texte fiable est indispensable pour écrire et modifier vos manifests. Des éditeurs comme Visual Studio Code offrent des extensions pour Kubernetes et YAML, facilitant la rédaction, la validation et l’autocomplétion des manifests.
Une fois que vous avez les connaissances de base et que votre environnement de développement est configuré, vous êtes prêt à commencer à écrire vos premiers manifests Kubernetes.
La Structure d’un Manifest Kubernetes
Maintenant que notre environnement de travail est prêt, plongeons dans le cœur du sujet : la structure de base d’un manifest Kubernetes. Comprendre cette structure est essentiel pour écrire des manifests efficaces et précis.
La précision est essentielle en YAML. Une indentation incorrecte ou une erreur de frappe peut entraîner des erreurs ou un comportement inattendu. Utilisez un éditeur de texte qui offre une validation YAML pour vous aider à éviter ces erreurs courantes.
Voici un exemple simple de manifest pour un Pod :
Dans cet exemple, le manifest Kubernetes comprend :
-
apiVersion
: Cette clé indique la version de l’API Kubernetes utilisée pour créer l’objet. Chaque ressource Kubernetes a uneapiVersion
spécifique, commev1
pour un Pod ouapps/v1
pour un Déploiement. -
kind
: Cette clé définit le type de l’objet que vous souhaitez créer. Exemples :Pod
,Service
,Deployment
. -
metadata
: Cette section contient des données qui aident à identifier sans équivoque l’objet, telles quename
,labels
etnamespace
. -
spec
: Le cœur du manifest. Cette section varie considérablement selon le type d’objet et contient les spécifications détaillées de l’objet, comme les conteneurs à exécuter dans un Pod ou les réplicas dans un Déploiement.
Dans cet exemple, nous définissons un Pod (kind: Pod
) avec un seul conteneur,
utilisant l’image nginx
. La section metadata
spécifie le nom du Pod et
spec
détaille les conteneurs à exécuter.
En comprenant bien la structure de base d’un manifest Kubernetes, vous posez les fondations pour créer des configurations complexes et adaptées à vos besoins. Le meilleur moyen de maîtriser la rédaction de ces manifests est de pratiquer. Commencez par des exemples simples, puis augmentez progressivement la complexité. Expérimentez avec différentes ressources Kubernetes et observez comment elles se comportent dans votre cluster.
Création des ressources simples
Créer un Namespace
Avant de créer nos premières ressources telles que des Pods ou des Déploiements, il est judicieux de commencer par définir un Namespace. Dans Kubernetes, les Namespaces permettent de segmenter les ressources du cluster en différents groupes logiques, facilitant leur gestion et leur isolation.
Créer un Namespace est une pratique courante, surtout dans des environnements partagés ou des projets complexes. Un Namespace vous permet d’organiser vos ressources, de définir des politiques de sécurité, des quotas et de faciliter la gestion des accès.
Voici comment créer un Namespace simple. Imaginons que vous travailliez sur un projet nommé “MonProjet”. Le manifest pour un Namespace pourrait ressembler à cela :
Dans cet exemple :
apiVersion: v1
est la version de l’API pour les Namespaces.kind: Namespace
spécifie que nous créons un Namespace.metadata
contient le nom du Namespace, icimonprojet
.
Enregistrez ce manifest dans un fichier, par exemple monprojet-namespace.yaml
.
Pour créer le Namespace dans votre cluster Kubernetes, utilisez la commande
suivante :
Cette commande indique à Kubernetes de créer les ressources définies dans le fichier manifest.
Pour vérifier que votre Namespace a été correctement créé, utilisez :
Vous devriez voir monprojet
listé parmi les Namespaces. Désormais, vous
pouvez créer des ressources dans ce Namespace en ajoutant namespace: monprojet
dans la section metadata
de vos manifests Kubernetes.
Bonnes Pratiques
- Utilisez des noms de Namespace descriptifs et cohérents avec les noms de vos projets ou environnements.
Création d’un Pod Simple
Après avoir créé notre Namespace, passons à la création d’une ressource de base dans Kubernetes : un Pod. Les Pods sont les éléments fondamentaux de Kubernetes, représentant une instance d’une application dans votre cluster.
Un Pod est une collection de conteneurs avec des ressources partagées et des options de déploiement spécifiques. Il sert de bloc de construction de base pour des constructions plus complexes comme les Déploiements ou les Services.
Voici un exemple de manifest pour un Pod qui exécute un simple serveur web
Nginx, dans le Namespace monprojet
que nous avons créé :
Dans cet exemple :
apiVersion: v1
indique la version de l’API pour les Pods.kind: Pod
spécifie que nous créons un Pod.metadata
contient le nom du Pod et le Namespace dans lequel il sera créé.spec
définit les spécifications du Pod, notamment les conteneurs à exécuter. Ici, nous avons un conteneur nomméconteneur-nginx
utilisant l’imagenginx
.
Pour déployer ce Pod dans le Namespace monprojet
, enregistrez le manifest dans
un fichier (par exemple, mon-pod-nginx.yaml
) et exécutez :
Une fois le Pod déployé, vous pouvez vérifier son état et ses détails avec :
et
Ces commandes fournissent des informations sur l’état du Pod, les événements liés à son cycle de vie et d’autres détails utiles.
Bonnes Pratiques
- Assurez-vous que le nom de chaque Pod est unique dans le Namespace.
Les Labels et Sélecteurs
Après avoir créé notre Namespace et déployé un Pod simple, nous allons nous concentrer sur un aspect important de Kubernetes : l’utilisation des labels et sélecteurs. Ils sont indispensables pour organiser et gérer les ressources Kubernetes de manière efficace.
Les Labels
Les labels sont des paires clé-valeur que vous attachez aux objets, comme les
Pods, pour les identifier et les organiser. Par exemple, vous pourriez étiqueter
des Pods en fonction de leur environnement (env: production
), de leur
application (app: nginx
), ou de toute autre classification pertinente pour
votre projet.
Ajouter des Labels à un Pod
Reprenons notre exemple de Pod Nginx et ajoutons-lui un label :
Ici, nous avons ajouté deux labels sous metadata
: app: nginx
et env: test
.
Appliquons-le :
Utiliser les Sélecteurs
Les sélecteurs sont utilisés pour sélectionner un ensemble de ressources en fonction de leurs labels. Ils sont essentiels dans de nombreuses opérations Kubernetes, notamment pour cibler des Pods avec des Services ou des Déploiements.
Exemple de Sélecteur
Imaginons que vous souhaitiez lister tous les Pods dans votre Namespace
monprojet
qui ont le label env: test
. Utilisez cette commande :
Avantages des Labels et Sélecteurs
- Organisation : Les labels aident à structurer vos ressources de manière intuitive.
- Flexibilité : Vous pouvez ajouter ou modifier des labels sans affecter la fonctionnalité de base de la ressource.
- Sélection Dynamique : Les sélecteurs permettent de cibler des groupes de ressources rapidement et efficacement, facilitant des opérations telles que les déploiements et les mises à jour.
Bonnes Pratiques
- Utilisez des labels clairs et cohérents pour faciliter la gestion et l’identification des ressources.
- Évitez de surcharger les ressources avec trop de labels, ce qui peut rendre la gestion plus complexe.
Les Déploiements et RéplicaSets
Après avoir exploré les labels et sélecteurs, nous allons maintenant aborder deux concepts fondamentaux dans Kubernetes : les Déploiements et les RéplicaSets. Ces objets sont importants pour le déploiement et la gestion du cycle de vie des applications conteneurisées.
Un Déploiement est une ressource de haut niveau qui gère un ensemble de répliques d’un Pod (RéplicaSets) et assure leur mise à jour de manière déclarative. Il est idéal pour déployer des applications stateless et gérer leur mise à l’échelle.
Imaginons que nous voulons déployer notre application Nginx avec trois répliques. Voici à quoi ressemblerait le manifest :
Dans cet exemple :
apiVersion: apps/v1
est la version de l’API pour les Déploiements.kind: Deployment
spécifie que nous créons un Déploiement.metadata
contient le nom et les labels du Déploiement.spec
définit les spécifications, notamment le nombre de répliques (replicas
) et le sélecteur (selector
) pour identifier les Pods à gérer.- Le
template
définit le modèle de Pod à déployer.
Créez un fichier mon-deploiement.yaml
et sauvegardez-le :
Pour vérifier que notre déploiement est opérationnel :
et :
On peut voir que lorsqu’on n’indique pas de propriété, par exemple la stratégie,
Kubernetes en applique une par défaut. Ici, on retrouve la stratégie
RollingUpdate
qui permet de déployer automatiquement une nouvelle version
d’une image tout en conservant les existantes pour qu’il n’y ait pas de coupure
de service.
Pour gérer le nombre de replicas, à la volée il faut utiliser la commande
scale
de kubectl
.
Une autre méthode via l’utilisation de la commande kubectl edit
qui permet de
modifier un manifest stocké en base.
Rechercher replicas
, elle est normalement à 1, passer le à 3 et sauvegarder
(commande vi : r et :wq )
Les RéplicaSets
Les Déploiements gèrent automatiquement les RéplicaSets, qui à leur tour, assurent qu’un nombre spécifié de répliques de Pod sont en cours d’exécution à tout moment. Si un Pod tombe en panne, le RéplicaSet crée automatiquement un nouveau Pod pour le remplacer.
Avantages des Déploiements
- Mises à jour Automatisées : Les Déploiements facilitent la mise à jour des Pods et leur remplacement sans temps d’arrêt.
- Gestion de la Disponibilité : Ils garantissent que votre application est toujours en cours d’exécution avec le nombre de répliques souhaité.
- Rétrogradation Facile : En cas de problème avec une nouvelle version, les Déploiements permettent un retour en arrière facile.
Les Services
Après avoir abordé les deployments, explorons maintenant comment exposer nos applications Kubernetes à l’extérieur ou à d’autres services au sein du cluster. Pour cela, nous utilisons une ressource appelée Service.
Un Service dans Kubernetes est une abstraction qui définit un ensemble logique de Pods et une politique d’accès à ces Pods. Les Services permettent de communiquer avec un ou plusieurs Pods, souvent à travers un réseau.
Il existe plusieurs types de Services dans Kubernetes, mais les plus courants sont :
- ClusterIP : Expose le service sur une adresse IP interne dans le cluster. C’est le type par défaut et permet aux services de communiquer entre eux dans le cluster.
- NodePort : Expose le service sur le même port de chaque nœud
sélectionné du cluster. Permet l’accès depuis l’extérieur du cluster en
utilisant
<NodeIP>:<NodePort>
. - LoadBalancer : Utilisé avec les solutions de cloud externe. Expose le service à l’extérieur du cluster en assignant un équilibreur de charge externe.
Prenons l’exemple d’un Service de type NodePort pour exposer notre application Nginx :
Dans cet exemple :
apiVersion: v1
est la version de l’API pour les Services.kind: Service
indique que nous créons un Service.metadata
contient le nom du Service.spec
définit les spécifications du Service, y compris le type, le sélecteur pour trouver les Pods à exposer et les ports.
Vérifions si le service est correctement créé :
Une fois le Service déployé, vous pouvez accéder à votre application Nginx en
utilisant l’adresse IP de n’importe quel nœud du cluster suivi du nodePort
spécifié. Par exemple, http://localhost:30007
dans notre cas. Vérifions :
Nickel !
Bonnes Pratiques
- Choisissez le type de Service approprié en fonction de vos besoins d’exposition et de communication.
- Assurez-vous que les ports et les sélecteurs sont correctement configurés pour diriger le trafic vers les bons Pods.
ConfigMaps et Secrets
Après avoir couvert les bases des déploiements et services, il est temps de s’intéresser à la gestion des configurations et des données sensibles dans Kubernetes. Pour cela, nous utilisons deux types de ressources : ConfigMaps et Secrets.
Les ConfigMaps
Les ConfigMaps sont utilisées pour stocker des informations de configuration non sensibles, telles que des fichiers de configuration, des variables d’environnement, des propriétés de configuration, etc.
Voici un exemple simple de ConfigMap contenant des paramètres de configuration :
Dans cet exemple, la ConfigMap exemple-configmap
stocke des paramètres au
format JSON.
Vous pouvez référencer cette ConfigMap dans vos Pods, par exemple pour définir des variables d’environnement :
Les Secrets
Les Secrets sont similaires aux ConfigMaps mais sont destinés à contenir des données sensibles, telles que des mots de passe, des jetons OAuth, des clés SSH, etc.
Voici comment créer un Secret :
Vous pouvez utiliser ce Secret dans un Pod, par exemple comme variable d’environnement :
Appliquons le :
Vérifions :
Notre secret est bien gardé !
Bonnes Pratiques
- Utilisez des ConfigMaps pour les configurations générales et des Secrets pour les informations sensibles.
- Ne stockez pas de données sensibles en texte clair dans vos manifests ou ConfigMaps.
- Utilisez des références aux ConfigMaps et Secrets dans vos Pods plutôt que de coder en dur des configurations ou des secrets.
Détruire une ressource Kubernetes
Pour détruire une ressource, on utilise la commande delete <type> <nom de leressource>
.
Pour détruire un objet qui a été déclaré avec un manifest :
Attention si on détruit un namespace tous les objets de ce NameSpace le seront également et cela prend du temps !
Conclusion
En parcourant les divers aspects de Kubernetes, de la création de votre premier Namespace à la gestion des configurations avec ConfigMaps et Secrets, en passant par les Déploiements et les Services, nous avons couvert quelqu’uns des objets clés de cet orchestrateur de conteneurs.
Kubernetes, avec son architecture robuste et ses concepts avancés, peut sembler intimidant au premier abord. Cependant, en décomposant son apprentissage en composants gérables et en pratiquant avec des exemples concrets, comme nous l’avons fait dans ce guide, vous pourrez progesser.
Rappelez-vous que la pratique régulière, la veille technologique et la participation à la communauté sont des pratiques clés pour rester compétent sur Kubernetes. N’oubliez pas non plus de toujours suivre les meilleures pratiques et d’éviter les erreurs courantes pour maintenir vos clusters Kubernetes performants, sécurisés et bien organisés.
Plus d’infos
Pour approfondir vos connaissances en Kubernetes et rester à jour avec les meilleures pratiques, il est important de disposer des bonnes ressources.
- Site Officiel Kubernetes (kubernetes.io ↗): La source la plus complète et à jour pour tout ce qui concerne Kubernetes.
- Documentation Kubernetes (kubernetes.io/docs ↗): Pour des guides détaillés, des tutoriels et la documentation de référence.
- GitHub Kubernetes (github.com/kubernetes/kubernetes ↗): Pour explorer le code source et suivre les développements récents.