Déployer des applications sur Kubernetes

KubernetesKubernetesBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

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

Ce laboratoire couvrira les compétences de base en matière de Kubernetes, notamment la configuration du cluster, la gestion de base des ressources et le déploiement d'applications. À la fin de ce laboratoire, vous aurez une bonne compréhension de la façon de travailler avec Kubernetes et de déployer vos propres applications.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/proxy("Proxy") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/version("Version") subgraph Lab Skills kubernetes/get -.-> lab-434644{{"Déployer des applications sur Kubernetes"}} kubernetes/create -.-> lab-434644{{"Déployer des applications sur Kubernetes"}} kubernetes/apply -.-> lab-434644{{"Déployer des applications sur Kubernetes"}} kubernetes/describe -.-> lab-434644{{"Déployer des applications sur Kubernetes"}} kubernetes/proxy -.-> lab-434644{{"Déployer des applications sur Kubernetes"}} kubernetes/version -.-> lab-434644{{"Déployer des applications sur Kubernetes"}} end

Démarrer le cluster Kubernetes

Dans cette étape, nous allons démarrer un cluster Kubernetes local en utilisant 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 mono - noeud sur votre machine locale. 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 local. Minikube téléchargera les composants nécessaires et configurera votre cluster. Vous verrez des informations s'afficher dans votre terminal pendant le démarrage de Minikube. Voici un exemple de ce à quoi l'affichage 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 à l'intérieur de Minikube 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 noeuds (ordinateurs) de votre cluster. Étant donné que Minikube est un cluster mono - noeud, vous devriez voir un seul noeud répertorié.

Voici un exemple de ce à quoi l'affichage pourrait ressembler :

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 cet affichage nous indique :

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

Ces commandes confirment que :

  1. Minikube est en cours d'exécution sur votre machine.
  2. Un cluster Kubernetes local a été créé à l'intérieur de Minikube.
  3. Le cluster Kubernetes est dans un état Ready et est prêt à être utilisé.
  4. Vous avez un cluster Kubernetes mono - noeud où le noeud minikube agit comme le plan de contrôle.

Apprendre les commandes et la syntaxe de base de kubectl

Dans cette étape, vous allez explorer les commandes de base 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 afficher les ressources et comprendre la gestion de base des objets Kubernetes.

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

kubectl get namespaces

Cette commande affichera 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 bail (leases) des nœuds, qui aident le plan de contrôle à suivre l'état de santé des nœuds.
  • kube-public : Prévu pour les ressources qui devraient être publiquement accessibles (bien que cela soit rarement utilisé pour des informations sensibles).
  • kube-system : Contient les ressources de niveau système, telles que les composants principaux de Kubernetes.

Ensuite, affichons les composants système en cours d'exécution dans l'espace de noms kube-system. De nombreux composants principaux de Kubernetes s'exécutent sous forme de pods dans cet espace de noms. Pour afficher les pods dans un espace de noms spécifique, utilisez le drapeau -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 affichera tous les pods en cours d'exécution 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), combien de fois ils ont été RESTARTED et leur AGE. Ce sont les composants essentiels qui font fonctionner Kubernetes.

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

kubectl [command] [TYPE] [NAME] [flags]

Analysons cela :

  • kubectl : L'outil en ligne de commande lui-même.
  • [command] : 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 l'utiliserons beaucoup plus tard.
  • [TYPE] : Spécifie le type de ressource Kubernetes avec lequel vous souhaitez interagir. Les types de ressources courants incluent :
    • pods : Les unités déployables les plus petites dans Kubernetes.
    • deployments : Gérer des ensembles de pods pour la mise à l'échelle et les mises à jour.
    • services : Exposer les applications en cours d'exécution dans les pods.
    • nodes : Les machines de travail dans votre cluster Kubernetes.
    • namespaces : Groupements logiques de ressources.
  • [NAME] : 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é.
  • [flags] : Drapeaux 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. Un exemple de sortie 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 statut, sa capacité, ses adresses, etc. Cela est utile pour comprendre l'état et la configuration de vos nœuds.

Ces commandes vous aident à :

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

Créer un manifeste YAML simple

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

Comprendre les objets Kubernetes

  • Pod : L'unité la plus de base 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. Imaginez un pod comme représentant une instance unique de votre application.
  • Deployment : Les déploiements sont utilisés pour gérer les pods. Ils garantissent qu'un nombre souhaité de réplicas de pods sont toujours en cours d'exécution. Si un pod échoue, un déploiement le remplacera automatiquement. Les déploiements gèrent également les mises à jour de votre application de manière contrôlée, comme les mises à jour incrémentielles (rolling updates).
  • Service : Les services fournissent un moyen stable d'accéder à votre application en cours d'exécution dans les pods. Étant donné que 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 à des utilisateurs externes, d'accéder de manière fiable à votre application sans avoir à suivre les adresses 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 allez définir leur état et leur configuration souhaités à l'aide de manifestes YAML.

Aperçu des manifestes YAML

Un manifeste 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 manifestes 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 que 3 réplicas de mon application soient en cours d'exécution"). Kubernetes travaille ensuite pour faire correspondre l'état réel à l'état souhaité. Cela s'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 à des configurations précédentes et de collaborer avec d'autres personnes.
  3. Réutilisabilité et portabilité : Vous pouvez réutiliser les manifestes 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 manifestes YAML, vous êtes prêt à créer votre premier manifeste.

Créer un manifeste YAML

Tout d'abord, accédez à votre répertoire de 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 actuel pour project en utilisant cd project :

cd ~/project

Ensuite, créez un nouveau répertoire pour stocker vos manifestes Kubernetes. Appelons - 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 de manifeste YAML. Commençons par un manifeste 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 est ouvert, 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 manifeste YAML :

  • apiVersion: v1 : Spécifie la version de l'API Kubernetes à utiliser pour créer cet objet. v1 est le groupe d'API de base et est utilisé pour les objets fondamentaux tels que les pods, les services et les espaces de noms.
  • kind: Pod : Indique que vous définissez une ressource de type Pod.
  • metadata: : Contient des données sur le Pod, telles que son nom et ses étiquettes.
    • name: nginx - pod : Définit le nom du Pod sur nginx - pod. C'est ainsi que vous vous référerez à ce pod au sein de Kubernetes.
    • labels: : Les étiquettes sont des paires clé - valeur qui sont 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 au sein du Pod. Dans ce cas, nous n'avons qu'un seul conteneur.
      • - name: nginx : Définit le nom du conteneur sur 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 sur Docker Hub.
      • ports: : Une liste de 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 Enter 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 le drapeau -f, qui spécifie le fichier contenant le manifeste :

kubectl apply -f nginx-pod.yaml

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

pod/nginx-pod created

Pour vérifier que le pod a été créé et est en cours d'exécution, utilisez la commande kubectl get pods. Cela affichera 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 manifeste pour une ressource plus complexe : un Deployment. Un Deployment gérera un ensemble de pods, en s'assurant que le nombre souhaité de réplicas 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

Mettons en évidence les principales différences et les nouvelles parties par rapport au manifeste nginx - pod.yaml :

  • apiVersion: apps/v1 : Pour les Deployments, vous utilisez la version apps/v1 de l'API, qui fait partie du groupe d'API apps et gère les ressources de gestion d'applications de niveau supérieur.
  • kind: Deployment : Indique que vous définissez une ressource de type Deployment.
  • spec: : La section spec pour un Deployment est plus complexe car elle définit comment le Deployment doit gérer les pods.
    • replicas: 3 : C'est nouveau. Il spécifie que vous souhaitez que 3 réplicas (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 quels pods 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 à selector.matchLabels afin que le Deployment puisse gérer ces pods.

Enregistrez et quittez nano (Ctrl+X, Y, Enter).

Maintenant, appliquez ce manifeste de Deployment à votre cluster :

kubectl apply -f nginx-deployment.yaml

Vous devriez voir une sortie comme :

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 que tous sont 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 manifeste YAML

