
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.36.x |
|---|---|
| Tâche | Upgrade le control plane et un worker vers la dernière version patch de 1.37 |
| Contrainte | Utiliser les versions disponibles dans le repo apt |
| Validation | kubectl get nodes affiche tous les nodes en v1.37.x |
Solution
# 1. Identifier la dernière version patch disponibleapt updateapt-cache madison kubeadm | grep 1.37# Exemple : 1.37.0-1.1
# 2. Sur le control planeapt-get install -y kubeadm=1.37.0-1.1kubeadm upgrade plankubeadm upgrade apply v1.37.0
apt-get install -y kubelet=1.37.0-1.1 kubectl=1.37.0-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.37.0-1.1kubeadm upgrade nodeapt-get install -y kubelet=1.37.0-1.1systemctl daemon-reload && systemctl restart kubelet
# 5. Uncordon depuis le control planekubectl uncordon worker1kubectl get nodesPoint clé : n'enjambez jamais une version mineure : 1.36 monte vers 1.37, jamais vers 1.38. Et visez la dernière patch disponible dans le dépôt, relevée par apt-cache madison, plutôt qu'un numéro recopié.
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 | etcdutl snapshot status /opt/backup/etcd-snapshot.db --write-out=table affiche les infos |
Solution
mkdir -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
# Validation : etcdutl, car etcdctl snapshot status rend 0 sans rien vérifieretcdutl 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 a été supprimé, pas seulement déprécié. En etcd 3.7, etcdctl snapshot n'offre plus que save, et l'appel répond Error: unknown flag: --data-dir. La restauration comme la vérification passent par etcdutl.
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: nginx:1.28@sha256:146adea4768b83c607d0bdfa4188464e3da6e0a3ad4475db1d1d8f64f27c29ccEOF
# 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: nginx:1.28@sha256:146adea4768b83c607d0bdfa4188464e3da6e0a3ad4475db1d1d8f64f27c29ccEOF
# 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: nginx:1.28@sha256:146adea4768b83c607d0bdfa4188464e3da6e0a3ad4475db1d1d8f64f27c29ccEOF
# 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:1.28 --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:1.28@sha256:146adea4768b83c607d0bdfa4188464e3da6e0a3ad4475db1d1d8f64f27c29cc 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 endpointslice -l kubernetes.io/service-name=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: nginx:1.28@sha256:146adea4768b83c607d0bdfa4188464e3da6e0a3ad4475db1d1d8f64f27c29ccEOF
# Diagnostickubectl get endpointslice -n cka-exercises -l kubernetes.io/service-name=broken-svckubectl 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 endpointslice -n cka-exercises -l kubernetes.io/service-name=broken-svcExercice 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 endpointslice -n kube-system -l kubernetes.io/service-name=kube-dns 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 kube-dns -n kube-systemkubectl get endpointslice -n kube-system -l kubernetes.io/service-name=kube-dnskubectl 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.
Capstone : le scénario complet, sans énoncé qui aide
Section intitulée « Capstone : le scénario complet, sans énoncé qui aide »Les exercices ci-dessus isolent chacun une panne et nomment le domaine concerné. Le capstone fait l'inverse, et c'est ce qui le rapproche de l'examen : un namespace laissé par une équipe partie, un portail qui ne répond rien, et aucun ticket pour dire pourquoi. Trois défauts indépendants à trouver, deux exigences qui n'ont jamais été satisfaites, et une seule mesure de réussite, le portail qui répond sur chaque nœud du cluster.
Comptez 45 minutes, et gardez-le pour la fin : il suppose acquis le diagnostic d'un nœud, d'un kubelet et d'un API server, qui s'entraînent séparément sur Cluster Troubleshooting, Worker Nodes et Control Plane.
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/nullContrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »etcdutlpour restore (pasetcdctl restoredéprécié)- Upgrade : jamais plus d'une mineure à la fois, et viser la dernière patch
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
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Guide de préparation CKS : La certification sécurité qui prolonge la CKA, avec un format d'examen identique.
- Exercices chronométrés CKS : Poursuivre l'entraînement minuté sur les scénarios de durcissement.