
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.
Configuration initiale
Section intitulée « Configuration initiale »Ces alias sont indispensables. Configurez-les immédiatement au début de chaque session.
# Alias fondamentauxalias k=kubectlalias 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
# Éditeurexport KUBE_EDITOR=vimPremier réflexe de chaque question :
# Vérifier et changer le contextekubectl config current-contextkubectl config use-context <cluster-name>kubectl config get-contextsRéflexes par situation
Section intitulée « Réflexes par situation »Ce tableau est votre outil de diagnostic rapide. Face à un symptôme, appliquez le premier réflexe.
| Situation | Premier réflexe | Commande |
|---|---|---|
| Pod en erreur | Describe + logs previous | kubectl describe pod X puis kubectl logs X --previous |
| Node NotReady | Describe + logs kubelet | kubectl describe node X puis journalctl -u kubelet |
| Service ne répond pas | Vérifier endpoints | kubectl get endpoints X |
| PVC Pending | Vérifier PV et SC | kubectl get pv,pvc,sc puis kubectl describe pvc X |
| Scheduling échoue | Events du Pod | kubectl describe pod X → section Events |
| Cluster cassé | État global | kubectl get nodes + kubectl get pods -n kube-system |
| API server down | Static pods | crictl ps ou vérifier /etc/kubernetes/manifests/ |
| etcd cassé | Logs etcd | kubectl logs -n kube-system etcd-master |
| DNS ne résout pas | CoreDNS up? | kubectl get pods -n kube-system -l k8s-app=kube-dns |
| Permissions refusées | Test RBAC | kubectl auth can-i <verb> <resource> --as=<user> |
À connaître par cœur
Section intitulée « À connaître par cœur »Ces éléments reviennent constamment. Ne les cherchez pas pendant l’examen.
Chemins critiques
Section intitulée « Chemins critiques »# 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/configOrdre d’upgrade cluster
Section intitulée « Ordre d’upgrade cluster »- kubeadm sur le control plane
- kube-apiserver, scheduler, controller-manager (automatique via kubeadm)
- kubelet + kubectl sur le control plane
- Drain le premier worker
- kubeadm + kubelet + kubectl sur ce worker
- Uncordon ce worker
- Répéter pour chaque worker
Différences cordon / drain / uncordon
Section intitulée « Différences cordon / drain / uncordon »| Action | Scheduling | Pods existants |
|---|---|---|
cordon | ❌ Bloqué | ✅ Restent |
drain | ❌ Bloqué | ❌ Évacués |
uncordon | ✅ Autorisé | — |
Différences Role / ClusterRole
Section intitulée « Différences Role / ClusterRole »| Type | Portée | Ressources |
|---|---|---|
| Role + RoleBinding | 1 namespace | Pods, Deployments, Secrets… |
| ClusterRole + ClusterRoleBinding | Tout le cluster | Nodes, PVs, Namespaces + tout |
| ClusterRole + RoleBinding | 1 namespace | Réutilisation d’un ClusterRole, limité |
Labels PSA (Pod Security Admission)
Section intitulée « Labels PSA (Pod Security Admission) »# Appliquer la politique Restrictedkubectl label ns production pod-security.kubernetes.io/enforce=restrictedÀ retrouver dans la doc
Section intitulée « À retrouver dans la doc »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/
Commandes par domaine
Section intitulée « Commandes par domaine »kubeadm — Initialisation et upgrade
Section intitulée « kubeadm — Initialisation et upgrade »# Initialiser le control planekubeadm init --pod-network-cidr=10.244.0.0/16
# Configurer kubectl après initmkdir -p $HOME/.kubecp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# Générer la commande joinkubeadm token create --print-join-command
# Vérifier le plan d'upgradekubeadm upgrade plan
# Appliquer l'upgrade (adapter la version)kubeadm upgrade apply v1.X.0
# Upgrade d'un workerkubeadm upgrade nodePiège : Oublier de faire systemctl daemon-reload && systemctl restart kubelet après upgrade de kubelet.
Upgrade complet d’un worker
Section intitulée « Upgrade complet d’un worker »# Sur le control planekubectl drain worker1 --ignore-daemonsets --delete-emptydir-data
# Sur le workerapt-get install -y kubeadm=1.X.0-1.1kubeadm upgrade nodeapt-get install -y kubelet=1.X.0-1.1 kubectl=1.X.0-1.1systemctl daemon-reloadsystemctl restart kubelet
# Sur le control planekubectl uncordon worker1Backup etcd
Section intitulée « Backup etcd »export ETCDCTL_API=3
etcdctl snapshot save /backup/etcd-snapshot.db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.keyOù trouver les certs ? Regardez dans /etc/kubernetes/manifests/etcd.yaml.
Vérifier le backup
Section intitulée « Vérifier le backup »etcdctl snapshot status /backup/etcd-snapshot.db --write-out=tableRestore etcd
Section intitulée « Restore etcd »# 1. Arrêter l'API servermv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/
# 2. Restaurer dans un NOUVEAU répertoireetcdctl snapshot restore /backup/etcd-snapshot.db \ --data-dir=/var/lib/etcd-restore
# 3. Modifier etcd.yaml → hostPath.path: /var/lib/etcd-restore
# 4. Relancer l'API servermv /etc/kubernetes/kube-apiserver.yaml /etc/kubernetes/manifests/Piège : Restaurer directement dans /var/lib/etcd au lieu d’un nouveau répertoire.
Health check
Section intitulée « Health check »etcdctl endpoint health \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.keyGestion des nodes
Section intitulée « Gestion des nodes »# Lister avec détailskubectl get nodes -o wide
# Diagnostickubectl describe node worker1
# Labelskubectl label node worker1 disktype=ssdkubectl label node worker1 disktype- # Supprimer
# Taintskubectl taint node worker1 dedicated=database:NoSchedulekubectl taint node worker1 dedicated=database:NoSchedule- # Supprimer
# Maintenancekubectl cordon worker1kubectl drain worker1 --ignore-daemonsets --delete-emptydir-datakubectl uncordon worker1
# Métriques (Metrics Server requis)kubectl top nodeskubectl top pods --sort-by=memoryEffets des taints
Section intitulée « Effets des taints »| Effet | Comportement |
|---|---|
NoSchedule | Nouveaux Pods bloqués, existants restent |
PreferNoSchedule | Évite si possible (soft) |
NoExecute | Évacue les existants + bloque nouveaux |
Créer des Roles
Section intitulée « Créer des Roles »# Role dans un namespacekubectl create role pod-reader \ --verb=get,list,watch \ --resource=pods \ -n development
# ClusterRolekubectl create clusterrole node-reader \ --verb=get,list,watch \ --resource=nodesCréer des Bindings
Section intitulée « Créer des Bindings »# RoleBinding → userkubectl create rolebinding reader-binding \ --role=pod-reader \ --user=jane \ -n development
# RoleBinding → ServiceAccountkubectl create rolebinding sa-binding \ --role=pod-reader \ --serviceaccount=development:myapp \ -n development
# ClusterRoleBindingkubectl create clusterrolebinding admin-binding \ --clusterrole=cluster-admin \ --user=adminTester les permissions
Section intitulée « Tester les permissions »# Mes permissionskubectl auth can-i create pods
# Permissions d'un userkubectl auth can-i delete pods --as=jane -n development
# Permissions d'un ServiceAccountkubectl auth can-i list secrets \ --as=system:serviceaccount:development:myapp \ -n development
# Lister toutes les permissionskubectl auth can-i --list --as=jane -n developmentFormat ServiceAccount : system:serviceaccount:NAMESPACE:NOM
Lister RBAC existant
Section intitulée « Lister RBAC existant »kubectl get roles,rolebindings -Akubectl get clusterroles,clusterrolebindingskubectl describe role pod-reader -n developmentCréer des Services
Section intitulée « Créer des Services »# ClusterIP (défaut)kubectl expose deploy webapp --port=80 --target-port=8080
# NodePortkubectl expose deploy webapp --port=80 --type=NodePort
# Avec nom personnalisékubectl expose deploy webapp --port=80 --name=webapp-svc
# Générer YAMLkubectl expose deploy webapp --port=80 $do > svc.yamlVérifier et débugger
Section intitulée « Vérifier et débugger »# Listerkubectl get svc -o wide
# Endpoints (IPs des Pods)kubectl get endpoints webapp-svc
# Tester depuis un Podkubectl run test --image=busybox:1.36 --rm -it -- wget -qO- webapp-svc
# Test DNSkubectl run test --image=busybox:1.36 --rm -it -- nslookup webapp-svcPiège : Endpoints vide = selector ne matche aucun Pod.
DNS interne
Section intitulée « DNS interne »<service>.<namespace>.svc.cluster.local- Même namespace :
webapp-svc - Cross-namespace :
webapp-svc.production
PersistentVolume (admin)
Section intitulée « PersistentVolume (admin) »apiVersion: v1kind: PersistentVolumemetadata: name: pv-dataspec: capacity: storage: 10Gi accessModes: [ReadWriteOnce] persistentVolumeReclaimPolicy: Retain storageClassName: manual hostPath: path: /data/pvPersistentVolumeClaim (dev)
Section intitulée « PersistentVolumeClaim (dev) »apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-dataspec: accessModes: [ReadWriteOnce] resources: requests: storage: 5Gi storageClassName: manualCommandes utiles
Section intitulée « Commandes utiles »# Lister et vérifier bindingkubectl get pv,pvc
# Détailskubectl describe pvc pvc-data
# StorageClasseskubectl get sc
# SC par défautkubectl get sc -o jsonpath='{.items[?(@.metadata.annotations.storageclass\.kubernetes\.io/is-default-class=="true")].metadata.name}'Access Modes
Section intitulée « Access Modes »| Mode | Description |
|---|---|
| RWO | Read/Write par 1 node |
| ROX | Read-only par plusieurs nodes |
| RWX | Read/Write par plusieurs nodes |
Piège : PVC Pending = taille ou accessMode ou storageClassName incompatible avec les PV disponibles.
Deny all par défaut
Section intitulée « Deny all par défaut »apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-all namespace: productionspec: podSelector: {} policyTypes: [Ingress, Egress]Autoriser un trafic spécifique
Section intitulée « Autoriser un trafic spécifique »apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: allow-frontend namespace: productionspec: podSelector: matchLabels: app: backend policyTypes: [Ingress] ingress: - from: - podSelector: matchLabels: app: frontend ports: - port: 8080Vérifier
Section intitulée « Vérifier »kubectl get netpol -Akubectl describe netpol allow-frontend -n productionPiège : NetworkPolicy nécessite un CNI compatible (Calico, Cilium). Flannel seul ne les applique pas.
Troubleshooting (30% de l’examen)
Section intitulée « Troubleshooting (30% de l’examen) »Méthodologie
Section intitulée « Méthodologie »- Identifier le symptôme : Que se passe-t-il exactement ?
- Localiser le niveau : Pod, Node, ou Cluster ?
- Collecter :
describe,logs,events - Hypothèse : Quelle pourrait être la cause ?
- Corriger et vérifier
État du cluster
Section intitulée « État du cluster »# Vue d'ensemblekubectl cluster-infokubectl get nodeskubectl get pods -n kube-system
# Health checkkubectl get --raw='/readyz?verbose'Diagnostic Pod
Section intitulée « Diagnostic Pod »# Étatkubectl get pod mypod -o wide
# Détails (ESSENTIEL)kubectl describe pod mypod
# Logskubectl logs mypodkubectl logs mypod --previous # Après crashkubectl logs mypod -c container # Multi-container
# Shellkubectl exec -it mypod -- /bin/shDiagnostic Node
Section intitulée « Diagnostic Node »# Depuis le control planekubectl describe node worker1
# Sur le node problématiquesystemctl status kubeletjournalctl -u kubelet | tail -50journalctl -u kubelet --since "10 minutes ago" | grep -i errorDiagnostic composants control plane
Section intitulée « Diagnostic composants control plane »# Logs des static podskubectl logs -n kube-system kube-apiserver-masterkubectl logs -n kube-system etcd-masterkubectl logs -n kube-system kube-scheduler-masterkubectl logs -n kube-system kube-controller-manager-master
# Ou directement sur le nodecrictl pscat /var/log/pods/kube-system_kube-apiserver-*/kube-apiserver/*.logProblèmes courants et solutions
Section intitulée « Problèmes courants et solutions »| Symptôme | Cause probable | Solution |
|---|---|---|
Pod Pending | Pas de node eligible | Vérifier taints, resources, nodeSelector |
Pod ImagePullBackOff | Image inexistante ou credentials | Vérifier nom image, registry secret |
Pod CrashLoopBackOff | App crash | kubectl logs --previous |
Pod CreateContainerConfigError | ConfigMap/Secret manquant | kubectl describe pod → Events |
Node NotReady | kubelet down | systemctl restart kubelet |
Node MemoryPressure | RAM saturée | Évacuer des Pods |
| Service non accessible | Endpoints vide | Vérifier selector vs labels Pods |
| DNS timeout | CoreDNS down | Vérifier Pods kube-dns |
kubectl timeout | API server down | Vérifier /etc/kubernetes/manifests/ |
Génération YAML rapide
Section intitulée « Génération YAML rapide »# Podkubectl run nginx --image=nginx $do > pod.yaml
# Deploymentkubectl create deploy webapp --image=nginx --replicas=3 $do > deploy.yaml
# Servicekubectl expose deploy webapp --port=80 $do > svc.yaml
# Jobkubectl create job myjob --image=busybox -- /bin/sh -c "echo hello" $do
# CronJobkubectl create cronjob mycron --image=busybox --schedule="*/5 * * * *" -- date $do
# ConfigMapkubectl create cm myconfig --from-literal=key=value $do
# Secretkubectl create secret generic mysecret --from-literal=password=secret $do
# Rolekubectl create role myrole --verb=get,list --resource=pods $do
# RoleBindingkubectl create rolebinding mybinding --role=myrole --user=jane $do
# ServiceAccountkubectl create sa mysa $doCheatsheet condensée
Section intitulée « Cheatsheet condensée »# === CONTEXTE ===kubectl config use-context <cluster>kubectl config set-context --current --namespace=<ns>
# === CLUSTER ===kubeadm init --pod-network-cidr=10.244.0.0/16kubeadm token create --print-join-commandkubeadm upgrade plan && kubeadm upgrade apply v1.X.0
# === ETCD ===export ETCDCTL_API=3etcdctl 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:NoSchedulekubectl label node <node> disktype=ssd
# === RBAC ===kubectl create role <name> --verb=get,list --resource=podskubectl 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> --previousjournalctl -u kubelet | grep errorsystemctl restart kubeletÀ retenir
Section intitulée « À retenir »- Alias + autocomplétion : configurez-les immédiatement à chaque session
- Contexte : vérifiez-le avant chaque question
- etcd : mémorisez le chemin des certs (
/etc/kubernetes/pki/etcd/) - Upgrade : control plane d’abord, puis workers avec drain/uncordon
- RBAC : Role = namespace, ClusterRole = cluster
- Troubleshooting = 30% : maîtrisez describe, logs, events, journalctl
- Static pods : manifests dans
/etc/kubernetes/manifests/ - Génération YAML : utilisez
$dosystématiquement