☸️ Partie 2 : Installation & Setup (kubectl)
Installation (Minikube, Kubeadm, K3s), Setup (~/.kube/config) & Commandes kubectl essentielles.
5. Installation (Locale/Dev)
Minikube (VM lourde), K3s/K3d (léger, docker), Kind (K8s in Docker)[cite: 12].
Minikube K3s5. Installation (Prod)
Kubeadm (DIY On-Prem) [cite: 12], Cloud Managé (GKE, EKS, AKS)[cite: 12].
Kubeadm GKE/EKS/AKS6. Setup : kubectl
L'outil CLI (client). Installation (curl, brew, gcloud).
6. Setup : ~/.kube/config
Le "passeport" YAML. Définit clusters, users, et contexts[cite: 14].
Commandes (Lecture)
kubectl get nodes[cite: 14], get pods, describe pod, logs[cite: 14].
Commandes (Écriture)
kubectl apply -f (Déclaratif)[cite: 14], delete, exec, cp.
Commandes (Admin)
rollout restart[cite: 26], scale deploy[cite: 26], drain node[cite: 26], get events[cite: 26].
Commandes (Debug)
kubectl top pods[cite: 26], port-forward, debug (nouveau).
Pour développer localement (sur votre PC)[cite: 12].
| Outil | Description | Usage |
|---|---|---|
| Minikube | Le "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 / K3d | Distribution 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
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.
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
~/.kube/configkubectl 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
get, describe, logsCommandes 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 Ready10d 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
apply, delete, execCommandes 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
rollout, scale, drain, eventsrollout (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'
top, port-forwardkubectl 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
