Déployer des Applications sur Kubernetes

KubernetesBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez comment déployer des applications sur un cluster Kubernetes. Nous commencerons par configurer un environnement Kubernetes à l'aide de Minikube. Ensuite, vous explorerez les commandes kubectl essentielles pour interagir avec votre cluster et gérer les ressources Kubernetes. Puis, vous créerez un fichier manifeste YAML simple, l'appliquerez à votre cluster et vérifierez l'état du déploiement. Enfin, vous apprendrez comment accéder à votre application déployée en utilisant kubectl proxy.

Ce laboratoire couvrira les compétences fondamentales de Kubernetes, y compris la configuration du cluster, la gestion de base des ressources et le déploiement d'applications. À la fin de ce laboratoire, vous aurez une solide compréhension de la manière de travailler avec Kubernetes et de déployer vos propres applications.

Démarrer le Cluster Kubernetes

Dans cette étape, nous allons démarrer un cluster Kubernetes à l'aide de Minikube. Minikube est un excellent outil pour le développement et l'apprentissage de Kubernetes car il vous permet d'exécuter un cluster Kubernetes à nœud unique dans un environnement virtualisé. Nous vérifierons ensuite que le cluster fonctionne correctement et est prêt à être utilisé.

Tout d'abord, ouvrez votre terminal. C'est là que vous taperez les commandes pour interagir avec votre ordinateur. Pour démarrer le cluster Minikube, tapez la commande suivante et appuyez sur Entrée :

minikube start

Cette commande lancera le processus de création et de démarrage de votre cluster Kubernetes. Minikube téléchargera les composants nécessaires et configurera votre cluster. Vous verrez des informations s'afficher dans votre terminal pendant que Minikube démarre. Voici un exemple de ce à quoi la sortie pourrait ressembler :

😄  minikube v1.29.0 on Ubuntu 22.04
✨  Automatically selected the docker driver
📌  Using Docker driver with root permissions
🔥  Creating kubernetes in kubernetes cluster
🔄  Restarting existing kubernetes cluster
🐳  Preparing Kubernetes v1.26.1 on Docker 20.10.23 ...
🚀  Launching Kubernetes ...
🌟  Enabling addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace

Une fois que Minikube a démarré, vérifions qu'il fonctionne et que le cluster Kubernetes est prêt. Exécutez les commandes suivantes l'une après l'autre, en appuyant sur Entrée après chaque commande :

minikube status
kubectl get nodes

La commande minikube status vous indiquera l'état de Minikube lui-même. La commande kubectl get nodes communiquera avec votre cluster Kubernetes et récupérera des informations sur les nœuds (ordinateurs) de votre cluster. Comme Minikube est un cluster à nœud unique, vous devriez voir un nœud répertorié.

Voici un exemple de la sortie que vous pourriez voir :

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   1m    v1.26.1

Analysons ce que cette sortie nous indique :

  1. Le statut minikube affiche Running pour host, kubelet et apiserver. Cela indique que les composants principaux de Minikube fonctionnent correctement.
  2. kubectl get nodes affiche un nœud nommé minikube avec un STATUS de Ready. Ready signifie que ce nœud est prêt à exécuter des applications. control-plane sous ROLES indique que ce nœud agit comme le plan de contrôle (control plane) du cluster Kubernetes, gérant et orchestrant le cluster.

Ces commandes confirment que :

  1. Minikube fonctionne dans l'environnement de machine virtuelle.
  2. Un cluster Kubernetes a été créé et configuré par Minikube.
  3. Le cluster Kubernetes est dans un état Ready et prêt à être utilisé.
  4. Vous disposez d'un cluster Kubernetes à nœud unique où le nœud minikube agit comme plan de contrôle.

Apprendre les Commandes et la Syntaxe de Base de kubectl

Dans cette étape, vous allez explorer les commandes fondamentales de kubectl. kubectl est l'outil en ligne de commande qui vous permet d'interagir avec votre cluster Kubernetes. Il est essentiel pour gérer les ressources Kubernetes. Nous allons montrer comment utiliser kubectl pour visualiser les ressources et comprendre la gestion de base des objets Kubernetes.

Commençons par explorer les espaces de noms (namespaces) au sein de votre cluster Kubernetes. Les espaces de noms sont un moyen d'organiser vos ressources Kubernetes. Par défaut, les clusters Kubernetes disposent de plusieurs espaces de noms pour les composants système et les ressources utilisateur. Pour voir une liste des espaces de noms, exécutez la commande suivante :

kubectl get namespaces

Cette commande listera tous les espaces de noms disponibles dans votre cluster. Exemple de sortie :

NAME              STATUS   AGE
default           Active   10m
kube-node-lease   Active   10m
kube-public       Active   10m
kube-system       Active   10m

Vous verrez généralement au moins ces espaces de noms par défaut :

  • default : L'espace de noms par défaut pour les ressources créées par l'utilisateur si aucun autre espace de noms n'est spécifié.
  • kube-node-lease : Utilisé pour les baux de nœuds (node leases), qui aident le plan de contrôle à suivre l'état de santé des nœuds.
  • kube-public : Destiné aux ressources qui doivent être accessibles publiquement (bien que cela soit rarement utilisé pour des informations sensibles).
  • kube-system : Contient les ressources au niveau du système, telles que les composants centraux de Kubernetes.

Ensuite, visualisons les composants système s'exécutant dans l'espace de noms kube-system. De nombreux composants centraux de Kubernetes s'exécutent sous forme de pods (pods) dans cet espace de noms. Pour visualiser les pods dans un espace de noms spécifique, utilisez l'indicateur -n ou --namespace suivi du nom de l'espace de noms. Exécutez la commande suivante pour voir les pods dans l'espace de noms kube-system :

kubectl get pods -n kube-system

Cette commande listera tous les pods s'exécutant dans l'espace de noms kube-system. Exemple de sortie :

NAME                               READY   STATUS    RESTARTS   AGE
coredns-787d4945fb-j8rhx           1/1     Running   0          15m
etcd-minikube                       1/1     Running   0          15m
kube-apiserver-minikube             1/1     Running   0          15m
kube-controller-manager-minikube    1/1     Running   0          15m
kube-proxy-xb9rz                    1/1     Running   0          15m
kube-scheduler-minikube             1/1     Running   0          15m
storage-provisioner                 1/1     Running   0          15m

Cette sortie montre les noms des pods, leur statut READY (combien de conteneurs dans le pod sont prêts sur le total), leur STATUS (par exemple, Running), le nombre de fois où ils ont été RESTARTED, et leur AGE. Ce sont les composants essentiels qui font fonctionner Kubernetes.

Maintenant, explorons quelques modèles de commandes kubectl de base. La syntaxe générale des commandes kubectl est :

kubectl [commande] [TYPE] [NOM] [indicateurs]

Décomposons cela :

  • kubectl : L'outil en ligne de commande lui-même.
  • [commande] : Spécifie l'action que vous souhaitez effectuer. Les commandes courantes incluent :
    • get : Afficher une ou plusieurs ressources.
    • describe : Afficher les détails d'une ressource spécifique.
    • create : Créer une nouvelle ressource.
    • delete : Supprimer des ressources.
    • apply : Appliquer une configuration à une ressource. Nous utiliserons beaucoup cela plus tard.
  • [TYPE] : Spécifie le type de ressource Kubernetes avec lequel vous souhaitez interagir. Les types de ressources courants incluent :
    • pods : Les plus petites unités déployables dans Kubernetes.
    • deployments : Gérer des ensembles de pods pour la mise à l'échelle et les mises à jour.
    • services : Exposer les applications s'exécutant dans les pods.
    • nodes : Les machines de travail dans votre cluster Kubernetes.
    • namespaces : Groupements logiques de ressources.
  • [NOM] : Le nom d'une ressource spécifique. Ceci est facultatif ; si vous omettez le nom, kubectl opérera sur toutes les ressources du type spécifié.
  • [indicateurs] : Indicateurs facultatifs pour modifier le comportement de la commande (par exemple, -n <namespace>, -o wide).

Voyons quelques exemples :

## Obtenir toutes les ressources dans l'espace de noms par défaut
kubectl get all

## Décrire un type de ressource spécifique (le nœud 'minikube')
kubectl describe nodes minikube

La commande kubectl get all récupérera des informations sur tous les types de ressources (services, déploiements, pods, etc.) dans l'espace de noms default. La sortie d'exemple pourrait ressembler à ceci :

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   20m

Cela montre que dans l'espace de noms default, nous avons un service nommé kubernetes.

La commande kubectl describe nodes minikube fournira de nombreuses informations détaillées sur le nœud minikube, y compris son état, sa capacité, ses adresses, et plus encore. Ceci est utile pour comprendre l'état et la configuration de vos nœuds.

Ces commandes vous aident à :

  1. Visualiser les ressources au sein de votre cluster Kubernetes.
  2. Obtenir des informations détaillées sur les composants du cluster et leur état actuel.
  3. Comprendre la structure et la syntaxe de base des commandes kubectl.

Créer un Manifest YAML Simple

Avant de créer votre premier manifest YAML, il est important de comprendre les objets Kubernetes clés avec lesquels vous allez travailler. Ces objets sont les éléments constitutifs pour gérer et orchestrer vos applications au sein de Kubernetes.

Comprendre les Objets Kubernetes

  • Pod : L'unité la plus basique dans Kubernetes. Un pod est comme une boîte qui peut contenir un ou plusieurs conteneurs. Ces conteneurs au sein d'un pod partagent le même réseau et le même stockage. Considérez un pod comme représentant une seule instance de votre application.
  • Deployment : Les Deployments sont utilisés pour gérer les pods. Ils garantissent qu'un nombre souhaité de répliques de pods sont en cours d'exécution à tout moment. Si un pod échoue, un Deployment le remplacera automatiquement. Les Deployments gèrent également les mises à jour de votre application de manière contrôlée, comme les mises à jour progressives (rolling updates).
  • Service : Les Services fournissent un moyen stable d'accéder à votre application s'exécutant dans des pods. Comme les pods peuvent être créés et détruits, leurs adresses IP peuvent changer. Un service fournit une adresse IP fixe et un nom DNS qui pointe toujours vers l'ensemble des pods qu'il gère. Cela permet à d'autres parties de votre application, ou aux utilisateurs externes, d'accéder de manière fiable à votre application sans avoir à suivre les IP des pods individuels.

Voici un diagramme pour illustrer les relations entre ces objets :

graph TD; A[Deployment] -->|Manages| B[Pods] B -->|Contains| C[Containers] B -->|Communicates via| D[Services] D -->|Exposes| E[External Clients]

Comprendre ces objets est crucial car vous définirez leur état et leur configuration souhaités à l'aide de manifests YAML.

Aperçu des Manifests YAML

Un manifest YAML dans Kubernetes est un fichier écrit au format YAML qui décrit les objets Kubernetes que vous souhaitez créer ou gérer. YAML est un langage de sérialisation de données lisible par l'homme. L'utilisation de YAML pour les manifests Kubernetes présente plusieurs avantages :

  1. Gestion Déclarative : Vous décrivez l'état souhaité de vos ressources dans le fichier YAML (par exemple, "Je veux 3 répliques de mon application en cours d'exécution"). Kubernetes s'efforce ensuite de faire correspondre l'état réel à votre état souhaité. C'est ce qu'on appelle la gestion déclarative.
  2. Contrôle de Version : Les fichiers YAML sont basés sur du texte et peuvent être facilement stockés dans des systèmes de contrôle de version comme Git. Cela vous permet de suivre les modifications apportées à vos configurations Kubernetes au fil du temps, de revenir aux configurations précédentes et de collaborer avec d'autres.
  3. Réutilisabilité et Portabilité : Vous pouvez réutiliser les manifests YAML dans différents environnements (développement, test, production) avec des modifications minimales. Cela rend vos déploiements plus cohérents et reproductibles.

Maintenant que vous comprenez les bases des objets Kubernetes et des manifests YAML, vous êtes prêt à créer votre premier manifest.

Création d'un Manifest YAML

Tout d'abord, naviguez vers le répertoire de votre projet. On suppose que vous avez un répertoire project dans votre répertoire personnel (~). Si vous ne l'avez pas, créez-le maintenant en utilisant mkdir project. Ensuite, changez votre répertoire courant vers project en utilisant cd project :

cd ~/project

Ensuite, créez un nouveau répertoire pour stocker vos manifests Kubernetes. Nommons-le k8s-manifests. Utilisez la commande mkdir pour créer le répertoire, puis cd pour y accéder :

mkdir -p k8s-manifests
cd k8s-manifests

Maintenant, vous allez créer votre premier fichier manifest YAML. Commençons par un manifest simple pour un pod NGINX. NGINX est un serveur web populaire. Nous allons créer un pod qui exécute un seul conteneur NGINX. Utilisez l'éditeur de texte nano pour créer un fichier nommé nginx-pod.yaml :

nano nginx-pod.yaml

nano est un éditeur de texte simple qui s'exécute dans votre terminal. Une fois que nano s'ouvre, collez le contenu suivant dans le fichier :

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - containerPort: 80

Comprenons chaque partie de ce manifest YAML :

  • apiVersion: v1 : Spécifie la version de l'API Kubernetes à utiliser pour créer cet objet. v1 est le groupe d'API principal et est utilisé pour les objets fondamentaux comme les pods, les services et les espaces de noms.
  • kind: Pod : Indique que vous définissez une ressource Pod.
  • metadata: : Contient des données sur le Pod, telles que son nom et ses étiquettes (labels).
    • name: nginx-pod : Définit le nom du Pod à nginx-pod. C'est ainsi que vous ferez référence à ce pod au sein de Kubernetes.
    • labels: : Les étiquettes sont des paires clé-valeur attachées aux objets. Elles sont utilisées pour organiser et sélectionner des sous-ensembles d'objets. Ici, nous ajoutons une étiquette app: nginx à ce pod.
  • spec: : Décrit l'état souhaité du Pod.
    • containers: : Une liste de conteneurs à exécuter dans le Pod. Dans ce cas, nous n'avons qu'un seul conteneur.
      • - name: nginx : Définit le nom du conteneur à nginx.
      • image: nginx:latest : Spécifie l'image de conteneur à utiliser. nginx:latest fait référence à la dernière version de l'image Docker NGINX depuis Docker Hub.
      • ports: : Une liste des ports que ce conteneur exposera.
        • - containerPort: 80 : Spécifie que le conteneur exposera le port 80. Le port 80 est le port HTTP standard.

Après avoir collé le contenu, enregistrez le fichier et quittez nano. Pour ce faire, appuyez sur Ctrl+X (quitter), puis tapez Y (oui pour enregistrer), et enfin appuyez sur Entrée pour confirmer le nom du fichier et enregistrer.

Maintenant que vous avez créé votre fichier nginx-pod.yaml, vous devez l'appliquer à votre cluster Kubernetes pour créer le pod. Utilisez la commande kubectl apply avec l'indicateur -f, qui spécifie le fichier contenant le manifest :

kubectl apply -f nginx-pod.yaml

Cette commande envoie le manifest à votre cluster Kubernetes, et Kubernetes créera le pod tel que défini. Vous devriez voir une sortie similaire à celle-ci :

pod/nginx-pod created

Pour vérifier que le pod a été créé et qu'il est en cours d'exécution, utilisez la commande kubectl get pods. Cela listera tous les pods dans l'espace de noms par défaut. Vous pouvez également utiliser kubectl describe pod nginx-pod pour obtenir des informations détaillées sur le nginx-pod. Exécutez ces commandes :

kubectl get pods
kubectl describe pod nginx-pod

Exemple de sortie pour kubectl get pods :

NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          1m

Cette sortie montre que le nginx-pod est READY (1 conteneur sur 1 est prêt) et que son STATUS est Running. Cela signifie que votre pod NGINX a été créé avec succès et est en cours d'exécution.

Maintenant, créons un manifest pour une ressource plus complexe : un Deployment. Un Deployment gérera un ensemble de pods, garantissant que le nombre souhaité de répliques est en cours d'exécution. Créez un nouveau fichier nommé nginx-deployment.yaml en utilisant nano :

nano nginx-deployment.yaml

Collez le contenu suivant dans nginx-deployment.yaml :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

Soulignons les différences clés et les nouvelles parties par rapport au manifest nginx-pod.yaml :

  • apiVersion: apps/v1 : Pour les Deployments, vous utilisez la version d'API apps/v1, qui fait partie du groupe d'API apps et gère les ressources de gestion d'applications de plus haut niveau.
  • kind: Deployment : Indique que vous définissez une ressource Deployment.
  • spec: : La section spec d'un Deployment est plus complexe car elle définit comment le Deployment doit gérer les pods.
    • replicas: 3 : Ceci est nouveau. Il spécifie que vous souhaitez que 3 répliques (copies) de votre pod soient en cours d'exécution. Le Deployment s'assurera qu'il y a toujours 3 pods correspondant aux critères définis dans le template.
    • selector: : Un sélecteur est utilisé par le Deployment pour identifier les pods qu'il doit gérer.
      • matchLabels: : Définit les étiquettes que les pods doivent avoir pour être sélectionnés par ce Deployment. Ici, il sélectionne les pods avec l'étiquette app: nginx.
    • template: : Le template définit la spécification du pod que le Deployment utilisera pour créer de nouveaux pods. C'est essentiellement la même définition de pod que dans notre exemple nginx-pod.yaml, y compris metadata.labels et spec.containers. Important : Les étiquettes définies ici dans template.metadata.labels doivent correspondre aux selector.matchLabels afin que le Deployment puisse gérer ces pods.

Enregistrez et quittez nano (Ctrl+X, Y, Entrée).

Appliquez maintenant ce manifest de Deployment à votre cluster :

kubectl apply -f nginx-deployment.yaml

Vous devriez voir une sortie comme celle-ci :

deployment.apps/nginx-deployment created

Vérifiez le Deployment et les pods qu'il a créés. Utilisez kubectl get deployments pour vérifier l'état du Deployment et kubectl get pods pour voir les pods.

kubectl get deployments
kubectl get pods

Exemple de sortie :

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           1m

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          1m
nginx-deployment-xxx-zzz            1/1     Running   0          1m
nginx-deployment-xxx-www            1/1     Running   0          1m
  • kubectl get deployments montre que le nginx-deployment a READY 3/3, UP-TO-DATE 3, et AVAILABLE 3. Cela signifie que le Deployment a créé avec succès et gère 3 pods, et qu'ils sont tous prêts et disponibles.
  • kubectl get pods liste maintenant trois pods dont les noms commencent par nginx-deployment-. Ce sont les pods créés et gérés par votre nginx-deployment.

Appliquer le Manifest YAML

Dans cette étape, vous allez explorer la commande kubectl apply plus en détail et apprendre différentes manières d'appliquer les manifests Kubernetes. En nous basant sur les fichiers YAML de l'étape précédente, nous allons démontrer diverses techniques pour appliquer les manifests.

Tout d'abord, assurez-vous d'être dans le bon répertoire :

cd ~/project/k8s-manifests

Créons un nouveau sous-répertoire pour organiser davantage nos manifests. Créez un répertoire nommé manifests et naviguez à l'intérieur :

mkdir -p manifests
cd manifests

Maintenant, créons un manifest pour une application web simple qui inclut à la fois un Deployment et un Service dans un seul fichier. Créez un nouveau fichier nommé web-app.yaml en utilisant nano :

nano web-app.yaml

Ajoutez le contenu suivant à web-app.yaml :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: nginx:alpine
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80

Ce manifest définit deux ressources Kubernetes dans un seul fichier, séparées par ---. C'est une façon courante de regrouper des ressources connexes. Décomposons ce qui est nouveau :

  • Ressources Multiples dans un Seul Fichier : Le fichier web-app.yaml contient maintenant deux définitions de ressources Kubernetes distinctes : un Deployment et un Service. Le séparateur --- est utilisé pour les distinguer.
  • kind: Service : Ceci définit une ressource Service.
    • spec.selector.app: web : Ce Service ciblera les pods qui ont l'étiquette app: web. Cela correspond aux étiquettes que nous avons définies pour les pods créés par le Deployment web-app.
    • spec.type: ClusterIP : Spécifie le type de service comme ClusterIP. Cela signifie que le service sera exposé sur une adresse IP interne au sein du cluster et est généralement utilisé pour la communication entre les services au sein du cluster.
    • spec.ports : Définit comment le service mappe les ports aux pods cibles.
      • port: 80 : Le port sur le Service lui-même auquel vous accéderez.
      • targetPort: 80 : Le port sur les pods cibles vers lequel le service redirigera le trafic.

Maintenant, appliquons ce manifest en utilisant différentes méthodes.

Méthode 1 : Appliquer le fichier entier

C'est la manière la plus courante d'appliquer un manifest. Utilisez kubectl apply -f suivi du nom du fichier :

kubectl apply -f web-app.yaml

Cette commande créera à la fois le Deployment et le Service définis dans web-app.yaml. Vous devriez voir une sortie comme celle-ci :

deployment.apps/web-app created
service/web-service created

Méthode 2 : Appliquer depuis un répertoire

Vous pouvez appliquer tous les manifests d'un répertoire en une seule fois. Si vous avez plusieurs fichiers manifest dans le répertoire manifests, vous pouvez tous les appliquer en spécifiant le répertoire au lieu d'un fichier spécifique :

kubectl apply -f .

Le . représente le répertoire courant. kubectl recherchera les fichiers YAML dans ce répertoire et les appliquera tous. Ceci est utile lorsque vous avez organisé vos manifests en plusieurs fichiers au sein d'un répertoire.

Méthode 3 : Appliquer depuis une URL (Optionnel)

kubectl apply peut également appliquer des manifests directement depuis une URL. Ceci est utile pour déployer rapidement des applications ou des configurations d'exemple hébergées en ligne. Par exemple, vous pouvez déployer le déploiement maître Redis du dépôt d'exemples Kubernetes :

kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook/redis-master-deployment.yaml

Cela téléchargera le manifest depuis l'URL et l'appliquera à votre cluster. Remarque : Soyez prudent lorsque vous appliquez des manifests provenant d'URL non fiables, car ils peuvent potentiellement modifier votre cluster.

Explorons quelques options supplémentaires pour kubectl apply.

Dry Run (Simulation)

Vous pouvez utiliser l'indicateur --dry-run=client pour simuler l'application d'un manifest sans apporter de modifications réelles au cluster. Ceci est utile pour vérifier si votre manifest est valide et pour voir quelles ressources seraient créées ou modifiées :

kubectl apply -f web-app.yaml --dry-run=client

Cette commande affichera ce qui serait créé ou modifié, mais n'appliquera pas réellement les modifications à votre cluster.

Sortie Verbeuse

Pour une sortie plus détaillée de kubectl apply, vous pouvez utiliser l'indicateur -v suivi d'un niveau de verbosité (par exemple, -v=7). Des niveaux de verbosité plus élevés fournissent des informations plus détaillées, ce qui peut être utile pour le débogage :

kubectl apply -f web-app.yaml -v=7

Cela affichera beaucoup plus d'informations sur les requêtes API effectuées et le traitement du manifest.

Vérifiez les ressources créées en appliquant web-app.yaml. Utilisez kubectl get deployments et kubectl get services pour lister les Deployments et les Services dans votre cluster :

## Lister les déploiements
kubectl get deployments

## Lister les services
kubectl get services

## Décrire le déploiement pour voir plus de détails
kubectl describe deployment web-app

Exemple de sortie pour kubectl get deployments :

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           3m33s
redis-master       0/1     1            0           23s
web-app            2/2     2            2           42s

Exemple de sortie pour kubectl get services :

NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP   8m28s
web-service   ClusterIP   10.106.220.33   <none>        80/TCP    46s

Notez que vous avez maintenant un Deployment web-app avec 2/2 répliques READY et un web-service de type ClusterIP.

Discutons brièvement de la différence entre la gestion déclarative et impérative dans Kubernetes, en particulier dans le contexte de kubectl apply et kubectl create.

  • kubectl apply : Utilise une approche déclarative. Vous définissez l'état souhaité dans vos fichiers manifest, et kubectl apply tente d'atteindre cet état. Si vous exécutez kubectl apply plusieurs fois avec le même manifest, Kubernetes n'apportera des modifications que s'il y a des différences entre l'état souhaité dans le manifest et l'état actuel dans le cluster. kubectl apply est généralement recommandé pour gérer les ressources Kubernetes car il est plus robuste et plus facile à gérer les changements au fil du temps. Il suit la configuration de vos ressources et permet des mises à jour incrémentielles.
  • kubectl create : Utilise une approche impérative. Vous donnez directement des instructions à Kubernetes pour créer une ressource. Si vous essayez d'exécuter kubectl create pour une ressource qui existe déjà, cela entraînera généralement une erreur. kubectl create est moins flexible pour gérer les mises à jour et les changements par rapport à kubectl apply.

Dans la plupart des cas, en particulier pour la gestion des déploiements d'applications, kubectl apply est la méthode préférée et recommandée en raison de sa nature déclarative et de sa meilleure gestion des mises à jour et de la configuration.

Vérifier le Statut du Déploiement

Dans cette étape, vous apprendrez comment inspecter et vérifier le statut des déploiements Kubernetes et d'autres ressources à l'aide de diverses commandes kubectl. Vous explorerez différentes manières de collecter des informations sur vos applications en cours d'exécution et leur état de santé au sein du cluster Kubernetes.

Tout d'abord, assurez-vous d'être dans le répertoire manifests de votre projet :

cd ~/project/k8s-manifests/manifests

Commençons par lister tous les déploiements dans l'espace de noms courant (qui est default sauf si vous l'avez modifié). Utilisez kubectl get deployments :

kubectl get deployments

Cette commande fournit un aperçu concis de vos déploiements. Exemple de sortie :

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           4m44s
redis-master       1/1     1            1           94s
web-app            2/2     2            2           113s

Voici ce que signifie chaque colonne :

  • NAME : Le nom du déploiement.
  • READY : Indique le nombre de répliques prêtes par rapport au nombre de répliques souhaité (par exemple, 3/3 signifie que 3 répliques souhaitées sont prêtes).
  • UP-TO-DATE : Indique combien de répliques ont été mises à jour vers le dernier état souhaité.
  • AVAILABLE : Indique combien de répliques sont actuellement disponibles pour servir le trafic.
  • AGE : Depuis combien de temps le déploiement est en cours d'exécution.

Pour obtenir des informations plus détaillées dans un format plus large, vous pouvez utiliser l'indicateur -o wide avec kubectl get deployments :

kubectl get deployments -o wide

Exemple de sortie :

NAME               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                      SELECTOR
nginx-deployment   3/3     3            3           4m58s   nginx        nginx:latest                app=nginx
redis-master       1/1     1            1           108s    master       registry.k8s.io/redis:e2e   app=redis,role=master,tier=backend
web-app            2/2     2            2           2m7s    web          nginx:alpine                app=web

La sortie -o wide inclut des colonnes supplémentaires comme CONTAINERS, IMAGES et SELECTOR, fournissant plus de contexte sur le déploiement.

Pour inspecter les pods qui font partie d'un déploiement spécifique, vous pouvez utiliser les étiquettes (labels). Rappelez-vous que dans notre manifest de Deployment web-app, nous avons défini l'étiquette app: web pour les pods. Vous pouvez utiliser cette étiquette pour filtrer les pods avec kubectl get pods -l <label_selector>. Pour voir les pods associés au déploiement web-app, exécutez :

kubectl get pods -l app=web

Exemple de sortie :

NAME                      READY   STATUS    RESTARTS   AGE
web-app-xxx-yyy           1/1     Running   0          10m
web-app-xxx-zzz           1/1     Running   0          10m

Ceci liste les pods qui correspondent au sélecteur d'étiquettes app=web, qui sont les pods gérés par le Deployment web-app.

Pour des informations approfondies sur un déploiement spécifique, utilisez kubectl describe deployment <nom_du_déploiement>. Décrivons le déploiement web-app :

kubectl describe deployment web-app

kubectl describe fournit une richesse d'informations sur le déploiement, notamment :

  • Name, Namespace, CreationTimestamp, Labels, Annotations : Métadonnées de base sur le déploiement.
  • Selector : Le sélecteur d'étiquettes utilisé pour identifier les pods gérés par ce déploiement.
  • Replicas : Nombre de répliques souhaitées, mises à jour, totales, disponibles et indisponibles.
  • StrategyType, RollingUpdateStrategy : Détails sur la stratégie de mise à jour (par exemple, RollingUpdate).
  • Pod Template : La spécification utilisée pour créer les pods pour ce déploiement.
  • Conditions : Conditions indiquant le statut du déploiement (par exemple, Available, Progressing).
  • Events : Une liste d'événements liés au déploiement, qui peuvent être utiles pour le dépannage.

Examinez les sections Conditions et Events dans la sortie de describe. Ces sections fournissent souvent des indices s'il y a des problèmes avec votre déploiement. Par exemple, si un déploiement ne devient pas Available, les Events pourraient montrer des erreurs liées au téléchargement d'images, à des échecs de création de pods, etc.

Pour vérifier le statut du Service, vous pouvez utiliser des commandes similaires. Tout d'abord, listez tous les services :

kubectl get services

Exemple de sortie :

NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP   10m
web-service   ClusterIP   10.106.220.33   <none>        80/TCP    2m47s

Ceci montre le web-service ainsi que son TYPE (ClusterIP), son CLUSTER-IP et les PORT(S) exposés.

Pour plus de détails sur un service, utilisez kubectl describe service <nom_du_service> :

kubectl describe service web-service

La sortie de describe service inclut :

  • Name, Namespace, Labels, Annotations : Métadonnées de base.
  • Selector : Le sélecteur d'étiquettes utilisé pour identifier les pods cibles.
  • Type : Le type de service (ClusterIP dans ce cas).
  • IP, IPs : L'adresse IP du cluster attribuée au service.
  • Port, TargetPort : Les mappages de ports définis pour le service.
  • Endpoints : Affiche les adresses IP et les ports des pods qui prennent actuellement en charge ce service. C'est très important. Si vous ne voyez aucun endpoint, cela signifie que le service n'est pas correctement connecté à des pods, probablement en raison d'une incohérence de sélecteur.
  • Session Affinity, Events : Autres configurations et événements du service.

Lors de la vérification du statut du déploiement, les points clés à rechercher sont :

  • Statut READY du déploiement : Assurez-vous qu'il affiche le nombre souhaité de répliques (par exemple, 2/2 pour web-app).
  • STATUS du pod : Tous les pods doivent être dans le statut Running.
  • Endpoints du Service : Vérifiez que le service a des endpoints et qu'ils correspondent aux adresses IP de vos pods en cours d'exécution. S'il n'y a pas d'endpoints, dépannez le sélecteur du service et les étiquettes des pods.
  • Rechercher les avertissements ou les erreurs : Examinez la sortie de kubectl describe deployment <nom_du_déploiement> et kubectl describe service <nom_du_service> pour toute condition ou erreur inhabituelle dans les sections Events.

En utilisant ces commandes kubectl, vous pouvez surveiller et vérifier efficacement le statut de vos déploiements et services dans Kubernetes, en vous assurant que vos applications fonctionnent comme prévu.

Accéder à l'Application via kubectl proxy

Dans cette étape, vous apprendrez comment accéder à vos applications Kubernetes en utilisant kubectl proxy. kubectl proxy crée une connexion proxy sécurisée vers le serveur API Kubernetes, vous permettant d'accéder aux services et aux pods du cluster depuis votre environnement actuel. Ceci est très utile pour le développement et le débogage, surtout lorsque vous souhaitez accéder à des services qui ne sont pas exposés extérieurement.

Tout d'abord, assurez-vous d'être dans le répertoire du projet :

cd ~/project/k8s-manifests/manifests

Démarrez kubectl proxy en arrière-plan. Cette commande exécutera le proxy dans un processus séparé, vous permettant de continuer à utiliser votre terminal.

kubectl proxy --port=8080 &

Le & à la fin de la commande l'exécute en arrière-plan. Vous devriez voir une sortie comme celle-ci :

Starting to serve on 127.0.0.1:8080

Si votre terminal semble se bloquer après avoir exécuté cette commande, vous devrez peut-être appuyer une fois sur Ctrl+C pour revenir à votre invite. Le proxy devrait toujours être en cours d'exécution en arrière-plan.

Maintenant, trouvons les noms des pods qui font partie de votre déploiement web-app. Vous pouvez à nouveau utiliser kubectl get pods -l app=web :

## Get pod names for the 'web-app'
kubectl get pods -l app=web

Exemple de sortie :

NAME                      READY   STATUS    RESTARTS   AGE
web-app-xxx-yyy           1/1     Running   0          20m
web-app-xxx-zzz           1/1     Running   0          20m

Notez le nom d'un des pods, par exemple, web-app-xxx-yyy. Vous utiliserez ce nom de pod pour construire le chemin d'API afin d'accéder au serveur web NGINX s'exécutant dans ce pod.

Les ressources API Kubernetes sont accessibles via des chemins spécifiques. Pour accéder à un pod via kubectl proxy, vous devez construire une URL comme celle-ci :

http://localhost:8080/api/v1/namespaces/<namespace>/pods/<pod_name>/proxy/

Décomposons cette URL :

  • http://localhost:8080 : L'adresse où kubectl proxy est en cours d'exécution. Par défaut, il écoute sur le port 8080 dans votre environnement actuel.
  • /api/v1 : Spécifie la version de l'API Kubernetes (v1).
  • /namespaces/<namespace> : L'espace de noms où votre pod s'exécute. Dans notre cas, c'est default.
  • /pods/<pod_name> : Le nom du pod auquel vous souhaitez accéder. Remplacez <pod_name> par le nom réel de votre pod (par exemple, web-app-xxx-yyy).
  • /proxy/ : Indique que vous souhaitez proxyfier une connexion vers le pod.

Pour faciliter l'utilisation du nom du pod dans l'URL, stockons le nom du premier pod dans une variable shell. Exécutez cette commande, qui utilise kubectl get pods et jsonpath pour extraire le nom du premier pod avec l'étiquette app=web :

## Get the name of the first pod with label 'app=web'
POD_NAME=$(kubectl get pods -l app=web -o jsonpath='{.items[0].metadata.name}')
echo $POD_NAME ## Optional: print the pod name to verify

Maintenant, vous pouvez utiliser la variable $POD_NAME dans votre commande curl pour accéder à la page par défaut de NGINX servie par votre pod. Utilisez curl pour envoyer une requête HTTP à l'URL du proxy. Remplacez ${POD_NAME} dans l'URL par la variable que nous venons de définir :

curl http://localhost:8080/api/v1/namespaces/default/pods/${POD_NAME}/proxy/

Si tout fonctionne correctement, cette commande devrait renvoyer le contenu HTML de la page de bienvenue par défaut de NGINX. L'exemple de sortie sera du contenu HTML commençant par :

<!doctype html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    ...
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    ...
  </body>
</html>

Cette sortie confirme que vous avez accédé avec succès au serveur web NGINX s'exécutant à l'intérieur de votre pod via kubectl proxy.

Explorons quelques autres choses que vous pouvez faire avec kubectl proxy.

Lister tous les pods dans l'espace de noms par défaut via le proxy :

Vous pouvez accéder directement à l'API Kubernetes via le proxy. Par exemple, pour lister tous les pods dans l'espace de noms default, vous pouvez utiliser cette URL :

curl http://localhost:8080/api/v1/namespaces/default/pods/

Ceci renverra une réponse JSON contenant des informations sur tous les pods dans l'espace de noms default.

Obtenir des informations détaillées sur un pod spécifique via le proxy :

Pour obtenir des informations détaillées sur un pod spécifique (similaire à kubectl describe pod), vous pouvez accéder directement au point d'extrémité de l'API du pod :

curl http://localhost:8080/api/v1/namespaces/default/pods/${POD_NAME}

Ceci renverra une réponse JSON avec des informations détaillées sur le pod spécifié.

Arrêter kubectl proxy :

Lorsque vous avez terminé d'utiliser kubectl proxy, vous devez l'arrêter. Comme nous l'avons démarré en arrière-plan, vous devez trouver son ID de processus (PID) et le terminer. Vous pouvez utiliser la commande jobs pour lister les processus en arrière-plan :

jobs

Ceci affichera les processus en arrière-plan exécutés depuis votre session de terminal actuelle. Vous devriez voir kubectl proxy listé. Pour l'arrêter, vous pouvez utiliser la commande kill suivie de l'ID du processus. Par exemple, si jobs affiche [1] Running kubectl proxy --port=8080 &, alors l'ID du processus est 1. Vous utiliseriez :

kill %1

Remplacez %1 par l'ID de tâche indiqué par la commande jobs. Alternativement, vous pouvez trouver l'ID du processus en utilisant ps aux | grep kubectl proxy puis utiliser kill <PID>.

Points clés à retenir concernant kubectl proxy :

  • kubectl proxy crée une connexion sécurisée et authentifiée au serveur API Kubernetes.
  • Il vous permet d'accéder aux ressources du cluster (pods, services, etc.) depuis votre environnement actuel comme si vous étiez à l'intérieur du réseau du cluster.
  • Il est très utile pour le débogage, le développement et l'exploration de l'API Kubernetes.
  • Pour des raisons de sécurité, kubectl proxy n'est accessible que sur localhost (127.0.0.1). Il n'est pas destiné à être utilisé pour exposer des services publiquement.

Résumé

Dans ce laboratoire, vous avez appris avec succès comment déployer des applications sur un cluster Kubernetes en utilisant Minikube. Vous avez commencé par configurer un cluster Kubernetes avec Minikube et vérifié son état. Vous avez ensuite exploré les commandes kubectl essentielles pour interagir avec votre cluster et gérer les ressources. Vous avez appris à lister les espaces de noms (namespaces), à obtenir des détails sur les nœuds (nodes) et les pods, et à comprendre la structure de base des commandes kubectl. Ces étapes vous ont fourni une base solide pour travailler avec Kubernetes.

Vous avez ensuite créé des manifests YAML simples pour un Pod et un Deployment, les avez appliqués à votre cluster en utilisant kubectl apply, et avez vérifié l'état du déploiement à l'aide de diverses commandes kubectl comme get et describe. Cette expérience pratique vous a permis de comprendre l'approche déclarative pour déployer des applications sur Kubernetes et comment interagir efficacement avec le cluster.

Enfin, vous avez appris à accéder à votre application déployée en utilisant kubectl proxy, qui fournit un moyen sécurisé d'interagir avec l'API de votre cluster et d'accéder aux services et aux pods depuis votre environnement actuel. C'est une technique précieuse pour le développement, le débogage et l'exploration de votre environnement Kubernetes.

En terminant ce laboratoire, vous avez acquis une expérience pratique des concepts et outils essentiels de Kubernetes, vous mettant sur la voie du déploiement et de la gestion d'applications plus complexes sur Kubernetes.