Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Cheatsheet CKAD : commandes kubectl essentielles

12 min de lecture

logo kubernetes

Cheatsheet centrée sur la vitesse d’exécution. Examen 100% pratique avec plusieurs tâches à résoudre rapidement en ligne de commande. Cette page couvre les commandes les plus rentables, organisées par domaine CKAD.

BesoinCommande
Générer un Pod YAMLk run nginx --image=nginx $do > pod.yaml
Générer un Deployment YAMLk create deploy webapp --image=nginx $do > deploy.yaml
Exposer rapidement un Deploymentk expose deploy webapp --port=80
Mettre à jour l’image d’un Deploymentk set image deploy webapp webapp=nginx:1.28
Voir pourquoi un Pod ne démarre pask describe pod <nom>
Lire les logs d’un crashk logs <pod> --previous
Trouver la syntaxe d’un champk explain pod.spec.containers
Changer de namespace rapidementkn <namespace> (alias ci-dessous)
Voir les événements récentsk get events --sort-by='.lastTimestamp'
Rollback d’un Deploymentk rollout undo deploy webapp

Vérifiez ces éléments dès le début de l’examen :

Fenêtre de terminal
# Vérifier les alias disponibles
alias
# L'alias k doit exister
alias k=kubectl
# Variable pour génération YAML (LA plus importante)
export do="--dry-run=client -o yaml"
# Alias pour changer de namespace rapidement
alias kn='kubectl config set-context --current --namespace'
# Autocomplétion
source <(kubectl completion bash)
complete -F __start_kubectl k
# Éditeur
export KUBE_EDITOR="vim"

Piège fréquent : Oublier de vérifier le namespace. Chaque question peut cibler un namespace différent.

Fenêtre de terminal
# Voir le namespace actuel
k config view --minify | grep namespace
# Changer de namespace
kn production

Fenêtre de terminal
k run nginx --image=nginx

But : Créer un Pod simple. Quand : Test rapide, Pod éphémère. Piège : Oublier de générer le YAML si vous devez ajouter des volumes ou probes.

Fenêtre de terminal
# Générer le YAML pour modification
k run nginx --image=nginx $do > pod.yaml
OptionUsage
--port=80Expose un port (documentation)
--labels="app=web"Ajoute des labels
--env="DB_HOST=mysql"Variable d’environnement
--requests="cpu=100m,memory=128Mi"Ressources minimales
--limits="cpu=200m,memory=256Mi"Ressources maximales
--command -- sleep 3600Remplace ENTRYPOINT
Fenêtre de terminal
k create deploy webapp --image=nginx --replicas=3

But : Déployer une application avec réplicas. Quand : Application stateless avec scaling. Piège : Le label app=webapp est ajouté automatiquement.

Fenêtre de terminal
# Générer le YAML
k create deploy webapp --image=nginx --replicas=3 $do > deploy.yaml
Fenêtre de terminal
# Job ponctuel
k create job backup --image=busybox -- tar -czf /backup/data.tar.gz /data
# CronJob planifié
k create cronjob daily-backup --image=busybox --schedule="0 2 * * *" -- /scripts/backup.sh

Syntaxe cron rapide : */5 * * * * = 5 min, 0 * * * * = 1h, 0 2 * * * = 2h du matin.


Fenêtre de terminal
k set image deploy webapp webapp=nginx:1.28

But : Déclencher un rolling update. Syntaxe : <conteneur>=<nouvelle-image>. Piège : Le nom du conteneur doit correspondre à celui défini dans le Deployment.

Fenêtre de terminal
# Suivre le rollout
k rollout status deploy webapp
# Voir l'historique
k rollout history deploy webapp
# Rollback immédiat
k rollout undo deploy webapp
# Rollback à une révision spécifique
k rollout undo deploy webapp --to-revision=1

Piège : Pas de message d’erreur si le rollback échoue silencieusement. Vérifiez avec rollout status.

Fenêtre de terminal
k scale deploy webapp --replicas=5
Fenêtre de terminal
k autoscale deploy webapp --min=2 --max=10 --cpu-percent=80

Fenêtre de terminal
k logs <pod>
k logs <pod> -c <conteneur> # Multi-conteneur
k logs <pod> --previous # Après un crash
k logs <pod> -f # Suivre en temps réel
k logs -l app=webapp # Tous les Pods d'un label

Piège : Après un crash, les logs disparaissent. Utilisez --previous immédiatement.

Fenêtre de terminal
k describe pod <nom>

But : Voir l’état complet + Events. Quand : Pod en Pending, ImagePullBackOff, CrashLoopBackOff.

Les Events révèlent :

  • ImagePullBackOff : image inexistante
  • CrashLoopBackOff : l’app crash au démarrage
  • FailedScheduling : pas de node disponible
  • OOMKilled : limite mémoire dépassée
Fenêtre de terminal
k get events --sort-by='.lastTimestamp'
Fenêtre de terminal
k exec -it <pod> -- /bin/sh
k exec <pod> -- ls -la /app
k exec -it <pod> -c <conteneur> -- /bin/sh # Multi-conteneur

Dans le conteneur :

Fenêtre de terminal
env # Variables d'environnement
cat /etc/resolv.conf # Config DNS
wget -qO- localhost:80 # Test local

Application Environment, Configuration and Security (25%)

Section intitulée « Application Environment, Configuration and Security (25%) »
Fenêtre de terminal
# Créer depuis littéraux
k create cm app-config --from-literal=DB_HOST=mysql --from-literal=LOG_LEVEL=debug
# Créer depuis fichier
k create cm app-config --from-file=config.properties
# Vérifier
k describe cm app-config

Piège : --from-literal pour valeurs simples, --from-file pour fichiers entiers.

Fenêtre de terminal
k create secret generic db-creds --from-literal=username=admin --from-literal=password=secret123

Piège : Les secrets sont encodés base64, pas chiffrés.

Fenêtre de terminal
k create sa my-sa

Fenêtre de terminal
# ClusterIP (défaut, interne)
k expose deploy webapp --port=80
# NodePort (externe via port du node)
k expose deploy webapp --port=80 --type=NodePort
# Avec target-port différent
k expose deploy webapp --port=8080 --target-port=80

Rappel : port = port du Service, targetPort = port du conteneur.

Fenêtre de terminal
k get svc webapp
k get endpoints webapp # Voir les Pods sélectionnés

Piège : Si ENDPOINTS est vide, les labels du Service ne matchent aucun Pod.

Fenêtre de terminal
k run test --image=busybox --rm -it -- wget -qO- webapp:80

Fenêtre de terminal
k explain pod.spec.containers
k explain pod.spec.containers.livenessProbe
k explain deployment.spec.strategy

But : Trouver la syntaxe exacte d’un champ sans mémoriser. Quand : Toujours, avant d’écrire du YAML complexe.

Fenêtre de terminal
# Vue récursive + grep
k explain pod.spec --recursive | grep -i volume
Fenêtre de terminal
k api-resources

Short names utiles : po (pods), svc (services), deploy (deployments), cm (configmaps), pvc (persistentvolumeclaims).


Fenêtre de terminal
# Vue étendue (IP, node)
k get pods -o wide
# Exporter en YAML
k get pod nginx -o yaml > pod.yaml
# JSONPath
k get pod nginx -o jsonpath='{.status.podIP}'
k get pods -o jsonpath='{.items[*].metadata.name}'
# Filtrer par label
k get pods -l app=nginx
k get pods -l 'app in (nginx,redis)'
# Tous les namespaces
k get pods -A
# Trier par date
k get pods --sort-by='.metadata.creationTimestamp'

Fenêtre de terminal
k run ... $do # Générer Pod YAML
k create deploy ... $do # Générer Deployment YAML
k expose deploy ... # Créer Service
k set image deploy ... # Mettre à jour image
k rollout status deploy ... # Suivre rollout
k rollout undo deploy ... # Rollback
k logs ... --previous # Logs après crash
k describe pod ... # État + Events
k explain ... # Syntaxe YAML
k get events # Événements cluster

Ne perdez pas de temps à mémoriser ces éléments, retrouvez-les avec kubectl explain ou dans la doc :

  • Détails d’Ingress (k explain ingress.spec)
  • Champs avancés des probes (k explain pod.spec.containers.livenessProbe)
  • Options de securityContext (k explain pod.spec.securityContext)
  • Syntaxe exacte d’un CronJob (k explain cronjob.spec)
  • Règles de NetworkPolicy (k explain networkpolicy.spec)

SymptômeCommandeCause probable
Pendingk describe podPas de node, requests trop élevées
ImagePullBackOffk describe podImage inexistante
CrashLoopBackOffk logs --previousL’app crash au démarrage
Service ne répond pask get endpointsLabels incorrects (aucun Pod sélectionné)
ConfigMap absentk get cmMauvais namespace

  1. $do génère le YAML sans créer — toujours commencer par là
  2. Vérifiez le namespace avant chaque question
  3. kubectl explain pour la syntaxe, pas la mémoire
  4. kubectl describe pour comprendre les erreurs
  5. --previous pour les logs d’un crash
  6. set image + rollout pour les mises à jour
  7. Labels = sélection (Services, Deployments)
  8. Events = diagnostic rapide du cluster

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn