
Entraînement brutal, précis, rapide. Chaque exercice reproduit le format CKA : énoncé court, objectif observable, contrainte de temps. Visez 80% de réussite.
Réflexes CKA
Section intitulée « Réflexes CKA »Configurez votre environnement avant de commencer :
# Alias essentielsalias k=kubectlalias kn='kubectl config set-context --current --namespace'alias kgp='kubectl get pods'alias kgn='kubectl get nodes'export do="--dry-run=client -o yaml"export now="--force --grace-period=0"
# Autocomplétionsource <(kubectl completion bash)complete -F __start_kubectl k
# Namespace de travailkubectl create ns cka-exerciseskn cka-exercisesCluster Architecture (25%)
Section intitulée « Cluster Architecture (25%) »Exercice 1 : Upgrade du cluster [kubeadm]
Section intitulée « Exercice 1 : Upgrade du cluster [kubeadm] »Temps cible : 15 minutes
| Contexte | Cluster kubeadm en version 1.30.x |
|---|---|
| Tâche | Upgrade le control plane et un worker vers la dernière version patch de 1.31 |
| Contrainte | Utiliser les versions disponibles dans le repo apt |
| Validation | kubectl get nodes affiche tous les nodes en v1.31.x |
Solution
# 1. Identifier la dernière version patch disponibleapt updateapt-cache madison kubeadm | grep 1.31# Exemple : 1.31.4-1.1
# 2. Sur le control planeapt-get install -y kubeadm=1.31.4-1.1kubeadm upgrade plankubeadm upgrade apply v1.31.4
apt-get install -y kubelet=1.31.4-1.1 kubectl=1.31.4-1.1systemctl daemon-reload && systemctl restart kubelet
# 3. Drain le worker depuis le control planekubectl drain worker1 --ignore-daemonsets --delete-emptydir-data
# 4. Sur le worker (via SSH)apt-get install -y kubeadm=1.31.4-1.1kubeadm upgrade nodeapt-get install -y kubelet=1.31.4-1.1systemctl daemon-reload && systemctl restart kubelet
# 5. Uncordon depuis le control planekubectl uncordon worker1kubectl get nodesPoint clé : Toujours upgrader vers la dernière version patch (1.31.4), pas la version .0.
Exercice 2 : Backup etcd [kubeadm]
Section intitulée « Exercice 2 : Backup etcd [kubeadm] »Temps cible : 6 minutes
| Contexte | Cluster kubeadm standard |
|---|---|
| Tâche | Créer un snapshot etcd dans /opt/backup/etcd-snapshot.db |
| Contrainte | Certificats dans /etc/kubernetes/pki/etcd/ |
| Validation | etcdctl snapshot status /opt/backup/etcd-snapshot.db --write-out=table affiche les infos |
Solution
export ETCDCTL_API=3mkdir -p /opt/backup
etcdctl snapshot save /opt/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.key
# Validationetcdctl snapshot status /opt/backup/etcd-snapshot.db --write-out=tableExercice 3 : Restore etcd [kubeadm]
Section intitulée « Exercice 3 : Restore etcd [kubeadm] »Temps cible : 10 minutes
| Contexte | Snapshot etcd disponible dans /opt/backup/etcd-snapshot.db |
|---|---|
| Tâche | Restaurer etcd vers /var/lib/etcd-restore et reconfigurer le cluster |
| Contrainte | Utiliser etcdutl (pas etcdctl restore qui est déprécié) |
| Validation | kubectl get pods -n kube-system fonctionne après la restauration |
Solution
# 1. Arrêter l'API server (déplacer le manifest)mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
# 2. Restore avec etcdutl (pas etcdctl !)etcdutl snapshot restore /opt/backup/etcd-snapshot.db \ --data-dir=/var/lib/etcd-restore
# 3. Modifier le manifest etcd pour pointer vers le nouveau répertoiresed -i 's|/var/lib/etcd|/var/lib/etcd-restore|g' /etc/kubernetes/manifests/etcd.yaml
# 4. Remettre l'API servermv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
# 5. Attendre que les composants redémarrent (~30 secondes)sleep 30kubectl get pods -n kube-systemPoint clé : etcdctl snapshot restore est déprécié depuis etcd 3.5. Utiliser etcdutl snapshot restore.
RBAC (partie de Cluster Architecture)
Section intitulée « RBAC (partie de Cluster Architecture) »Exercice 4 : Role et RoleBinding
Section intitulée « Exercice 4 : Role et RoleBinding »Temps cible : 4 minutes
| Contexte | Namespace cka-exercises |
|---|---|
| Tâche | Créer un Role pod-reader (get, list, watch pods) et un RoleBinding read-pods pour l’utilisateur jane |
| Validation | kubectl auth can-i list pods -n cka-exercises --as=jane retourne yes |
Solution
kubectl create role pod-reader \ --verb=get,list,watch \ --resource=pods \ -n cka-exercises
kubectl create rolebinding read-pods \ --role=pod-reader \ --user=jane \ -n cka-exercises
# Validationkubectl auth can-i list pods -n cka-exercises --as=jane # yeskubectl auth can-i delete pods -n cka-exercises --as=jane # noExercice 5 : ClusterRole pour nodes
Section intitulée « Exercice 5 : ClusterRole pour nodes »Temps cible : 4 minutes
| Contexte | Ressource cluster-wide : nodes |
|---|---|
| Tâche | Créer un ClusterRole node-viewer (get, list, watch nodes) et un ClusterRoleBinding node-view-binding pour l’utilisateur bob |
| Validation | kubectl auth can-i list nodes --as=bob retourne yes |
Solution
kubectl create clusterrole node-viewer \ --verb=get,list,watch \ --resource=nodes
kubectl create clusterrolebinding node-view-binding \ --clusterrole=node-viewer \ --user=bob
# Validationkubectl auth can-i list nodes --as=bob # yeskubectl auth can-i delete nodes --as=bob # noExercice 6 : ServiceAccount avec permissions
Section intitulée « Exercice 6 : ServiceAccount avec permissions »Temps cible : 5 minutes
| Contexte | Namespace cka-exercises |
|---|---|
| Tâche | Créer un ServiceAccount app-sa, un Role secret-reader (get, list secrets), les lier, et créer un Pod app-pod utilisant ce SA |
| Contrainte | Le Pod doit utiliser serviceAccountName dans le YAML (pas le flag déprécié --serviceaccount) |
| Validation | kubectl auth can-i list secrets --as=system:serviceaccount:cka-exercises:app-sa -n cka-exercises retourne yes |
Solution
# ServiceAccountkubectl create sa app-sa -n cka-exercises
# Rolekubectl create role secret-reader \ --verb=get,list \ --resource=secrets \ -n cka-exercises
# RoleBindingkubectl create rolebinding app-secret-binding \ --role=secret-reader \ --serviceaccount=cka-exercises:app-sa \ -n cka-exercises
# Pod avec serviceAccountName (pas --serviceaccount qui est déprécié)kubectl apply -f - <<'EOF'apiVersion: v1kind: Podmetadata: name: app-pod namespace: cka-exercisesspec: serviceAccountName: app-sa containers: - name: nginx image: nginxEOF
# Validationkubectl auth can-i list secrets \ --as=system:serviceaccount:cka-exercises:app-sa \ -n cka-exercisesPoint clé : Le flag --serviceaccount de kubectl run est déprécié. Utiliser un manifest YAML avec serviceAccountName.
Workloads & Scheduling (15%)
Section intitulée « Workloads & Scheduling (15%) »Exercice 7 : Taints, Tolerations et placement garanti
Section intitulée « Exercice 7 : Taints, Tolerations et placement garanti »Temps cible : 6 minutes
| Contexte | Node worker1 disponible |
|---|---|
| Tâche | Ajouter un taint env=prod:NoSchedule sur worker1, créer un Pod prod-app qui tolère ce taint et qui est garanti d’être placé sur worker1 |
| Contrainte | La toleration seule ne garantit pas le placement — il faut aussi un nodeSelector |
| Validation | kubectl get pod prod-app -o wide montre worker1 dans la colonne NODE |
Solution
# Taintkubectl taint node worker1 env=prod:NoSchedule
# Pod avec toleration ET nodeSelectorkubectl apply -f - <<'EOF'apiVersion: v1kind: Podmetadata: name: prod-app namespace: cka-exercisesspec: nodeSelector: kubernetes.io/hostname: worker1 tolerations: - key: env operator: Equal value: prod effect: NoSchedule containers: - name: nginx image: nginxEOF
# Validationkubectl get pod prod-app -n cka-exercises -o wide | grep worker1
# Nettoyagekubectl taint node worker1 env-Point clé : Une toleration permet de scheduler sur un node tainté, mais ne garantit pas le placement. Pour garantir, ajouter un nodeSelector ou nodeAffinity.
Exercice 8 : Node Affinity
Section intitulée « Exercice 8 : Node Affinity »Temps cible : 5 minutes
| Contexte | Node worker1 disponible |
|---|---|
| Tâche | Labeler worker1 avec disktype=ssd, créer un Deployment storage-app (3 replicas, nginx) qui préfère les nodes avec ce label |
| Validation | kubectl get pods -o wide montre les pods sur worker1 (si disponible) |
Solution
# Labelkubectl label node worker1 disktype=ssd
# Deploymentkubectl apply -f - <<'EOF'apiVersion: apps/v1kind: Deploymentmetadata: name: storage-app namespace: cka-exercisesspec: replicas: 3 selector: matchLabels: app: storage-app template: metadata: labels: app: storage-app spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: disktype operator: In values: - ssd containers: - name: nginx image: nginxEOF
# Validationkubectl get pods -n cka-exercises -o wideExercice 9 : Drain et Cordon
Section intitulée « Exercice 9 : Drain et Cordon »Temps cible : 3 minutes
| Contexte | Node worker1 avec des pods |
|---|---|
| Tâche | Cordon, drain, puis uncordon worker1 |
| Validation | kubectl get nodes montre worker1 Ready sans SchedulingDisabled |
Solution
kubectl cordon worker1kubectl drain worker1 --ignore-daemonsets --delete-emptydir-datakubectl uncordon worker1kubectl get nodesServices & Networking (20%)
Section intitulée « Services & Networking (20%) »Exercice 10 : Service ClusterIP
Section intitulée « Exercice 10 : Service ClusterIP »Temps cible : 3 minutes
| Contexte | Namespace cka-exercises |
|---|---|
| Tâche | Créer un Deployment web (2 replicas, nginx), l’exposer en ClusterIP sur port 80 |
| Validation | kubectl run test --rm -it --image=busybox:1.36 -- wget -qO- web retourne du HTML |
Solution
kubectl create deploy web --image=nginx --replicas=2 -n cka-exerciseskubectl expose deploy web --port=80 -n cka-exercises
# Validationkubectl run test --rm -it --image=busybox:1.36 -n cka-exercises -- wget -qO- webExercice 11 : NetworkPolicy Deny All
Section intitulée « Exercice 11 : NetworkPolicy Deny All »Temps cible : 4 minutes
| Contexte | Namespace cka-exercises avec le Deployment web |
|---|---|
| Tâche | Créer une NetworkPolicy deny-all bloquant tout trafic ingress et egress dans le namespace |
| Validation | kubectl describe netpol deny-all montre Allowing ingress traffic: <none> |
Solution
kubectl apply -f - <<'EOF'apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-all namespace: cka-exercisesspec: podSelector: {} policyTypes: - Ingress - EgressEOF
# Validationkubectl describe netpol deny-all -n cka-exercisesExercice 12 : NetworkPolicy Allow specific
Section intitulée « Exercice 12 : NetworkPolicy Allow specific »Temps cible : 6 minutes
| Contexte | Deployment web avec label app=web dans cka-exercises |
|---|---|
| Tâche | Créer une NetworkPolicy allow-frontend autorisant le trafic ingress sur port 80 uniquement depuis les pods avec label role=frontend |
| Contrainte | Le podSelector de la policy doit cibler app=web |
| Validation | Un pod avec role=frontend peut accéder à web, un pod sans ce label ne peut pas |
Solution
kubectl apply -f - <<'EOF'apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: allow-frontend namespace: cka-exercisesspec: podSelector: matchLabels: app: web policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 80EOF
# Test positifkubectl run frontend --image=busybox:1.36 -n cka-exercises \ --labels="role=frontend" --rm -it -- wget -qO- --timeout=2 web
# Test négatif (doit timeout)kubectl run other --image=busybox:1.36 -n cka-exercises \ --rm -it -- wget -qO- --timeout=2 webPoint clé : Vérifier que les labels dans le podSelector correspondent aux labels réels des pods target.
Exercice 13 : Ingress
Section intitulée « Exercice 13 : Ingress »Temps cible : 5 minutes
| Contexte | Service web exposé sur port 80 |
|---|---|
| Tâche | Créer un Ingress web-ingress routant web.example.com/ vers le service web port 80 |
| Contrainte | Utiliser ingressClassName: nginx |
| Validation | kubectl get ingress web-ingress montre l’Ingress créé |
Solution
kubectl apply -f - <<'EOF'apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: web-ingress namespace: cka-exercisesspec: ingressClassName: nginx rules: - host: web.example.com http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80EOF
# Validationkubectl get ingress web-ingress -n cka-exercisesStorage (10%)
Section intitulée « Storage (10%) »Exercice 14 : PersistentVolume et PVC
Section intitulée « Exercice 14 : PersistentVolume et PVC »Temps cible : 7 minutes
| Contexte | StorageClass manual pour hostPath |
|---|---|
| Tâche | Créer un PV pv-data (1Gi, RWO, hostPath /data/pv-data), un PVC pvc-data (500Mi), et un Pod storage-pod montant le PVC |
| Validation | kubectl get pv montre BOUND, kubectl get pvc -n cka-exercises montre BOUND |
Solution
# PV (cluster-scoped, pas de namespace)kubectl apply -f - <<'EOF'apiVersion: v1kind: PersistentVolumemetadata: name: pv-dataspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: manual hostPath: path: /data/pv-dataEOF
# PVC (namespaced)kubectl apply -f - <<'EOF'apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-data namespace: cka-exercisesspec: accessModes: - ReadWriteOnce resources: requests: storage: 500Mi storageClassName: manualEOF
# Podkubectl apply -f - <<'EOF'apiVersion: v1kind: Podmetadata: name: storage-pod namespace: cka-exercisesspec: containers: - name: app image: nginx volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: pvc-dataEOF
# Validationkubectl get pv # cluster-scopedkubectl get pvc -n cka-exercises # namespacedPoint clé : Les PV sont cluster-scoped (kubectl get pv sans -n). Les PVC sont namespaced (kubectl get pvc -n <ns>).
Troubleshooting (30%)
Section intitulée « Troubleshooting (30%) »C’est le domaine le plus important de l’examen : 30% des points.
Exercice 15 : Pod ImagePullBackOff
Section intitulée « Exercice 15 : Pod ImagePullBackOff »Temps cible : 3 minutes
| Contexte | Pod broken-pod avec image nginx:nonexistent-tag |
|---|---|
| Tâche | Diagnostiquer et corriger le Pod |
| Validation | kubectl get pod broken-pod montre Running |
Solution
# Créer le problèmekubectl run broken-pod --image=nginx:nonexistent-tag -n cka-exercises
# Diagnostickubectl get pod broken-pod -n cka-exerciseskubectl describe pod broken-pod -n cka-exercises | tail -10
# Correctionkubectl set image pod/broken-pod broken-pod=nginx -n cka-exercises
# Validationkubectl get pod broken-pod -n cka-exercisesExercice 16 : Node NotReady [kubeadm]
Section intitulée « Exercice 16 : Node NotReady [kubeadm] »Temps cible : 8 minutes
| Contexte | Node worker1 en status NotReady |
|---|---|
| Tâche | Identifier la cause et réparer le node |
| Simulation | Sur worker1 : systemctl stop kubelet |
| Validation | kubectl get nodes montre worker1 Ready |
Solution
# Diagnostic depuis le control planekubectl get nodeskubectl describe node worker1 | grep -A5 Conditions
# SSH vers le workerssh worker1
# Vérifier kubeletsystemctl status kubeletjournalctl -u kubelet --since "5 minutes ago" | tail -20
# Réparersystemctl start kubeletsystemctl status kubelet
# Retour sur le control planeexitkubectl get nodesExercice 17 : Service sans endpoints
Section intitulée « Exercice 17 : Service sans endpoints »Temps cible : 4 minutes
| Contexte | Service broken-svc avec selector app=myapp, Pod avec label application=myapp |
|---|---|
| Tâche | Diagnostiquer pourquoi le Service n’a pas d’endpoints et corriger |
| Validation | kubectl get endpoints broken-svc montre une IP |
Solution
# Créer le problèmekubectl apply -f - <<'EOF'apiVersion: v1kind: Servicemetadata: name: broken-svc namespace: cka-exercisesspec: selector: app: myapp ports: - port: 80---apiVersion: v1kind: Podmetadata: name: myapp-pod namespace: cka-exercises labels: application: myappspec: containers: - name: nginx image: nginxEOF
# Diagnostickubectl get endpoints broken-svc -n cka-exerciseskubectl describe svc broken-svc -n cka-exercises | grep Selectorkubectl get pod myapp-pod -n cka-exercises --show-labels
# Correction (labels ne matchent pas)kubectl label pod myapp-pod -n cka-exercises app=myapp
# Validationkubectl get endpoints broken-svc -n cka-exercisesExercice 18 : kubelet ne démarre pas [kubeadm]
Section intitulée « Exercice 18 : kubelet ne démarre pas [kubeadm] »Temps cible : 8 minutes
| Contexte | Node worker ne rejoint pas le cluster |
|---|---|
| Tâche | Le kubelet ne démarre pas. Identifier la cause et réparer |
| Indices | Vérifier les logs kubelet avec journalctl -u kubelet |
| Validation | kubectl get nodes montre le node Ready |
Solution
# Sur le worker - vérifier le statussystemctl status kubelet
# Voir les logsjournalctl -u kubelet --no-pager | tail -50
# Causes courantes et corrections :# 1. Fichier de config manquantls -la /var/lib/kubelet/config.yamlls -la /etc/kubernetes/kubelet.conf
# 2. Container runtime non démarrésystemctl status containerdsystemctl start containerd
# 3. Swap activé (interdit par défaut)swapoff -a
# 4. Erreur de configurationcat /var/lib/kubelet/config.yaml
# Redémarrer kubelet après correctionsystemctl restart kubeletsystemctl status kubeletExercice 19 : API Server inaccessible [kubeadm]
Section intitulée « Exercice 19 : API Server inaccessible [kubeadm] »Temps cible : 10 minutes
| Contexte | kubectl retourne connection refused |
|---|---|
| Tâche | L’API Server ne répond pas. Diagnostiquer et réparer |
| Simulation | Modifier /etc/kubernetes/manifests/kube-apiserver.yaml pour introduire une erreur |
| Validation | kubectl get nodes fonctionne |
Solution
# 1. Vérifier si le container tournecrictl ps | grep kube-apiserver# Si vide → le pod static n'a pas démarré
# 2. Vérifier les logs du container mortcrictl ps -a | grep kube-apiservercrictl logs <container-id>
# Ou via les logs du pod staticls /var/log/pods/kube-system_kube-apiserver-*/cat /var/log/pods/kube-system_kube-apiserver-*/kube-apiserver/*.log | tail -50
# 3. Vérifier le manifestcat /etc/kubernetes/manifests/kube-apiserver.yaml
# Erreurs courantes :# - Port incorrect (--secure-port)# - Chemin de certificat erroné (--tls-cert-file)# - Typo dans une option
# 4. Corriger le manifestvim /etc/kubernetes/manifests/kube-apiserver.yaml
# 5. Le kubelet redémarre automatiquement le pod static# Attendre 30-60 secondessleep 30
# 6. Validationkubectl get nodesPoint clé : Les composants du control plane sont des pods statiques. Modifier le manifest dans /etc/kubernetes/manifests/ déclenche un redémarrage automatique par le kubelet.
Exercice 20 : CoreDNS — Pods en crash
Section intitulée « Exercice 20 : CoreDNS — Pods en crash »Temps cible : 5 minutes
| Contexte | La résolution DNS ne fonctionne pas |
|---|---|
| Tâche | Les pods CoreDNS sont en CrashLoopBackOff. Diagnostiquer et réparer |
| Validation | kubectl run test --rm -it --image=busybox:1.36 -- nslookup kubernetes retourne une IP |
Solution
# Diagnostickubectl get pods -n kube-system -l k8s-app=kube-dnskubectl logs -n kube-system -l k8s-app=kube-dns --tail=20
# Si crash loop, redémarrer le deploymentkubectl rollout restart deploy coredns -n kube-system
# Attendre que les pods soient Readykubectl get pods -n kube-system -l k8s-app=kube-dns -w
# Validationkubectl run test --rm -it --image=busybox:1.36 -- nslookup kubernetesExercice 21 : CoreDNS — ConfigMap corrompu
Section intitulée « Exercice 21 : CoreDNS — ConfigMap corrompu »Temps cible : 6 minutes
| Contexte | CoreDNS pods Running mais résolution DNS échoue |
|---|---|
| Tâche | Le ConfigMap coredns contient une erreur. Identifier et corriger |
| Validation | kubectl run test --rm -it --image=busybox:1.36 -- nslookup kubernetes retourne une IP |
Solution
# Vérifier le ConfigMapkubectl get cm coredns -n kube-system -o yaml
# Chercher les erreurs de syntaxe dans le Corefile# Erreurs courantes :# - Bloc mal fermé# - Directive inconnue# - Mauvais format d'upstream
# Sauvegarder et corrigerkubectl get cm coredns -n kube-system -o yaml > coredns-backup.yamlkubectl edit cm coredns -n kube-system
# Redémarrer CoreDNS pour appliquerkubectl rollout restart deploy coredns -n kube-system
# Validationkubectl run test --rm -it --image=busybox:1.36 -- nslookup kubernetesExercice 22 : CoreDNS — Service kube-dns absent
Section intitulée « Exercice 22 : CoreDNS — Service kube-dns absent »Temps cible : 5 minutes
| Contexte | Pods CoreDNS Running mais le service kube-dns n’existe pas |
|---|---|
| Tâche | Recréer le service kube-dns pour que la résolution fonctionne |
| Contrainte | Le service doit cibler les pods CoreDNS et exposer les ports 53 TCP/UDP |
| Validation | kubectl get endpoints kube-dns -n kube-system montre des IPs |
Solution
# Vérifier que le service n'existe paskubectl get svc kube-dns -n kube-system
# Recréer le servicekubectl apply -f - <<'EOF'apiVersion: v1kind: Servicemetadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dnsspec: selector: k8s-app: kube-dns clusterIP: 10.96.0.10 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCPEOF
# Validationkubectl get svc,endpoints kube-dns -n kube-systemkubectl run test --rm -it --image=busybox:1.36 -- nslookup kubernetesPoint clé : L’IP du service kube-dns (souvent 10.96.0.10) est configurée dans le kubelet. Recréer le service avec la même IP cluster.
Récapitulatif des temps
Section intitulée « Récapitulatif des temps »| # | Exercice | Domaine | Temps | Type |
|---|---|---|---|---|
| 1 | Upgrade cluster | Architecture | 15 min | kubeadm |
| 2 | Backup etcd | Architecture | 6 min | kubeadm |
| 3 | Restore etcd | Architecture | 10 min | kubeadm |
| 4 | Role et RoleBinding | RBAC | 4 min | générique |
| 5 | ClusterRole nodes | RBAC | 4 min | générique |
| 6 | ServiceAccount | RBAC | 5 min | générique |
| 7 | Taints + placement | Scheduling | 6 min | générique |
| 8 | Node Affinity | Scheduling | 5 min | générique |
| 9 | Drain et Cordon | Scheduling | 3 min | générique |
| 10 | Service ClusterIP | Networking | 3 min | générique |
| 11 | NetworkPolicy Deny | Networking | 4 min | générique |
| 12 | NetworkPolicy Allow | Networking | 6 min | générique |
| 13 | Ingress | Networking | 5 min | générique |
| 14 | PV et PVC | Storage | 7 min | générique |
| 15 | ImagePullBackOff | Troubleshooting | 3 min | générique |
| 16 | Node NotReady | Troubleshooting | 8 min | kubeadm |
| 17 | Service endpoints | Troubleshooting | 4 min | générique |
| 18 | kubelet crash | Troubleshooting | 8 min | kubeadm |
| 19 | API Server down | Troubleshooting | 10 min | kubeadm |
| 20 | CoreDNS crash | Troubleshooting | 5 min | générique |
| 21 | CoreDNS config | Troubleshooting | 6 min | générique |
| 22 | CoreDNS service | Troubleshooting | 5 min | générique |
Temps total : ~132 minutes
L’examen CKA dure 2 heures (120 min). Si vous complétez ces exercices en moins de 110 minutes avec 80%+ de réussite, vous êtes prêt.
Nettoyage
Section intitulée « Nettoyage »kubectl delete ns cka-exerciseskubectl taint node worker1 env- 2>/dev/nullkubectl label node worker1 disktype- 2>/dev/nullÀ retenir
Section intitulée « À retenir »etcdutlpour restore (pasetcdctl restoredéprécié)- Upgrade vers la dernière patch (1.31.4), pas la
.0 serviceAccountNamedans le YAML (pas--serviceaccount)- Toleration ≠ placement garanti — ajouter nodeSelector
- PV cluster-scoped, PVC namespaced
- Pods statiques : modifier le manifest → redémarrage auto
- CoreDNS : 3 points de défaillance (pods, config, service)
- Alias CKA :
k,kn,$do,$now