Skip to main content

Minikube

📗 Minikube - Kubernetes Local

📋 Table des Matières


🎯 Introduction

Minikube est un outil qui permet d'exécuter un cluster Kubernetes local sur votre machine pour le développement et les tests.

Caractéristiques

  • Simple : Installation et démarrage en quelques commandes
  • Rapide : Démarrage du cluster en ~1 minute
  • Multi-drivers : Support de différents hyperviseurs
  • Addons : Dashboard, Ingress, Metrics Server intégrés
  • Multi-nodes : Possibilité de créer plusieurs nodes
  • Isolation : Chaque cluster est isolé dans sa VM/conteneur

Cas d'usage

  • 💻 Développement local d'applications Kubernetes
  • 🎓 Apprentissage de Kubernetes
  • 🧪 Tests de manifests et configurations
  • 🔬 Prototypage rapide
  • 📝 CI/CD locaux
  • 🎯 Démonstrations et formations

Minikube vs Alternatives

Aspect Minikube K3s Kind Docker Desktop
Installation 🟢 Simple 🟢 Simple 🟢 Simple 🟢 Simple
Démarrage ~1 min ~30s ~30s ~1 min
RAM recommandée 2GB 512MB 2GB 2GB
Multi-nodes ✅ Oui ✅ Oui ✅ Oui ❌ Non
Addons ✅ Nombreux ⚠️ Limité ❌ Non ⚠️ Limité
Dashboard ✅ Intégré ❌ Non ❌ Non ✅ Intégré
Production ❌ Non ✅ Oui ❌ Non ❌ Non

🔧 Prérequis

Configuration système requise

# Minimum
- CPU: 2 cores
- RAM: 2GB
- Disk: 20GB
- OS: Linux, macOS, Windows

# Recommandé
- CPU: 4+ cores
- RAM: 4GB+
- Disk: 40GB+
- Virtualisation activée (VT-x/AMD-v)

Vérifier la virtualisation

Linux

# Vérifier si la virtualisation est activée
grep -E --color 'vmx|svm' /proc/cpuinfo

# Si rien ne s'affiche, activer dans le BIOS
# Intel: VT-x
# AMD: AMD-V

macOS

# La virtualisation est généralement activée par défaut
sysctl -a | grep -E --color 'machdep.cpu.features|VMX'

Windows

# PowerShell (Admin)
systeminfo | findstr /C:"Virtualization"

# Doit afficher: "Virtualization Enabled In Firmware: Yes"

📥 Installation

Linux

Méthode 1 : Binaire direct (Recommandée)

# Télécharger la dernière version
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64

# Installer
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# Nettoyer
rm minikube-linux-amd64

# Vérifier
minikube version

Méthode 2 : Package manager

# Debian/Ubuntu
curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/stable:/v1.28/deb/Release.key | \
    sudo gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
    
wget -qO - https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb https://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt update
sudo apt install -y minikube

# Arch Linux
yay -S minikube

# Fedora
sudo dnf install minikube

macOS

# Via Homebrew (Recommandé)
brew install minikube

# Ou binaire direct
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube
rm minikube-darwin-amd64

# Vérifier
minikube version

Windows

Méthode 1 : Chocolatey

# PowerShell (Admin)
choco install minikube

Méthode 2 : Winget

winget install Kubernetes.minikube

Méthode 3 : Installeur

# Télécharger depuis
# https://minikube.sigs.k8s.io/docs/start/

# Installer et ajouter au PATH
# Vérifier
minikube version

Installation des Drivers

Minikube nécessite un driver de virtualisation :

Docker (Recommandé - Multi-plateforme)

# Linux
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
newgrp docker

# macOS
brew install docker

# Windows
# Installer Docker Desktop depuis docker.com

# Vérifier
docker --version

VirtualBox (Alternative)

# Linux
sudo apt install virtualbox virtualbox-ext-pack

# macOS
brew install --cask virtualbox

# Windows
choco install virtualbox

# Vérifier
VBoxManage --version

KVM (Linux uniquement)

# Ubuntu/Debian
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils

# Vérifier
virsh list --all

HyperKit (macOS uniquement)

brew install hyperkit

Hyper-V (Windows uniquement)

# PowerShell (Admin)
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

🚀 Démarrage et Configuration

Démarrage Simple

# Démarrer avec le driver par défaut
minikube start

# Vérifier le statut
minikube status

# Afficher les informations
kubectl cluster-info
kubectl get nodes

Démarrage avec Options

# Spécifier le driver
minikube start --driver=docker
minikube start --driver=virtualbox
minikube start --driver=kvm2
minikube start --driver=hyperkit

# Allouer des ressources
minikube start --cpus=4 --memory=8192 --disk-size=40g

# Version de Kubernetes spécifique
minikube start --kubernetes-version=v1.28.0

# Avec un nom personnalisé
minikube start -p dev-cluster

# Configuration complète
minikube start \
  --driver=docker \
  --cpus=4 \
  --memory=8192 \
  --disk-size=40g \
  --kubernetes-version=v1.28.0 \
  --nodes=3 \
  -p my-cluster

Définir le Driver par Défaut

# Définir Docker comme driver par défaut
minikube config set driver docker

# Autres drivers
minikube config set driver virtualbox
minikube config set driver kvm2
minikube config set driver hyperkit

# Voir la configuration
minikube config view

🔧 Gestion du Cluster

Commandes de Base

# Statut du cluster
minikube status

# Informations détaillées
minikube profile list
minikube version
kubectl cluster-info

# Arrêter le cluster
minikube stop

# Démarrer un cluster arrêté
minikube start

# Redémarrer le cluster
minikube stop && minikube start

# Suspendre le cluster (pause)
minikube pause

# Reprendre un cluster en pause
minikube unpause

# Supprimer le cluster
minikube delete

# Supprimer tous les clusters
minikube delete --all

Accès au Cluster

# SSH dans le node Minikube
minikube ssh

# Exécuter une commande dans le node
minikube ssh "docker ps"
minikube ssh "sudo crictl ps"

# Voir les logs du cluster
minikube logs

# Logs en temps réel
minikube logs -f

# IP du cluster
minikube ip

# Obtenir l'URL du service Kubernetes
kubectl cluster-info

Mise à Jour

# Mettre à jour Minikube
# Linux/macOS
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# Via package manager
brew upgrade minikube          # macOS
sudo apt update && sudo apt upgrade minikube  # Ubuntu
choco upgrade minikube         # Windows

# Mettre à jour Kubernetes dans le cluster
minikube start --kubernetes-version=v1.29.0

# Vérifier la version
minikube version
kubectl version

🧩 Addons

Lister les Addons Disponibles

# Voir tous les addons
minikube addons list

# Addons populaires:
# - dashboard: Interface web Kubernetes
# - ingress: Contrôleur Ingress NGINX
# - metrics-server: Métriques de ressources
# - registry: Registry Docker local
# - storage-provisioner: Provisionnement de volumes

Activer/Désactiver des Addons

# Activer un addon
minikube addons enable <nom>

# Exemples
minikube addons enable dashboard
minikube addons enable ingress
minikube addons enable metrics-server
minikube addons enable registry

# Désactiver un addon
minikube addons disable <nom>

# Voir le statut d'un addon
minikube addons list | grep <nom>

Addons Essentiels

Dashboard (Interface Web)

# Activer le dashboard
minikube addons enable dashboard

# Ouvrir le dashboard dans le navigateur
minikube dashboard

# Obtenir l'URL sans ouvrir
minikube dashboard --url

# Dashboard en arrière-plan
minikube dashboard &

Ingress Controller

# Activer Ingress NGINX
minikube addons enable ingress

# Vérifier l'installation
kubectl get pods -n ingress-nginx

# Exemple d'Ingress
cat > ingress.yaml << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: hello.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: hello-service
            port:
              number: 80
EOF

kubectl apply -f ingress.yaml

# Ajouter à /etc/hosts
echo "$(minikube ip) hello.local" | sudo tee -a /etc/hosts

Metrics Server

# Activer metrics-server
minikube addons enable metrics-server

# Attendre quelques secondes, puis vérifier
kubectl top nodes
kubectl top pods

Registry Local

# Activer le registry
minikube addons enable registry

# Obtenir l'URL du registry
minikube service registry -n kube-system --url

# Utiliser le registry
docker tag my-image:latest $(minikube ip):5000/my-image:latest
docker push $(minikube ip):5000/my-image:latest

🐳 Gestion des Images Docker

Méthode 1 : Docker Daemon de Minikube (Recommandée)

# Pointer Docker vers le daemon de Minikube
eval $(minikube docker-env)

# Vérifier
docker ps

# Maintenant, construire directement dans Minikube
docker build -t my-app:latest .

# L'image est directement disponible dans Minikube
kubectl run my-app --image=my-app:latest --image-pull-policy=Never

# Revenir au Docker local
eval $(minikube docker-env -u)

Méthode 2 : Load une Image

# Construire l'image localement
docker build -t my-aspnetapp:latest .

# Charger l'image dans Minikube
minikube image load my-aspnetapp:latest

# Ou depuis un fichier tar
docker save my-aspnetapp:latest > my-aspnetapp.tar
minikube image load my-aspnetapp.tar

# Vérifier
minikube image ls | grep my-aspnetapp

# Utiliser dans un pod
kubectl run my-app --image=my-aspnetapp:latest --image-pull-policy=Never

Méthode 3 : Registry Local avec Addon

# Activer le registry addon
minikube addons enable registry

# Construire et tagger pour le registry
docker build -t localhost:5000/my-app:latest .

# Pousser vers le registry Minikube
docker push localhost:5000/my-app:latest

# Utiliser dans Kubernetes
kubectl run my-app --image=localhost:5000/my-app:latest

Commandes de Gestion des Images

# Lister les images dans Minikube
minikube image ls
minikube image ls --format table

# Charger une image
minikube image load <image:tag>

# Construire une image dans Minikube
minikube image build -t my-app:latest .

# Supprimer une image
minikube image rm <image:tag>

# Pull une image
minikube image pull nginx:latest

# Sauvegarder une image
minikube image save <image:tag> -o image.tar

Configuration ImagePullPolicy

# deployment-local.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: my-aspnetapp:latest
        imagePullPolicy: Never  # N'essaie pas de pull, utilise l'image locale
        ports:
        - containerPort: 3000

📦 Déploiement d'Applications

Exemple Complet : Application Node.js

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-app
  labels:
    app: node-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: node-app
  template:
    metadata:
      labels:
        app: node-app
    spec:
      containers:
      - name: node-app
        image: my-aspnetapp:latest
        imagePullPolicy: Never
        ports:
        - containerPort: 3000
          name: http
        env:
        - name: NODE_ENV
          value: "development"
        - name: PORT
          value: "3000"
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "200m"
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: node-app-service
  labels:
    app: node-app
spec:
  type: NodePort
  selector:
    app: node-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
    nodePort: 30080
# Déployer
kubectl apply -f deployment.yaml

# Vérifier
kubectl get deployments
kubectl get pods
kubectl get services

# Voir les logs
kubectl logs -l app=node-app -f

# Accéder à l'application
minikube service node-app-service
# Ou
curl $(minikube ip):30080

🌐 Accès aux Services

Service Type: NodePort

# Obtenir l'URL du service
minikube service <service-name>

# Obtenir l'URL sans ouvrir le navigateur
minikube service <service-name> --url

# Exemple
minikube service node-app-service
minikube service node-app-service --url

# Liste de tous les services
minikube service list

Service Type: LoadBalancer

# Minikube simule un LoadBalancer avec tunnel
minikube tunnel

# Dans un autre terminal
kubectl get services

# Le LoadBalancer aura une EXTERNAL-IP
# Accéder via cette IP

# Exemple de service LoadBalancer
apiVersion: v1
kind: Service
metadata:
  name: lb-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000

Note: minikube tunnel nécessite des privilèges sudo et doit rester actif.


Port Forwarding

# Forward un port de pod vers localhost
kubectl port-forward pod/<pod-name> 8080:3000

# Forward un service
kubectl port-forward service/<service-name> 8080:80

# Exemple
kubectl port-forward service/node-app-service 8080:80

# Accéder
curl http://localhost:8080

👥 Profiles et Multi-Clusters

Créer et Gérer des Profiles

# Créer un nouveau profile (cluster)
minikube start -p dev-cluster
minikube start -p test-cluster
minikube start -p staging-cluster

# Lister tous les profiles
minikube profile list

# Changer de profile
minikube profile dev-cluster
minikube profile test-cluster

# Voir le profile actif
minikube profile

# Commandes spécifiques à un profile
minikube status -p dev-cluster
minikube stop -p test-cluster
minikube delete -p staging-cluster

Multi-Nodes dans un Cluster

# Créer un cluster avec 3 nodes
minikube start --nodes 3

# Ajouter un node à un cluster existant
minikube node add

# Voir les nodes
kubectl get nodes
minikube node list

# Supprimer un node
minikube node delete <node-name>

# SSH dans un node spécifique
minikube ssh -n <node-name>

🔄 Tunneling et LoadBalancer

Minikube Tunnel

# Démarrer le tunnel (nécessite sudo)
minikube tunnel

# Le tunnel créé des routes pour les LoadBalancers
# Garder cette commande active

# Dans un autre terminal
kubectl get services

# Les services LoadBalancer auront une EXTERNAL-IP
# Exemple: 10.96.0.1

Exemple avec LoadBalancer

# loadbalancer-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-lb
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-lb-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
# Déployer
kubectl apply -f loadbalancer-service.yaml

# Dans un terminal
minikube tunnel

# Dans un autre terminal
kubectl get svc nginx-lb-service
# EXTERNAL-IP sera visible

# Accéder
curl http://<EXTERNAL-IP>

📊 Monitoring et Dashboard

Kubernetes Dashboard

# Activer le dashboard
minikube addons enable dashboard

# Lancer le dashboard
minikube dashboard

# URL du dashboard sans ouvrir
minikube dashboard --url

# Accès via kubectl proxy
kubectl proxy
# Puis accéder : http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

Metrics et Monitoring

# Activer metrics-server
minikube addons enable metrics-server

# Attendre ~30 secondes pour collecter les métriques

# Voir les métriques des nodes
kubectl top nodes

# Voir les métriques des pods
kubectl top pods
kubectl top pods --all-namespaces
kubectl top pods -n kube-system

# Trier par CPU
kubectl top pods --sort-by=cpu

# Trier par mémoire
kubectl top pods --sort-by=memory

Logs et Events

# Logs du cluster Minikube
minikube logs
minikube logs -f

# Logs d'un pod
kubectl logs <pod-name>
kubectl logs -f <pod-name>
kubectl logs <pod-name> -c <container-name>

# Logs de tous les pods d'un deployment
kubectl logs -l app=my-app -f

# Events Kubernetes
kubectl get events
kubectl get events --sort-by='.lastTimestamp'
kubectl get events -w  # Watch mode

🔧 Dépannage

Problèmes Courants

Minikube ne démarre pas

# Voir les logs détaillés
minikube start --alsologtostderr -v=7

# Supprimer et recréer le cluster
minikube delete
minikube start

# Vérifier la virtualisation
# Linux
grep -E 'vmx|svm' /proc/cpuinfo

# Essayer un autre driver
minikube start --driver=docker
minikube start --driver=virtualbox

Problèmes de ressources

# Vérifier les ressources allouées
minikube config view

# Augmenter les ressources
minikube delete
minikube start --cpus=4 --memory=8192 --disk-size=40g

# Voir l'utilisation des ressources
kubectl top nodes
kubectl top pods --all-namespaces

Images ne se chargent pas

# Vérifier que vous utilisez le daemon Minikube
eval $(minikube docker-env)
docker images

# Charger manuellement une image
minikube image load my-image:latest

# Vérifier
minikube image ls | grep my-image

# Utiliser avec imagePullPolicy: Never
kubectl run test --image=my-image:latest --image-pull-policy=Never

Service inaccessible

# Vérifier que le service existe
kubectl get services

# Pour NodePort
minikube service <service-name> --url
curl $(minikube service <service-name> --url)

# Pour LoadBalancer, tunnel doit être actif
minikube tunnel

# Port forwarding comme alternative
kubectl port-forward service/<service-name> 8080:80

Dashboard ne s'ouvre pas

# Vérifier que l'addon est activé
minikube addons list | grep dashboard

# Activer si nécessaire
minikube addons enable dashboard

# Vérifier les pods du dashboard
kubectl get pods -n kubernetes-dashboard

# Redémarrer si nécessaire
minikube addons disable dashboard
minikube addons enable dashboard

# Utiliser kubectl proxy
kubectl proxy
# Accéder via: http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

Nettoyer l'espace disque

# Voir l'utilisation du disque
minikube ssh "df -h"

# Nettoyer les images non utilisées
minikube ssh "docker system prune -af"

# Nettoyer les volumes
minikube ssh "docker volume prune -f"

# Redémarrer avec plus d'espace
minikube delete
minikube start --disk-size=60g

Commandes de Diagnostic

# Statut complet
minikube status
minikube version
kubectl version
kubectl cluster-info

# Configuration
minikube config view
kubectl config view

# Logs système
minikube logs
journalctl -u minikube  # Linux

# SSH pour investigation
minikube ssh
# Dans le node:
docker ps
docker images
crictl ps
crictl images

# Redémarrage complet
minikube stop
minikube start

📚 Ressources Complémentaires

Documentation Officielle

Guides Kubernetes Connexes

Tutoriels et Outils


🎯 Commandes de Référence Rapide

# Cycle de vie
minikube start                    # Démarrer
minikube stop                     # Arrêter
minikube delete                   # Supprimer
minikube status                   # Statut

# Configuration
minikube config set driver docker # Définir driver
minikube config view              # Voir config

# Addons
minikube addons list              # Lister
minikube addons enable dashboard  # Activer
minikube addons disable ingress   # Désactiver

# Images
eval $(minikube docker-env)       # Use Minikube Docker
minikube image load <image>       # Charger image
minikube image ls                 # Lister images

# Services
minikube service <name>           # Ouvrir service
minikube service list             # Lister services
minikube tunnel                   # Tunnel LoadBalancer

# Accès
minikube dashboard                # Dashboard
minikube ssh                      # SSH
minikube ip                       # IP cluster
minikube logs                     # Logs

# Profiles
minikube start -p <name>          # Nouveau cluster
minikube profile list             # Lister clusters
minikube profile <name>           # Changer cluster

🎉 Vous êtes prêt à développer avec Minikube !