Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

☸️ Partie 2 : Installation & Setup (kubectl)

Installation (Minikube, Kubeadm, K3s), Setup (~/.kube/config) & Commandes kubectl essentielles.

2.1 Facile

5. Installation (Locale/Dev)

Minikube (VM lourde), K3s/K3d (léger, docker), Kind (K8s in Docker)[cite: 12].

Minikube K3s
2.2 Avancé

5. Installation (Prod)

Kubeadm (DIY On-Prem) [cite: 12], Cloud Managé (GKE, EKS, AKS)[cite: 12].

Kubeadm GKE/EKS/AKS
2.3 Facile

6. Setup : kubectl

L'outil CLI (client). Installation (curl, brew, gcloud).

kubectl CLI
2.4 Moyen

6. Setup : ~/.kube/config

Le "passeport" YAML. Définit clusters, users, et contexts[cite: 14].

kubeconfig Contexts
2.5 Facile

Commandes (Lecture)

kubectl get nodes[cite: 14], get pods, describe pod, logs[cite: 14].

kubectl get kubectl describe
2.6 Facile

Commandes (Écriture)

kubectl apply -f (Déclaratif)[cite: 14], delete, exec, cp.

kubectl apply kubectl delete
2.7 Moyen

Commandes (Admin)

rollout restart[cite: 26], scale deploy[cite: 26], drain node[cite: 26], get events[cite: 26].

kubectl rollout kubectl drain
2.8 Moyen

Commandes (Debug)

kubectl top pods[cite: 26], port-forward, debug (nouveau).

kubectl top kubectl port-forward
5. Installation (Locale/Dev)

Pour développer localement (sur votre PC)[cite: 12].

OutilDescriptionUsage
MinikubeLe "classique"[cite: 12]. Crée un cluster K8s dans une VM (VirtualBox, Hyper-V) ou Docker. Simple, mais lourd (consomme beaucoup de RAM/CPU).Idéal pour tester des fonctionnalités complètes.
K3s / K3dDistribution légère (par Rancher/SUSE)[cite: 12]. Conçue pour l'Edge/IoT[cite: 24]. K3d exécute K3s dans Docker.Recommandé. Démarre en quelques secondes. Très léger.
Kind (K8s in Docker)Outil officiel de test K8s. Crée un cluster en utilisant des conteneurs Docker comme "Nœuds".Tests de CI/CD, développement de K8s lui-même.
Exemple (Démarrage K3d)
# (Nécessite Docker Desktop)
# 1. Installer K3d (via brew, choco...)
brew install k3d

# 2. Créer un cluster (1 master, 2 workers)
k3d cluster create mon-cluster --servers 1 --agents 2

# 3. (K3d configure ~/.kube/config automatiquement)
kubectl get nodes
            
5. Installation (Production)

Pour la production, deux voies s'affrontent[cite: 8, 12].

1. Cloud Managé (Recommandé)

GKE (Google), EKS (Amazon), AKS (Azure)[cite: 12].

Avantage : Le Cloud Provider gère le Control Plane (API Server, etcd...). Vous ne gérez (et payez) que les Worker Nodes (le compute). C'est fiable et managé.

Inconvénient : Coûteux (GKE/EKS facturent ~$72/mois [cite: 10] juste pour le Control Plane).

2. DIY / On-Premise (kubeadm)

Kubeadm est l'outil "officiel" pour "bootstrapper" (créer) un cluster K8s standard [cite: 12] sur vos propres machines (VMs, Bare Metal).

Avantage : Contrôle total, pas de coût de "management" (le logiciel est gratuit [cite: 10]).

Inconvénient : **Extrêmement complexe.** Vous êtes responsable de la Haute Disponibilité (HA) du Control Plane, des backups etcd, des mises à jour, du réseau (CNI), etc.

6. Setup : kubectl (L'Outil CLI)

kubectl est l'outil client (CLI) officiel pour parler à l'api-server d'un cluster Kubernetes[cite: 14].

Installation (Client)
# 1. macOS (Homebrew)
brew install kubectl

# 2. Linux (curl)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# 3. Windows (Chocolatey)
choco install kubernetes-cli

# 4. Via Cloud SDK (GKE/EKS/AKS)
# (L'installation du SDK Cloud (gcloud, aws, az)
# inclut souvent sa propre version de kubectl)
gcloud components install kubectl
az aks install-cli
            
6. Setup : Le fichier ~/.kube/config

kubectl trouve les identifiants du cluster dans le fichier ~/.kube/config[cite: 14]. (Ou via la variable d'env $KUBECONFIG).

C'est un fichier YAML qui définit 3 choses :

  • clusters : La liste des API Servers (ex: URL de GKE, URL de Minikube) et leurs CAs.
  • users : La liste des identifiants (ex: Certificat client, Token).
  • contexts : Le "lien" (context) qui associe un User + un Cluster (+ un Namespace par défaut).
Exemple (~/.kube/config simplifié)
apiVersion: v1
kind: Config
current-context: docker-desktop # (Le contexte ACTIF)

contexts:
- context: # (Contexte 1)
    cluster: docker-desktop
    user: docker-desktop
  name: docker-desktop
- context: # (Contexte 2)
    cluster: gke_mon-projet_europe-west1_prod-cluster
    user: gke_mon-projet_europe-west1_prod-cluster
  name: gke-prod

clusters:
- cluster:
    server: https://kubernetes.docker.internal:6443
  name: docker-desktop
- cluster:
    server: https://34.123.45.67
  name: gke_mon-projet_europe-west1_prod-cluster

users:
- name: docker-desktop
  user:
    client-certificate-data: ...
- name: gke_mon-projet_europe-west1_prod-cluster
  user:
    auth-provider:
      name: gcp
            
Changer de Contexte (Cluster)
# 1. Lister les contextes
$ kubectl config get-contexts

# 2. Changer de contexte (ex: passer en prod)
$ kubectl config use-context gke-prod
            
Commandes (Lecture) : get, describe, logs

Commandes pour inspecter l'état (lecture seule).

kubectl get (Obtenir)

Liste les ressources[cite: 14].

# Voir les Nœuds du cluster
$ kubectl get nodes
NAME             STATUS   ROLES    AGE   VERSION
node-1           Ready    master   10d   v1.28.2
node-worker-1    Ready       10d   v1.28.2

# Voir les Pods (dans le namespace 'default')
$ kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
nginx-deploy-6cdcfd6d5-abc12     1/1     Running   0          5m

# (Voir TOUS les pods dans TOUS les namespaces)
$ kubectl get pods --all-namespaces
# (ou 'kubectl get pods -A')

# (Obtenir plus de détails)
$ kubectl get pods -o wide

# (Obtenir le YAML complet de l'objet)
$ kubectl get pod nginx-deploy-6cdcfd6d5-abc12 -o yaml
kubectl describe (Décrire)

Donne un "rapport d'état" humain (très utile pour le debug).

# Pourquoi mon Pod ne démarre pas ?
$ kubectl describe pod nginx-deploy-6cdcfd6d5-abc12

# (Affiche les infos, et surtout...)
Events:
  Type     Reason     Age   From               Message
  ----     ------     ---   ----               -------
  Normal   Scheduled  2m    default-scheduler  Successfully assigned default/nginx-deploy... to node-worker-1
  Normal   Pulling    1m    kubelet            Pulling image "nginx:latest"
  Normal   Pulled     1m    kubelet            Successfully pulled image "nginx:latest"
  Normal   Created    1m    kubelet            Created container nginx
  Normal   Started    1m    kubelet            Started container nginx
            
kubectl logs (Journaux)

Affiche le stdout/stderr d'un conteneur[cite: 14].

# (Logs d'un Pod)
$ kubectl logs nginx-deploy-6cdcfd6d5-abc12

# (Suivre les logs en direct, style 'tail -f')
$ kubectl logs -f nginx-deploy-6cdcfd6d5-abc12
            
Commandes (Écriture) : apply, delete, exec

Commandes pour modifier l'état (écriture).

kubectl apply (Déclaratif)

La commande principale. Applique un état désiré (YAML) au cluster[cite: 14]. (Crée ou Met à jour).

# (Appliquer un fichier YAML)
$ kubectl apply -f ./mon-deployment.yaml
deployment.apps/nginx-deployment created

# (Appliquer à nouveau (met à jour si changé))
$ kubectl apply -f ./mon-deployment.yaml
deployment.apps/nginx-deployment configured
            
kubectl delete (Supprimer)
# (Supprimer un objet (défini par le YAML))
$ kubectl delete -f ./mon-deployment.yaml
deployment.apps "nginx-deployment" deleted

# (Supprimer par type et nom)
$ kubectl delete pod nginx-deploy-6cdcfd6d5-abc12
            
kubectl exec (Exécuter)

Exécute une commande *à l'intérieur* d'un conteneur (Pod) déjà en cours.

# (Ouvrir un shell 'bash' interactif dans le pod)
$ kubectl exec -it nginx-deploy-6cdcfd6d5-abc12 -- /bin/bash

# (Lancer une commande unique)
$ kubectl exec nginx-deploy-6cdcfd6d5-abc12 -- ls /etc/nginx
            
Commandes (Admin) : rollout, scale, drain, events
rollout (Mises à jour)

Gère les déploiements (rolling updates)[cite: 26].

# (Voir le statut d'un déploiement en cours)
$ kubectl rollout status deployment/nginx-deployment

# (Forcer un redémarrage (rolling) de tous les Pods
# (ex: si une ConfigMap a changé))
$ kubectl rollout restart deployment/nginx-deployment
            
scale (Mise à l'échelle)

Change (impérativement) le nombre de répliques d'un Deployment[cite: 26]. (Préférer kubectl apply sur le YAML).

$ kubectl scale deployment/nginx-deployment --replicas=5
            
drain (Maintenance Nœud)

Vide (gracieusement) un Nœud de tous ses Pods (les déplace) avant une maintenance[cite: 26].

$ kubectl drain node-worker-1 --ignore-daemonsets
            
get events (Événements)

Affiche tous les événements du cluster (très utile pour voir les erreurs globales)[cite: 26].

# (Affiche les événements, triés par temps)
$ kubectl get events --sort-by='.lastTimestamp'
            
Commandes (Debug) : top, port-forward
kubectl top (Consommation)

Affiche la consommation CPU/Mémoire (nécessite le "Metrics Server" installé)[cite: 26].

# (Consommation des Nœuds)
$ kubectl top nodes

# (Consommation des Pods)
$ kubectl top pods -n mon-namespace
            
kubectl port-forward (Accès)

Crée un "tunnel" depuis votre localhost vers un port de Pod/Service (idéal pour accéder à une DB ou une API interne).

# (Accéder au port 5432 du Pod 'postgres-pod'
# via http://localhost:8080 sur ma machine)

$ kubectl port-forward pod/postgres-pod 8080:5432