Aller au contenu
Conteneurs & Orchestration medium

Commandes essentielles CKA, Cheatsheet enrichie

20 min de lecture

logo kubernetes

Cette page est une référence opérationnelle pour la CKA. Elle contient les commandes essentielles organisées par domaine d'examen, avec le contexte d'usage et les pièges à éviter.

Pour les explications détaillées, consultez les guides dédiés (kubeadm, etcd, RBAC, etc.). Ici, l'objectif est de mémoriser les commandes et les réflexes.

Ces alias sont indispensables. Configurez-les immédiatement au début de chaque session.

Fenêtre de terminal
# Alias fondamentaux
alias k=kubectl
alias kn='kubectl config set-context --current --namespace'
export do="--dry-run=client -o yaml"
# Autocomplétion (OBLIGATOIRE)
source <(kubectl completion bash)
complete -F __start_kubectl k
# Éditeur
export KUBE_EDITOR=vim

Premier réflexe de chaque question :

Fenêtre de terminal
# Vérifier et changer le contexte
kubectl config current-context
kubectl config use-context <cluster-name>
kubectl config get-contexts

Ce tableau est votre outil de diagnostic rapide. Face à un symptôme, appliquez le premier réflexe.

SituationPremier réflexeCommande
Pod en erreurDescribe + logs previouskubectl describe pod X puis kubectl logs X --previous
Node NotReadyDescribe + logs kubeletkubectl describe node X puis journalctl -u kubelet
Service ne répond pasVérifier endpointskubectl get endpoints X
PVC PendingVérifier PV et SCkubectl get pv,pvc,sc puis kubectl describe pvc X
Scheduling échoueEvents du Podkubectl describe pod X → section Events
Cluster casséÉtat globalkubectl get nodes + kubectl get pods -n kube-system
API server downStatic podscrictl ps ou vérifier /etc/kubernetes/manifests/
etcd casséLogs etcdkubectl logs -n kube-system etcd-master
DNS ne résout pasCoreDNS up?kubectl get pods -n kube-system -l k8s-app=kube-dns
Permissions refuséesTest RBACkubectl auth can-i <verb> <resource> --as=<user>

Ces éléments reviennent constamment. Ne les cherchez pas pendant l'examen.

Ces emplacements sont ceux d'un cluster installé par kubeadm. Le premier compte le plus en dépannage : le kubelet relit /etc/kubernetes/manifests/ en continu, déplacer un fichier hors de ce répertoire suffit à arrêter le composant correspondant.

Fenêtre de terminal
# Static pods (control plane)
/etc/kubernetes/manifests/
# Certificats PKI
/etc/kubernetes/pki/
# Certificats etcd
/etc/kubernetes/pki/etcd/
# Configuration kubelet
/var/lib/kubelet/config.yaml
/etc/kubernetes/kubelet.conf
# Kubeconfig admin
/etc/kubernetes/admin.conf
~/.kube/config

L'ordre n'est pas négociable : l'API server ne doit jamais être plus ancien que les kubelets qui s'y connectent. Les workers passent un par un, chacun encadré d'un drain et d'un uncordon, pour que les applications restent disponibles pendant l'opération.

  1. kubeadm sur le control plane
  2. kube-apiserver, scheduler, controller-manager (automatique via kubeadm)
  3. kubelet + kubectl sur le control plane
  4. Drain le premier worker
  5. kubeadm + kubelet + kubectl sur ce worker
  6. Uncordon ce worker
  7. Répéter pour chaque worker

La confusion porte sur cordon, qui interdit l'arrivée de nouveaux pods mais laisse tourner ceux déjà présents. Seul drain évacue réellement le nœud, et il s'interrompt tant que les pods de DaemonSet ou les volumes emptyDir n'ont pas été explicitement acceptés par une option.

ActionSchedulingPods existants
cordon❌ Bloqué✅ Restent
drain❌ Bloqué❌ Évacués
uncordon✅ Autorisésans objet

La troisième ligne est celle qui piège : un ClusterRole associé à un RoleBinding ne donne des droits que dans le namespace du binding. Ce montage sert à réutiliser une définition de permissions sans la recopier namespace par namespace.

TypePortéeRessources
Role + RoleBinding1 namespacePods, Deployments, Secrets...
ClusterRole + ClusterRoleBindingTout le clusterNodes, PVs, Namespaces + tout
ClusterRole + RoleBinding1 namespaceRéutilisation d'un ClusterRole, limité

Pod Security Admission s'active par un simple label de namespace, sans rien installer. Les modes enforce, audit et warn sont indépendants : seul enforce rejette réellement un pod non conforme.

Fenêtre de terminal
# Appliquer la politique Restricted
kubectl label ns production pod-security.kubernetes.io/enforce=restricted

Ces éléments sont plus complexes. Copiez-les depuis kubernetes.io le jour J.

  • Syntaxe complète d'un Ingress avec TLS
  • Champs avancés d'une NetworkPolicy (namespaceSelector, ipBlock)
  • Options de kubeadm init avancées (HA, --upload-certs)
  • Configuration EncryptionConfiguration pour secrets etcd
  • Syntaxe PodDisruptionBudget

Bookmark recommandés :

  • kubernetes.io/docs/reference/kubectl/quick-reference/
  • kubernetes.io/docs/concepts/security/
  • kubernetes.io/docs/tasks/administer-cluster/

Les onglets reprennent le découpage des domaines de l'examen. Chacun regroupe les commandes réellement utilisées en épreuve, suivies des pièges signalés sous les blocs : ce sont eux qui coûtent des points, rarement la syntaxe de base.

kubeadm init installe le control plane mais laisse le cluster sans réseau : les nœuds restent NotReady tant qu'aucun CNI n'est déployé. La valeur de --pod-network-cidr doit correspondre à celle attendue par ce CNI.

Fenêtre de terminal
# Initialiser le control plane
kubeadm init --pod-network-cidr=10.244.0.0/16
# Configurer kubectl après init
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# Générer la commande join
kubeadm token create --print-join-command
# Vérifier le plan d'upgrade
kubeadm upgrade plan
# Appliquer l'upgrade (adapter la version)
kubeadm upgrade apply v1.X.0
# Upgrade d'un worker
kubeadm upgrade node

Piège : Oublier de faire systemctl daemon-reload && systemctl restart kubelet après upgrade de kubelet.

La séquence alterne entre deux machines : drain et uncordon s'exécutent depuis le control plane, l'installation des paquets sur le worker. kubeadm upgrade node met à jour la configuration locale, il ne remplace pas le paquet kubelet, d'où la ligne apt-get qui suit.

Fenêtre de terminal
# Sur le control plane
kubectl drain worker1 --ignore-daemonsets --delete-emptydir-data
# Sur le worker
apt-get install -y kubeadm=1.X.0-1.1
kubeadm upgrade node
apt-get install -y kubelet=1.X.0-1.1 kubectl=1.X.0-1.1
systemctl daemon-reload
systemctl restart kubelet
# Sur le control plane
kubectl uncordon worker1

Les questions de ce domaine portent rarement sur une commande isolée : il faut localiser la panne avant de la corriger. La démarche descend du cluster vers le nœud puis vers le pod, chaque niveau ayant ses outils propres, kubectl d'un côté, journalctl et crictl de l'autre quand l'API ne répond plus.

Ces cinq étapes écartent l'erreur la plus coûteuse en épreuve : corriger au hasard sans avoir lu les événements. Le niveau identifié à la deuxième étape commande les outils, un défaut de kubelet ne laissant aucune trace dans kubectl logs.

  1. Identifier le symptôme : Que se passe-t-il exactement ?
  2. Localiser le niveau : Pod, Node, ou Cluster ?
  3. Collecter : describe, logs, events
  4. Hypothèse : Quelle pourrait être la cause ?
  5. Corriger et vérifier

cluster-info confirme que l'API server répond, get nodes que les kubelets s'y enregistrent. L'appel --raw='/readyz?verbose' détaille chaque contrôle interne du serveur et désigne le sous-système en échec.

Fenêtre de terminal
# Vue d'ensemble
kubectl cluster-info
kubectl get nodes
kubectl get pods -n kube-system
# Health check
kubectl get --raw='/readyz?verbose'

describe passe avant logs : la section Events explique les échecs survenus avant même le démarrage du conteneur, image introuvable ou volume non monté, cas où aucun log n'existe. L'option --previous est le seul moyen de lire la sortie d'un conteneur déjà redémarré.

Fenêtre de terminal
# État
kubectl get pod mypod -o wide
# Détails (ESSENTIEL)
kubectl describe pod mypod
# Logs
kubectl logs mypod
kubectl logs mypod --previous # Après crash
kubectl logs mypod -c container # Multi-container
# Shell
kubectl exec -it mypod -- /bin/sh

Un nœud NotReady se diagnostique depuis la machine elle-même : describe node liste les conditions rapportées, mais la cause figure dans le journal du kubelet. Le filtre par fenêtre de temps évite de remonter des erreurs sans rapport avec l'incident en cours.

Fenêtre de terminal
# Depuis le control plane
kubectl describe node worker1
# Sur le node problématique
systemctl status kubelet
journalctl -u kubelet | tail -50
journalctl -u kubelet --since "10 minutes ago" | grep -i error

Ces composants tournent en static pods, pilotés par le kubelet et non par l'API. Quand kubectl ne répond plus, crictl ps et les fichiers de /var/log/pods/ deviennent les seules sources d'information disponibles sur le nœud.

Fenêtre de terminal
# Logs des static pods
kubectl logs -n kube-system kube-apiserver-master
kubectl logs -n kube-system etcd-master
kubectl logs -n kube-system kube-scheduler-master
kubectl logs -n kube-system kube-controller-manager-master
# Ou directement sur le node
crictl ps
cat /var/log/pods/kube-system_kube-apiserver-*/kube-apiserver/*.log

Ce tableau se lit du symptôme vers la cause : l'état affiché par kubectl get pods restreint déjà fortement les hypothèses. CreateContainerConfigError et ImagePullBackOff se distinguent ainsi d'emblée, le premier venant d'un ConfigMap ou d'un Secret absent, le second du registry.

SymptômeCause probableSolution
Pod PendingPas de node eligibleVérifier taints, resources, nodeSelector
Pod ImagePullBackOffImage inexistante ou credentialsVérifier nom image, registry secret
Pod CrashLoopBackOffApp crashkubectl logs --previous
Pod CreateContainerConfigErrorConfigMap/Secret manquantkubectl describe pod → Events
Node NotReadykubelet downsystemctl restart kubelet
Node MemoryPressureRAM saturéeÉvacuer des Pods
Service non accessibleEndpoints videVérifier selector vs labels Pods
DNS timeoutCoreDNS downVérifier Pods kube-dns
kubectl timeoutAPI server downVérifier /etc/kubernetes/manifests/

La variable $do définie au début de la page ajoute --dry-run=client -o yaml : la ressource n'est pas créée, son manifest part sur la sortie standard. C'est la technique la plus rentable de l'épreuve, produire un squelette valide puis l'éditer coûtant bien moins de temps qu'écrire le YAML de mémoire.

Fenêtre de terminal
# Pod
kubectl run nginx --image=nginx $do > pod.yaml
# Deployment
kubectl create deploy webapp --image=nginx --replicas=3 $do > deploy.yaml
# Service
kubectl expose deploy webapp --port=80 $do > svc.yaml
# Job
kubectl create job myjob --image=busybox -- /bin/sh -c "echo hello" $do
# CronJob
kubectl create cronjob mycron --image=busybox --schedule="*/5 * * * *" -- date $do
# ConfigMap
kubectl create cm myconfig --from-literal=key=value $do
# Secret
kubectl create secret generic mysecret --from-literal=password=secret $do
# Role
kubectl create role myrole --verb=get,list --resource=pods $do
# RoleBinding
kubectl create rolebinding mybinding --role=myrole --user=jane $do
# ServiceAccount
kubectl create sa mysa $do

Ce bloc rassemble les commandes des sections précédentes pour une relecture rapide avant l'épreuve. Les valeurs entre chevrons sont à remplacer, et les points de suspension d'etcdctl masquent les options de certificats qui, elles, ne peuvent pas être omises.

Fenêtre de terminal
# === CONTEXTE ===
kubectl config use-context <cluster>
kubectl config set-context --current --namespace=<ns>
# === CLUSTER ===
kubeadm init --pod-network-cidr=10.244.0.0/16
kubeadm token create --print-join-command
kubeadm upgrade plan && kubeadm upgrade apply v1.X.0
# === ETCD ===
export ETCDCTL_API=3
etcdctl snapshot save /backup/snap.db --endpoints=... --cacert=... --cert=... --key=...
etcdctl snapshot restore /backup/snap.db --data-dir=/var/lib/etcd-new
# === NODES ===
kubectl cordon/drain/uncordon <node>
kubectl taint node <node> key=value:NoSchedule
kubectl label node <node> disktype=ssd
# === RBAC ===
kubectl create role <name> --verb=get,list --resource=pods
kubectl create rolebinding <name> --role=<role> --user=<user>
kubectl auth can-i create pods --as=jane
# === TROUBLESHOOT ===
kubectl describe pod/node/svc <name>
kubectl logs <pod> --previous
journalctl -u kubelet | grep error
systemctl restart kubelet

Les deux premiers points s'appliquent avant même de lire une question : sans alias ni autocomplétion le temps manque, et une réponse juste exécutée dans le mauvais contexte ne rapporte rien. Le reste se retient par la pratique, pas par la relecture.

  1. Alias + autocomplétion : configurez-les immédiatement à chaque session
  2. Contexte : vérifiez-le avant chaque question
  3. etcd : mémorisez le chemin des certs (/etc/kubernetes/pki/etcd/)
  4. Upgrade : control plane d'abord, puis workers avec drain/uncordon
  5. RBAC : Role = namespace, ClusterRole = cluster
  6. Troubleshooting = 30% : maîtrisez describe, logs, events, journalctl
  7. Static pods : manifests dans /etc/kubernetes/manifests/
  8. Génération YAML : utilisez $do systématiquement

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn