Skip to content

Lab 2a: Introduction to Kubernetes

Dans ce laboratoire, vous allez découvrir Kubernetes et son modèle réseau. Nous utiliserons un environnement Kubernetes personnalisé, mais chez vous, vous pouvez utiliser Minikube pour configurer un cluster Kubernetes sur votre ordinateur.

Info

Kubernetes est un logiciel complexe avec de nombreuses configurations et ressources. Pour ce laboratoire, nous utiliserons uniquement les ressources vues en cours. Pour en savoir plus, consultez la documentation.

Installation de Minikube

Vous pouvez installer Minikube en suivant ce guide.

Tip

Nous recommandons d'utiliser le driver docker pour macOS et Linux ; Hyper-V pour Windows. Le driver VirtualBox fonctionne sur tout OS.

Démarrage de Minikube

minikube start --cni=calico

Cette commande télécharge les composants Kubernetes et démarre un cluster mono‑nœud utilisant Calico.

Info

Essayez d'ajouter --nodes=3 si vous avez une machine puissante. Cela crée un cluster de 3 nœuds.

Une sortie correcte devrait ressembler à ceci:

😄  minikube v1.32.0 on Darwin 15.1.1
🎉  minikube 1.35.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.35.0
💡  To disable this notice, run: 'minikube config set WantUpdateNotification false'

  Using the docker driver based on existing profile
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
🤷  docker "minikube" container is missing, will recreate.
🔥  Creating docker container (CPUs=2, Memory=4000MB) ...
🐳  Preparing Kubernetes v1.28.3 on Docker 24.0.7 ...
     Generating certificates and keys ...
     Booting up control plane ...
     Configuring RBAC rules ...
🔗  Configuring Calico (Container Networking Interface) ...
     Using image gcr.io/k8s-minikube/storage-provisioner:v5
🔎  Verifying Kubernetes components...
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Interaction avec votre cluster

Vous pouvez interagir avec votre cluster en utilisant kubectl. Par exemple, pour obtenir l'état de vos nœuds, vous pouvez exécuter:

kubectl get nodes

Vous pouvez également voir quels Pods sont en cours d'exécution dans le cluster en exécutant :

# -A indiquera au serveur API de renvoyer les Pods 
# dans tous les nameapaces. Par défaut, 
# la commande renvoie les Pods dans le namespace defaut.
kubectl get pods -A

Déployer une application

Pour déployer une application, vous pouvez créer un fichier de déploiement en YAML. Dans cet exemple, nous allons déployer un serveur Wiki.

Créez un fichier de déploiement de base (deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wikijs
  labels:
    app: wikijs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wikijs
  template:
    metadata:
      labels:
        app: wikijs
    spec:
      containers:
      - name: wikijs-container
        image: lscr.io/linuxserver/wikijs:latest
        ports:
        - containerPort: 3000

Ce fichier de déploiement va créer 3 réplicas du même conteneur, (typiquement) répartis sur différents nœuds. Pour déployer l'application sur le cluster, exécutez:

# Utilisez l'option -n <namespace> pour déployer l'application
# dans namespace différent. 
kubectl apply -f deployment.yaml

Vérifiez l'état d'un déploiement.

Pour vérifier que l'application fonctionne, vous pouvez consulter la sortie de la commande:

# Dans ce cas, nous ne spécifions pas -A car
# nous voulons connaître uniquement les pods
# dans l'espace de noms default.
kubectl get pods
kubectl get replicasets
kubectl get deployments

Tip

Vous verrez plus d'informations si vous utilisez l'option -o wide.

Une sortie correcte devrait ressembler à ceci:

NAME                                READY   STATUS    RESTARTS   AGE
wikijs-5ccdc5f64c-62m9s             1/1     Running   0          57s
wikijs-5ccdc5f64c-c6bks             1/1     Running   0          57s
wikijs-5ccdc5f64c-snsh6             1/1     Running   0          57s

Exposez une application via NodePort

Interagir avec une application dans Kubernetes depuis l'extérieur nécessite d'une ressource Service. Dans ce cas, nous allons utiliser un service NodePort pour exposer l'application Wikijs à l'extérieur du cluster.

Pour ce faire, créez un nouveau fichier appelé service.yaml avec le contenu suivant:

apiVersion: v1
kind: Service
metadata:
  name: wiki-svc 
spec:
  type: NodePort
  selector:
    app: wikijs
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000
      nodePort: 30080 # Assurez que ce port n'est pas encore utilisé par d'autres services.

Déployer le service sur le cluster:

kubectl apply -f service.yaml

Warning

L'instruction suivante est uniquement nécessaire pour Minikube, car il fonctionne comme une VM ou un conteneur sur votre ordinateur. Elle renverra une URL que vous devrez coller dans votre navigateur.

minikube service wiki-svc --url
Sinon, le service devrait être disponible à l'adresse 0.0.0.0:30080

En ouvrant l'URL du service, vous devriez voir le site web suivant:

Image title
WikiJS setup

Questions 1-2

Le processus d'installation de WikiJS échouera à un moment donné, après avoir fourni le nom d'utilisateur et le mot de passe initiaux: EACCES: permission denied, mkdir '/data' Pouvez-vous découvrir pourquoi ?

Tip

Il semble que l'application essaie d'accéder à un chemin qui n'existe pas. Vous devez peut-être créer un nouveau volume et l'attacher au déploiement.

À quoi ressemble un déploiement YAML correct pour cette application ? Fournissez le(s) fichier(s) YAML mis à jour.

Vous pouvez voir les journaux de l'application en utilisant la commande kubectl logs pod/<nom_du_pod>

Communication entre Services

Les Pods communiquent généralement entre eux en utilisant des services. Un service diffère par son adresse IP et ses modes de communication. Dans cette partie, nous allons analyser le fonctionnement des services et comment communiquer avec eux.

Créer un Pod avec des Outils d'Analyse Réseau

apiVersion: v1
kind: Pod
metadata:
  name: test-container
  labels:
    app: test
spec:
  containers:
  - name: ubuntu
    image: ubuntu:22.04
    command: ["sleep", "infinity"]

A Après avoir vérifié que le service fonctionne, obtenez un shell:

kubectl exec -it test-container -- bash
Ensuite, installez nslookup afin que nous puissions effectuer des requêtes DNS vers Kubernetes:

 apt update && apt install dnsutils iputils-ping -y

Enfin, vérifiez l'adresse IP du service:

nslookup wiki-svc
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   wiki-svc.default.svc.cluster.local
Address: 10.103.43.191

Questions 3-4

Question 3

Quel Pod agit comme un serveur DNS dans le cluster ? À quel CIDR appartient l'adresse IP du service ? Comment pouvez-vous accéder au wiki-svc depuis le conteneur Ubuntu ?

Question 4

Créez un service headless et un service ClusterIP pour WikiJS. Quelles adresses IP chaque service obtient-il ? Pouvez-vous y accéder depuis l'extérieur du cluster ?

Suppression des ressources

Vous pouvez nettoyer les ressources soit en passant le fichier déclaratif associé:

kubectl delete -f deployment.yaml
kubectl delete -f service.yaml

Alternativement, vous pouvez supprimer toutes les ressources dans l'espace de noms par défaut avec:

kubectl delete all --all

Cette commande supprimera tous les déploiements, services, pods et autres ressources dans l'espace de noms par défaut.

Warning

Soyez prudent lors de l'utilisation de la commande delete all --all, car elle supprimera toutes les ressources dans l'espace de noms spécifié

Arrêter Minikube

Pour arrêter votre cluster Minikube, vous pouvez exécuter:

minikube stop

Supprimer Minikube

Pour supprimer votre cluster Minikube, vous pouvez exécuter:

minikube delete