Dans cette étape, vous allez explorer plus en détail la commande kubectl apply et apprendre différentes façons d'appliquer des manifestes Kubernetes. En vous appuyant sur les fichiers YAML de l'étape précédente, nous allons démontrer diverses techniques pour appliquer des manifestes.

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

cd ~/project/k8s-manifests

Créons un nouveau sous - répertoire pour organiser davantage nos manifestes. Créez un répertoire nommé manifests et accédez - y :

mkdir -p manifests
cd manifests

Maintenant, créons un manifeste 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 manifeste définit deux ressources Kubernetes dans un seul fichier, séparées par ---. C'est une façon courante de regrouper des ressources liées. Analysons ce qui est nouveau :

  • Plusieurs ressources 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 : Cela définit une ressource de type 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 auquel le service redirigera le trafic.

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

Méthode 1 : Appliquer le fichier entier

C'est la façon la plus courante d'appliquer un manifeste. 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 :

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

Méthode 2 : Appliquer depuis un répertoire

Vous pouvez appliquer tous les manifestes d'un répertoire d'un coup. Si vous avez plusieurs fichiers de manifeste dans le répertoire manifests, vous pouvez les appliquer tous en spécifiant le répertoire au lieu d'un fichier spécifique :

kubectl apply -f.

Le . représente le répertoire actuel. kubectl cherchera les fichiers YAML dans ce répertoire et les appliquera tous. Cela est utile lorsque vous avez organisé vos manifestes en plusieurs fichiers au sein d'un répertoire.

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

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

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

Cela téléchargera le manifeste depuis l'URL et l'appliquera à votre cluster. Notez : Soyez prudent lorsque vous appliquez des manifestes depuis des URL non fiables car ils peuvent potentiellement modifier votre cluster.

Explorons quelques options supplémentaires pour kubectl apply.

Exécution simulée (Dry Run)

Vous pouvez utiliser le drapeau --dry - run=client pour simuler l'application d'un manifeste sans modifier réellement le cluster. Cela est utile pour vérifier si votre manifeste 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 elle n'appliquera pas réellement les modifications à votre cluster.

Sortie détaillée

Pour obtenir une sortie plus détaillée de kubectl apply, vous pouvez utiliser le drapeau -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 manifeste.

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éplicas 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, notamment 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 de manifeste, et kubectl apply tente d'atteindre cet état. Si vous exécutez kubectl apply plusieurs fois avec le même manifeste, Kubernetes ne fera des modifications que s'il y a des différences entre l'état souhaité dans le manifeste 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 modifications 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 instruisez directement Kubernetes de 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 modifications que kubectl apply.

Dans la plupart des cas, notamment pour gérer les 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 l'état du déploiement

Dans cette étape, vous allez apprendre à inspecter et vérifier l'état des déploiements Kubernetes et d'autres ressources à l'aide de diverses commandes kubectl. Vous allez explorer différentes façons 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 que vous êtes 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 actuel (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 : Affiche le nombre de réplicas prêts par rapport au nombre de réplicas souhaité (par exemple, 3/3 signifie que 3 réplicas souhaités sont prêts).
  • UP-TO-DATE : Indique combien de réplicas ont été mis à jour à l'état souhaité le plus récent.
  • AVAILABLE : Affiche combien de réplicas 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 le drapeau -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 telles que 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 manifeste de déploiement web - app, nous avons défini l'étiquette app: web pour les pods. Vous pouvez utiliser cette étiquette pour filtrer les pods en utilisant 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

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

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

kubectl describe deployment web-app

kubectl describe fournit une foule 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éplicas souhaités, mis à jour, au total, 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 l'état du déploiement (par exemple, Available, Progressing).
  • Events : Une liste d'événements liés au déploiement, qui peut être utile pour le dépannage.

Regardez 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 n'est pas Available, les Events peuvent montrer des erreurs liées au téléchargement de l'image, aux échecs de création de pods, etc.

Pour vérifier l'état du Service, vous pouvez utiliser des commandes similaires. Tout d'abord, liste 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

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

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

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 de cluster assignée au service.
  • Port, TargetPort : 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. Cela est très important. Si vous ne voyez aucun point d'extrémité (endpoint), cela signifie que le service n'est pas correctement connecté à aucun pod, probablement en raison d'une erreur de correspondance du sélecteur.
  • Session Affinity, Events : Autres configurations de service et événements.

Lorsque vous vérifiez l'état du déploiement, les éléments clés à rechercher sont :

  • État READY du déploiement : Assurez - vous qu'il affiche le nombre de réplicas souhaité (par exemple, 2/2 pour web - app).
  • État STATUS des pods : Tous les pods doivent être dans l'état Running.
  • Points d'extrémité (Endpoints) du service : Vérifiez que le service a des points d'extrémité et qu'ils correspondent aux adresses IP de vos pods en cours d'exécution. S'il n'y a aucun point d'extrémité, dépannage le sélecteur du service et les étiquettes des pods.
  • Vérifiez les avertissements ou les erreurs : Examinez la sortie de kubectl describe deployment <deployment_name> et kubectl describe service <service_name> pour tout état inhabituel ou erreur dans les sections Events.

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

Accéder à l'application à l'aide de kubectl proxy

Dans cette étape, vous allez apprendre à accéder à vos applications Kubernetes à l'aide de kubectl proxy. kubectl proxy crée une connexion proxy sécurisée au serveur d'API Kubernetes, vous permettant d'accéder aux services et pods du cluster depuis votre machine locale. Cela est très utile pour le développement et le débogage, notamment lorsque vous souhaitez accéder à des services qui ne sont pas exposés en dehors du cluster.

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

cd ~/project/k8s-manifests/manifests

Démarrez le 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 symbole & à la fin de la commande l'exécute en arrière-plan. Vous devriez voir une sortie similaire à 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 à l'invite de commande. Le proxy devrait toujours être en cours d'exécution en arrière-plan.

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

## Obtenir les noms des pods pour le déploiement '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 permettant d'accéder au serveur web NGINX exécuté dans ce pod.

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

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

Analysons cette URL :

  • http://localhost:8080 : L'adresse où le kubectl proxy est en cours d'exécution. Par défaut, il écoute sur le port 8080 de votre machine locale.
  • /api/v1 : Spécifie la version de l'API Kubernetes (v1).
  • /namespaces/<namespace> : L'espace de noms dans lequel votre pod est exécuté. Dans notre cas, il s'agit de default.
  • /pods/<pod_name> : Le nom du pod que 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 établir une connexion proxy au 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 :

## Obtenir le nom du premier pod avec l'étiquette 'app=web'
POD_NAME=$(kubectl get pods -l app=web -o jsonpath='{.items[0].metadata.name}')
echo $POD_NAME ## Optionnel : afficher le nom du pod pour vérification

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 d'accueil par défaut de NGINX. L'exemple de sortie sera un 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 réussi à accéder au serveur web NGINX exécuté à l'intérieur de votre pod via le kubectl proxy.

Explorons quelques autres opérations que vous pouvez effectuer 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/

Cela 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'accès API du pod :

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

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

Arrêter le kubectl proxy :

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

jobs

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

kill %1

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

Points clés à retenir concernant le kubectl proxy :

  • kubectl proxy crée une connexion sécurisée et authentifiée au serveur d'API Kubernetes.
  • Il vous permet d'accéder aux ressources du cluster (pods, services, etc.) depuis votre machine locale 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é, le 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 à déployer des applications sur un cluster Kubernetes en utilisant Minikube. Vous avez commencé par configurer un cluster Kubernetes local 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 solide base pour travailler avec Kubernetes.

Vous avez ensuite créé des manifestes YAML simples pour un Pod et un Deployment, les avez appliqués à votre cluster en utilisant kubectl apply, et vérifié l'état du déploiement à l'aide de diverses commandes kubectl telles que 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 offre un moyen sécurisé d'interagir avec l'API de votre cluster et d'accéder aux services et pods depuis votre machine locale. Cette technique est 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 pour déployer et gérer des applications plus complexes sur Kubernetes.