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
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:
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:
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.
Sinon, le service devrait être disponible à l'adresse0.0.0.0:30080
En ouvrant l'URL du service, vous devriez voir le site web suivant:
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:
Ensuite, installeznslookup afin que nous puissions effectuer des requêtes DNS vers Kubernetes:
Enfin, vérifiez l'adresse IP du service:
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é:
Alternativement, vous pouvez supprimer toutes les ressources dans l'espace de noms par défaut avec:
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:
Supprimer Minikube
Pour supprimer votre cluster Minikube, vous pouvez exécuter: