[{"data":1,"prerenderedAt":510},["ShallowReactive",2],{"deck:kubernetes":3},{"deck":4,"reason":508,"status":509},{"id":5,"stem":6,"matiere":7,"name":8,"punchline":9,"deckStatus":10,"customMessages":11,"sources":21,"cards":25},"kubernetes","decks/kubernetes","informatique","Kubernetes","L'état désiré, le cluster s'occupe du reste","publié",{"low":12,"medium":15,"high":18},[13,14],"Pod, Node, Service : les trois mots qui portent tout","Describe avant de deviner",[16,17],"Les probes et les requests prennent sens","CrashLoopBackOff ne fait plus peur",[19,20],"Taints, RBAC, StatefulSet : tu lis les manifests d'une traite","Le control plane, composant par composant",[22],{"title":23,"url":24},"Kubernetes Documentation","https://kubernetes.io/docs/",[26,40,48,57,65,73,80,87,95,102,109,116,123,130,138,145,156,167,174,181,193,201,209,217,228,235,242,251,258,265,273,284,291,301,310,317,328,335,347,359,369,376,384,391,398,406,418,425,433,440,450,459,466,473,480,487,494,501],{"id":27,"tags":28,"question":30,"quick_answer":31,"details":32,"dependsOn":33,"difficulty":35,"sources":36},"k8s-001",[7,5,29],"architecture","Qu'est-ce que **Kubernetes** ?","Un orchestrateur de conteneurs : déploiement, mise à l'échelle et réparation automatiques","Créé par Google (héritier de Borg), open-sourcé le 6 juin 2014, donné à la CNCF à sa création en juillet 2015 avec la version 1.0. Abrégé **K8s** (8 lettres entre le K et le s).\n\nDocker fait tourner un conteneur sur une machine. Kubernetes décide **où** faire tourner des centaines de conteneurs sur des dizaines de machines, les relance s'ils meurent et répartit le trafic.",[34],"dkr-001",3,[37],{"title":38,"url":39},"Kubernetes Blog — 10 years of Kubernetes","https://kubernetes.io/blog/2024/06/06/10-years-of-kubernetes/",{"id":41,"tags":42,"question":44,"quick_answer":45,"details":46,"dependsOn":47,"difficulty":35},"k8s-002",[7,5,43],"workloads","Qu'est-ce qu'un **Pod** ?","La plus petite unité déployable : un ou plusieurs conteneurs qui partagent réseau et stockage","Kubernetes ne manipule jamais un conteneur seul, toujours un Pod. Les conteneurs d'un même Pod partagent la **même IP**, peuvent se parler sur `localhost` et monter les mêmes volumes.\n\nCas le plus courant : un seul conteneur par Pod. Plusieurs conteneurs = pattern **sidecar** (proxy, agent de logs à côté de l'application).",[27],{"id":49,"tags":50,"question":52,"quick_answer":53,"details":54,"dependsOn":55,"difficulty":56},"k8s-003",[7,5,43,51],"pieges","Pourquoi ne crée-t-on presque jamais un Pod **directement** ?","Un Pod seul n'est pas recréé si son nœud meurt : on passe par un Deployment","Un Pod est **éphémère** : il a une IP temporaire et n'a pas de mécanisme de remplacement. Si le nœud tombe, le Pod disparaît pour de bon.\n\nUn contrôleur (Deployment, StatefulSet, DaemonSet, Job) maintient le nombre voulu de Pods et les recrée ailleurs. Créer un Pod nu se limite au debug ponctuel.",[41],5,{"id":58,"tags":59,"question":60,"quick_answer":61,"details":62,"dependsOn":63,"difficulty":64},"k8s-004",[7,5,29],"Qu'est-ce qu'un **Node** (nœud) ?","Une machine (VM ou physique) du cluster qui exécute des Pods","Chaque nœud fait tourner un **kubelet** (l'agent Kubernetes), un **runtime** de conteneurs (containerd) et **kube-proxy**.\n\nUn cluster = un control plane + des nœuds de travail (worker nodes). `kubectl get nodes` les liste avec leur statut.",[27],2,{"id":66,"tags":67,"question":68,"quick_answer":69,"details":70,"dependsOn":71,"difficulty":72},"k8s-005",[7,5,29],"Rôle du **kube-apiserver** ?","La porte d'entrée unique du cluster : tout passe par son API REST","`kubectl`, le scheduler, les contrôleurs, les kubelets : personne ne parle directement à etcd, tout le monde parle à l'API server. Il authentifie, autorise (RBAC), valide et persiste dans etcd.\n\nC'est le seul composant du control plane qui lit et écrit dans etcd.",[27],4,{"id":74,"tags":75,"question":76,"quick_answer":77,"details":78,"dependsOn":79,"difficulty":72},"k8s-006",[7,5,29],"Rôle d'**etcd** dans un cluster Kubernetes ?","La base clé-valeur distribuée qui stocke tout l'état du cluster","Chaque objet (Pod, Service, Secret…) est une entrée dans etcd. Perdre etcd = perdre le cluster ; c'est le composant à sauvegarder.\n\nEtcd utilise le consensus Raft : on le déploie en nombre impair (3 ou 5) pour tolérer des pannes.",[66],{"id":81,"tags":82,"question":83,"quick_answer":84,"details":85,"dependsOn":86,"difficulty":72},"k8s-007",[7,5,29],"Rôle du **kube-scheduler** ?","Choisir sur quel nœud placer chaque nouveau Pod","Il regarde les Pods sans nœud assigné et choisit selon les ressources demandées (requests), les contraintes (nodeSelector, affinités, taints) et la répartition.\n\nIl ne lance rien lui-même : il écrit le nom du nœud dans le Pod, et c'est le kubelet de ce nœud qui démarre les conteneurs.",[66],{"id":88,"tags":89,"question":91,"quick_answer":92,"details":93,"dependsOn":94,"difficulty":56},"k8s-010",[7,5,90],"concepts","Que signifie « Kubernetes est **déclaratif** » ?","On décrit l'état désiré, pas les actions ; le cluster converge vers cet état tout seul","On n'écrit pas « lance 3 conteneurs », on écrit `replicas: 3`. Si un Pod meurt, Kubernetes constate 2 ≠ 3 et en recrée un, sans qu'on intervienne. C'est la **boucle de réconciliation**.\n\nConséquence pratique : on applique des fichiers YAML (`kubectl apply`) plutôt que d'enchaîner des commandes impératives.",[27],{"id":96,"tags":97,"question":98,"quick_answer":99,"details":100,"dependsOn":101,"difficulty":56},"k8s-008",[7,5,29],"Rôle du **kube-controller-manager** ?","Faire tourner les boucles de réconciliation qui ramènent l'état observé vers l'état désiré","Il regroupe les contrôleurs : ReplicaSet controller (il manque un Pod → en créer un), Node controller (un nœud ne répond plus → marquer ses Pods), Job controller, etc.\n\nChaque contrôleur boucle : observer, comparer au désiré, agir.",[88],{"id":103,"tags":104,"question":105,"quick_answer":106,"details":107,"dependsOn":108,"difficulty":72},"k8s-009",[7,5,29],"Rôle du **kubelet** ?","L'agent sur chaque nœud qui fait tourner les Pods qu'on lui assigne et rapporte leur état","Il reçoit du control plane les Pods à exécuter, demande au runtime (containerd) de lancer les conteneurs, exécute les probes et renvoie le statut à l'API server.\n\nIl ne gère que **son** nœud et ne gère pas les conteneurs créés hors de Kubernetes.",[58],{"id":110,"tags":111,"question":112,"quick_answer":113,"details":114,"dependsOn":115,"difficulty":72},"k8s-011",[7,5,43],"Qu'est-ce qu'un **Deployment** ?","L'objet qui gère une application sans état : nombre de réplicas, mises à jour progressives, retour arrière","Un Deployment crée un ReplicaSet, qui crée les Pods. Changer l'image dans le Deployment déclenche un **rolling update** : nouveau ReplicaSet monté progressivement, ancien descendu.\n\nC'est l'objet par défaut pour une API ou un front web.",[49],{"id":117,"tags":118,"question":119,"quick_answer":120,"details":121,"dependsOn":122,"difficulty":72},"k8s-012",[7,5,43],"Qu'est-ce qu'un **ReplicaSet** ?","Le contrôleur qui maintient un nombre fixe de Pods identiques en vie","S'il y a moins de Pods que `replicas`, il en crée ; s'il y en a trop, il en supprime. On ne l'écrit presque jamais à la main : le Deployment le gère et en garde un historique pour le rollback.",[110],{"id":124,"tags":125,"question":126,"quick_answer":127,"details":128,"dependsOn":129,"difficulty":35},"k8s-014",[7,5,90],"À quoi servent les **labels** ?","Des paires clé/valeur sur les objets, utilisées par les sélecteurs pour les regrouper","`app: api`, `tier: backend`, `env: prod`. Un Service choisit ses Pods avec `selector: app: api` ; un Deployment reconnaît les siens de la même façon.\n\n`kubectl get pods -l app=api` filtre par label. Les **annotations** ressemblent aux labels mais servent aux métadonnées non sélectionnables (outillage, documentation).",[41],{"id":131,"tags":132,"question":134,"quick_answer":135,"details":136,"dependsOn":137,"difficulty":72},"k8s-013",[7,5,133],"reseau","Qu'est-ce qu'un **Service** ?","Une IP et un nom DNS stables devant un groupe de Pods sélectionnés par labels","Les Pods naissent et meurent avec des IP différentes. Le Service fournit un point d'entrée fixe et répartit les connexions entre les Pods dont les labels correspondent à son `selector`.\n\nUn Pod `api` appelle la base via `db:5432` : `db` est le nom du Service.",[49,124],{"id":139,"tags":140,"question":141,"quick_answer":142,"details":143,"dependsOn":144,"difficulty":35},"k8s-015",[7,5,133],"Service de type **ClusterIP** : qui peut le joindre ?","Seulement l'intérieur du cluster","C'est le type **par défaut**. L'IP virtuelle n'est routable que depuis les Pods. Parfait pour une base de données ou une API interne.\n\nPour l'exposer à l'extérieur, il faut un NodePort, un LoadBalancer ou un Ingress devant.",[131],{"id":146,"tags":147,"question":148,"quick_answer":149,"details":150,"dependsOn":151,"difficulty":72,"sources":152},"k8s-016",[7,5,133],"Service de type **NodePort** : comment est-il exposé ?","Sur un même port (30000-32767) de chaque nœud du cluster","`http://\u003Cip-de-nimporte-quel-noeud>:31234` atteint le Service. Simple, mais port bizarre et dépendance aux IP des nœuds : réservé au dev ou aux clusters sans load balancer.\n\nUn NodePort inclut un ClusterIP.",[139],[153],{"title":154,"url":155},"Kubernetes Docs — Service, type NodePort","https://kubernetes.io/docs/concepts/services-networking/service/",{"id":157,"tags":158,"question":159,"quick_answer":160,"details":161,"dependsOn":162,"difficulty":56,"sources":163},"k8s-017",[7,5,133],"Service de type **LoadBalancer** : que se passe-t-il à sa création ?","Le cloud provisionne un load balancer externe avec une IP publique qui pointe vers le Service","Sur AWS, GCP ou Azure, le cloud-controller crée un NLB (ou un Classic LB avec l'ancien cloud provider) ; l'ALB, lui, est créé pour un Ingress. Sur un cluster bare-metal, le Service reste en `\u003Cpending>` sans un composant comme MetalLB.\n\nUn LB par Service coûte cher : en pratique on met un seul LoadBalancer devant un Ingress controller.",[146],[164],{"title":165,"url":166},"AWS Docs — AWS Load Balancer Controller (EKS)","https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html",{"id":168,"tags":169,"question":170,"quick_answer":171,"details":172,"dependsOn":173,"difficulty":56},"k8s-018",[7,5,133],"Qu'est-ce qu'un **Ingress** ?","Des règles de routage HTTP/HTTPS (hôte, chemin) vers des Services, appliquées par un Ingress controller","`api.example.com` → Service `api`, `example.com/blog` → Service `blog`, TLS terminé au passage. L'objet Ingress ne fait rien seul : il faut un **Ingress controller** (nginx, Traefik, HAProxy…) installé dans le cluster.\n\nSon successeur en cours d'adoption : la **Gateway API**, plus expressive.",[139],{"id":175,"tags":176,"question":177,"quick_answer":178,"details":179,"dependsOn":180,"difficulty":35},"k8s-019",[7,5,90],"À quoi sert un **Namespace** ?","À partitionner logiquement un cluster : équipes, environnements, quotas, droits","Les noms d'objets sont uniques **par namespace**. `kube-system` héberge les composants du cluster, `default` reçoit ce qu'on crée sans préciser.\n\n`kubectl get pods -n prod`, ou `-A` pour tous. Un Namespace n'isole pas le réseau par défaut : il faut des NetworkPolicies pour ça.",[27],{"id":182,"tags":183,"question":185,"quick_answer":186,"details":187,"dependsOn":188,"difficulty":72,"sources":189},"k8s-020",[7,5,184],"config","Qu'est-ce qu'un **ConfigMap** ?","Un objet qui stocke de la configuration non sensible, injectée en variables d'env ou en fichiers","Sépare la config de l'image : la même image tourne en dev et en prod avec un ConfigMap différent.\n\nPiège : un Pod ne voit pas la mise à jour d'un ConfigMap injecté en variables d'environnement tant qu'il n'est pas redémarré. Monté en volume, le fichier est rafraîchi (avec un délai).",[41],[190],{"title":191,"url":192},"Kubernetes Docs — ConfigMaps","https://kubernetes.io/docs/concepts/configuration/configmap/",{"id":194,"tags":195,"question":197,"quick_answer":198,"details":199,"dependsOn":200,"difficulty":56},"k8s-021",[7,5,184,196],"securite","Un **Secret** Kubernetes est-il chiffré ?","Non par défaut : juste encodé en base64, lisible par qui a le droit de le lire","`echo \u003Cvaleur> | base64 -d` et c'est en clair. Ce qui protège réellement un Secret : le **RBAC** (qui peut faire `get secrets`) et le **chiffrement au repos** d'etcd, à activer explicitement.\n\nPour aller plus loin : External Secrets Operator ou Vault, qui tirent les secrets d'un coffre externe.",[182],{"id":202,"tags":203,"question":205,"quick_answer":206,"details":207,"dependsOn":208,"difficulty":64},"k8s-022",[7,5,204],"kubectl","Commande pour créer ou mettre à jour des objets depuis un fichier YAML ?","kubectl apply -f fichier.yaml","`apply` est idempotent : la première fois il crée, les suivantes il met à jour la différence. On peut passer un dossier (`-f ./manifests/`) ou une URL.\n\n`kubectl create` échoue si l'objet existe déjà ; `kubectl delete -f` supprime ce que décrit le fichier.",[88],{"id":210,"tags":211,"question":213,"quick_answer":214,"details":215,"dependsOn":216,"difficulty":35},"k8s-023",[7,5,204,212],"debug","Un Pod ne démarre pas : quelle commande montre les **événements** qui expliquent pourquoi ?","kubectl describe pod \u003Cnom>","La section `Events` en bas liste ce qui s'est passé : image introuvable, pas de nœud avec assez de mémoire, volume non monté, probe en échec…\n\n`kubectl get pods` donne le statut, `describe` donne la raison. `kubectl get events --sort-by=.lastTimestamp` pour les événements de tout le namespace.",[202],{"id":218,"tags":219,"question":220,"quick_answer":221,"details":222,"dependsOn":223,"difficulty":72,"sources":224},"k8s-031",[7,5,212],"Que signifie le statut **CrashLoopBackOff** ?","Le conteneur plante en boucle ; Kubernetes attend de plus en plus longtemps entre deux relances","Le processus démarre, se termine en erreur, est relancé, replante… Par défaut, le délai double à chaque fois (10 s, 20 s, 40 s… jusqu'à 5 min).\n\nCe n'est pas le problème, c'est le symptôme : `kubectl logs --previous` montre pourquoi l'application sort. Causes typiques : variable d'env manquante, base injoignable, commande fausse.",[210],[225],{"title":226,"url":227},"Kubernetes Docs — Pod lifecycle, container restarts","https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/",{"id":229,"tags":230,"question":231,"quick_answer":232,"details":233,"dependsOn":234,"difficulty":72},"k8s-024",[7,5,204,212],"Commande pour voir les logs d'un Pod qui a **crashé et redémarré** ?","kubectl logs \u003Cpod> --previous","Sans `--previous`, on voit les logs du conteneur actuel, souvent vides si le crash est immédiat. `-f` suit en direct, `-c \u003Cconteneur>` cible un conteneur dans un Pod multi-conteneurs, `-l app=api` agrège plusieurs Pods.",[218],{"id":236,"tags":237,"question":238,"quick_answer":239,"details":240,"dependsOn":241,"difficulty":35},"k8s-025",[7,5,204,212],"Commande pour ouvrir un shell dans un Pod ?","kubectl exec -it \u003Cpod> -- sh","Le `--` sépare les options de kubectl de la commande à exécuter dans le conteneur. Même logique que `docker exec`.\n\nUne image distroless n'a pas de shell : on utilise alors `kubectl debug` qui attache un conteneur éphémère d'outillage au Pod.",[210],{"id":243,"tags":244,"question":246,"quick_answer":247,"details":248,"dependsOn":249,"difficulty":250},"k8s-026",[7,5,245],"sante","Que fait Kubernetes quand une **liveness probe** échoue ?","Il redémarre le conteneur","La liveness répond à « le processus est-il vivant ou bloqué ? ». Un deadlock, une boucle infinie : la probe échoue, le kubelet tue et relance le conteneur (selon `restartPolicy`, `Always` par défaut).\n\nPiège : une liveness qui dépend d'un service externe (base de données) provoque des redémarrages en cascade quand la base tombe. La liveness doit tester **le processus**, pas ses dépendances.",[103],6,{"id":252,"tags":253,"question":254,"quick_answer":255,"details":256,"dependsOn":257,"difficulty":56},"k8s-027",[7,5,245],"Que fait Kubernetes quand une **readiness probe** échoue ?","Il retire le Pod des endpoints du Service, sans le redémarrer","La readiness répond à « ce Pod peut-il recevoir du trafic maintenant ? ». Pendant un démarrage long, un cache en cours de chargement ou une surcharge temporaire, le Pod sort de la rotation et y revient quand la probe repasse.\n\nC'est elle qui rend les rolling updates sans coupure : le nouveau Pod ne reçoit du trafic qu'une fois prêt.",[131],{"id":259,"tags":260,"question":261,"quick_answer":262,"details":263,"dependsOn":264,"difficulty":56},"k8s-028",[7,5,245],"À quoi sert la **startup probe** ?","À laisser du temps au démarrage avant que la liveness ne commence à tuer le conteneur","Tant que la startup probe n'a pas réussi, liveness et readiness sont désactivées. Pour une application qui met 2 minutes à démarrer (JVM, migrations), ça évite de régler une liveness laxiste pour tout le cycle de vie.\n\n`failureThreshold × periodSeconds` = temps maximum accordé au démarrage.",[243],{"id":266,"tags":267,"question":269,"quick_answer":270,"details":271,"dependsOn":272,"difficulty":56},"k8s-029",[7,5,268],"ressources","Que sont les **requests** d'un conteneur ?","Les ressources (CPU, mémoire) garanties, que le scheduler réserve sur le nœud pour placer le Pod","`requests: cpu: 250m, memory: 256Mi`. `250m` = 250 millicores = un quart de cœur. Le scheduler ne place le Pod que sur un nœud où ces ressources restent disponibles (en additionnant les requests des Pods déjà présents).\n\nSans requests, le scheduler place à l'aveugle et un nœud peut se retrouver saturé.",[81],{"id":274,"tags":275,"question":276,"quick_answer":277,"details":278,"dependsOn":279,"difficulty":56,"sources":280},"k8s-030",[7,5,268],"Que se passe-t-il si un conteneur dépasse sa **limit** mémoire ?","Un de ses processus est tué par le noyau (OOMKilled), en général le principal, et le conteneur redémarre","`limits: memory: 512Mi`. Statut visible dans `kubectl describe pod` : `Last State: Terminated, Reason: OOMKilled`, code de sortie 137. Redémarrage selon `restartPolicy`. Nuance : le OOM killer vise un processus du cgroup ; si ce n'est pas le PID 1, le conteneur peut survivre amputé. Remède : augmenter la limite ou corriger la fuite mémoire.",[266],[281],{"title":282,"url":283},"Kubernetes Docs — Resource management for Pods and Containers","https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",{"id":285,"tags":286,"question":287,"quick_answer":288,"details":289,"dependsOn":290,"difficulty":35},"k8s-032",[7,5,212],"Que signifie le statut **ImagePullBackOff** ?","Le nœud n'arrive pas à télécharger l'image du conteneur","Causes : nom ou tag mal orthographié, image privée sans `imagePullSecrets`, registre injoignable. `kubectl describe pod` donne le message exact du registre (`not found`, `unauthorized`).",[210],{"id":292,"tags":293,"question":294,"quick_answer":295,"details":296,"dependsOn":297,"difficulty":250,"sources":298},"k8s-033",[7,5,212],"Un Pod reste en **Pending** : que signifie ce statut ?","Accepté par l'API mais pas encore placé : le plus souvent, aucun nœud ne convient","Pending = accepté par l'API mais pas encore placé. Raisons dans `describe` : `Insufficient memory/cpu` (requests trop grosses), taint non toléré, nodeSelector sans nœud correspondant, PersistentVolumeClaim non satisfait.\n\nÀ distinguer de `ContainerCreating`, où le nœud est choisi mais l'image ou les volumes se préparent.",[266],[299],{"title":300,"url":227},"Kubernetes Docs — Pod lifecycle",{"id":302,"tags":303,"question":305,"quick_answer":306,"details":307,"dependsOn":308,"difficulty":56},"k8s-034",[7,5,304],"stockage","Qu'est-ce qu'un **PersistentVolumeClaim** (PVC) ?","La demande de stockage d'un Pod : « je veux 10 Gi en lecture-écriture », sans dire d'où","Le PVC est lié à un **PersistentVolume** (PV), le disque réel (EBS, NFS, disque local). Avec une **StorageClass**, le PV est provisionné dynamiquement à la création du PVC.\n\nLe Pod monte le PVC ; les données survivent à la suppression du Pod. C'est l'équivalent Kubernetes du volume Docker.",[41,309],"dkr-026",{"id":311,"tags":312,"question":313,"quick_answer":314,"details":315,"dependsOn":316,"difficulty":56},"k8s-035",[7,5,43],"Qu'est-ce qu'un **StatefulSet** ?","Un contrôleur pour applications à état : identité réseau stable et volume propre par Pod","Les Pods s'appellent `db-0`, `db-1`, `db-2` (pas de suffixe aléatoire, chacun joignable en `db-0.db` grâce à un Service **headless** associé), démarrent et s'arrêtent **dans l'ordre**, et chacun garde son propre PVC à travers les redémarrages.\n\nUsage : bases de données, Kafka, Elasticsearch. Un Deployment ne convient pas : ses Pods sont interchangeables.",[110,302],{"id":318,"tags":319,"question":320,"quick_answer":321,"details":322,"dependsOn":323,"difficulty":72,"sources":324},"k8s-036",[7,5,43],"Qu'est-ce qu'un **DaemonSet** ?","Un contrôleur qui garantit un Pod sur chaque nœud du cluster (ou sur les nœuds sélectionnés)","Un nouveau nœud rejoint le cluster : le DaemonSet y lance son Pod automatiquement. Usage : agents de logs (Fluent Bit), de monitoring (node-exporter), plugins réseau et stockage.",[110],[325],{"title":326,"url":327},"Kubernetes Docs — DaemonSet","https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/",{"id":329,"tags":330,"question":331,"quick_answer":332,"details":333,"dependsOn":334,"difficulty":72},"k8s-037",[7,5,43],"Qu'est-ce qu'un **Job** ?","Un contrôleur qui lance des Pods jusqu'à ce que la tâche se termine avec succès","Contrairement à un Deployment qui garde ses Pods en vie, un Job veut qu'ils **finissent** (exit 0). Migration de base, calcul batch, import.\n\nUn **CronJob** crée un Job selon une planification cron (`schedule: \"0 3 * * *\"`).",[110],{"id":336,"tags":337,"question":339,"quick_answer":340,"details":341,"dependsOn":342,"difficulty":56,"sources":343},"k8s-038",[7,5,338],"scaling","Que fait un **HorizontalPodAutoscaler** (HPA) ?","Ajuste automatiquement le nombre de réplicas d'un Deployment (ou StatefulSet) selon une métrique","`targetCPUUtilizationPercentage: 70`, `minReplicas: 2`, `maxReplicas: 10`. Il lit les métriques via le metrics-server et scale **en nombre de Pods**.\n\nNécessite des `requests` CPU définies, sinon le pourcentage n'a pas de base. Le Vertical Pod Autoscaler ajuste lui les requests/limits.",[266],[344],{"title":345,"url":346},"Kubernetes Docs — Horizontal Pod Autoscaling","https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/",{"id":348,"tags":349,"question":351,"quick_answer":352,"details":353,"dependsOn":354,"difficulty":72,"sources":355},"k8s-039",[7,5,350],"deploiement","Commande pour **annuler** la dernière mise à jour d'un Deployment ?","kubectl rollout undo deployment/\u003Cnom>","Le Deployment conserve les anciens ReplicaSets (10 par défaut, `revisionHistoryLimit`). `rollout undo` remet le précédent à l'échelle. `kubectl rollout status` suit une mise à jour en cours, `rollout history` liste les révisions.",[110],[356],{"title":357,"url":358},"Kubernetes Docs — Deployments","https://kubernetes.io/docs/concepts/workloads/controllers/deployment/",{"id":360,"tags":361,"question":362,"quick_answer":363,"details":364,"dependsOn":365,"difficulty":56,"sources":366},"k8s-040",[7,5,350],"Dans un rolling update, que règle **maxSurge** ?","Le nombre de Pods en plus du nombre voulu pendant la bascule","Défaut : 25 %. Avec 4 réplicas, Kubernetes peut monter à 5 Pods le temps de la transition : le nouveau ReplicaSet grandit avant que l'ancien ne descende.\n\n`maxSurge: 0` interdit tout Pod supplémentaire (utile quand les ressources sont justes), au prix d'une capacité réduite pendant la mise à jour.",[348],[367],{"title":368,"url":358},"Kubernetes Docs — Deployments, rolling update",{"id":370,"tags":371,"question":372,"quick_answer":373,"details":374,"dependsOn":375,"difficulty":35},"k8s-041",[7,5,133],"Nom DNS complet d'un Service `api` dans le namespace `prod` ?","api.prod.svc.cluster.local","Depuis le même namespace, `api` suffit. Depuis un autre namespace, `api.prod` au minimum. Le DNS est fourni par **CoreDNS**, qui tourne dans `kube-system`.",[131,175],{"id":377,"tags":378,"question":380,"quick_answer":381,"details":382,"dependsOn":383,"difficulty":72},"k8s-042",[7,5,379],"outils","Qu'est-ce que **Helm** ?","Le gestionnaire de paquets de Kubernetes : des charts, templates YAML paramétrables","Un **chart** regroupe tous les manifestes d'une application avec des valeurs par défaut (`values.yaml`). `helm install monredis bitnami/redis --set auth.password=…` déploie Redis en une commande.\n\nAlternative sans templating : **Kustomize**, intégré à kubectl (`kubectl apply -k`), qui superpose des patches sur des YAML de base.",[202],{"id":385,"tags":386,"question":387,"quick_answer":388,"details":389,"dependsOn":390,"difficulty":72},"k8s-043",[7,5,196],"Dans le RBAC Kubernetes, qu'est-ce qu'un **Role** ?","Un ensemble de droits (verbes sur des ressources) limité à un namespace","Un Role liste des règles : `verbs: [get, list, watch]` sur `resources: [pods]`. Il ne fait rien seul : un RoleBinding l'attache à un utilisateur, un groupe ou un ServiceAccount.\n\nSa portée s'arrête au namespace où il est créé.",[175],{"id":392,"tags":393,"question":394,"quick_answer":395,"details":396,"dependsOn":397,"difficulty":56},"k8s-044",[7,5,196],"Qu'est-ce qu'un **ServiceAccount** ?","L'identité d'un Pod auprès de l'API Kubernetes","Chaque namespace a un ServiceAccount `default`, monté automatiquement dans les Pods sous forme de token. Une application qui doit lister des Pods ou lire des Secrets reçoit un ServiceAccount dédié avec un RoleBinding minimal.\n\nLes utilisateurs humains, eux, ne sont pas des objets Kubernetes : ils viennent de certificats ou d'un fournisseur OIDC.",[385],{"id":399,"tags":400,"question":402,"quick_answer":403,"details":404,"dependsOn":405,"difficulty":250},"k8s-045",[7,5,401],"scheduling","À quoi servent les **taints** et **tolerations** ?","Un taint repousse les Pods d'un nœud ; seule une toleration correspondante permet d'y être placé","`kubectl taint nodes gpu-1 gpu=true:NoSchedule` : plus aucun Pod n'y va, sauf ceux qui déclarent `tolerations: key: gpu, value: \"true\"`. Usage : nœuds GPU, nœuds réservés, nœuds en maintenance.\n\nC'est l'inverse de l'affinité : la taint est posée **sur le nœud** pour exclure, l'affinité est posée **sur le Pod** pour attirer.",[81],{"id":407,"tags":408,"question":409,"quick_answer":410,"details":411,"dependsOn":412,"difficulty":56,"sources":414},"k8s-046",[7,5,29],"Kubernetes a-t-il besoin de Docker pour tourner ?","Non : il parle à un runtime CRI, containerd en général ; Docker Engine reste possible via cri-dockerd","Le **dockershim**, la couche d'adaptation vers le démon Docker intégrée au kubelet, a disparu en Kubernetes 1.24 (2022). Docker Engine n'est pas banni : l'adaptateur externe **cri-dockerd** le rend à nouveau utilisable comme runtime. Les images Docker restent parfaitement utilisables : elles respectent le standard OCI, que containerd et CRI-O lisent.\n\nOn construit donc toujours avec Docker, mais le cluster n'exécute pas avec Docker.",[103,413],"dkr-037",[415],{"title":416,"url":417},"Kubernetes Blog — Dockershim removal FAQ","https://kubernetes.io/blog/2022/02/17/dockershim-faq/",{"id":419,"tags":420,"question":421,"quick_answer":422,"details":423,"dependsOn":424,"difficulty":35},"k8s-047",[7,5,204],"Où kubectl trouve-t-il l'adresse du cluster et les identifiants ?","Dans le fichier kubeconfig (~/.kube/config), organisé en contextes","Un **contexte** = un cluster + un utilisateur + un namespace par défaut. `kubectl config get-contexts` les liste, `kubectl config use-context prod` bascule.\n\nPiège classique : lancer un `delete` en croyant être sur le cluster de dev. Beaucoup affichent le contexte courant dans leur prompt.",[202],{"id":426,"tags":427,"question":429,"quick_answer":430,"details":431,"dependsOn":432,"difficulty":56},"k8s-048",[7,5,428],"extensibilite","Qu'est-ce qu'une **CRD** (Custom Resource Definition) ?","Une extension de l'API Kubernetes : on y ajoute ses propres types d'objets","Après avoir déclaré une CRD `Certificate`, on peut faire `kubectl get certificates` comme pour des Pods. Un **Operator** est un contrôleur qui surveille ces objets custom et agit (cert-manager renouvelle les certificats, un operator Postgres gère les sauvegardes).\n\nC'est ainsi que Kubernetes devient une plateforme : la boucle de réconciliation, appliquée à n'importe quoi.",[88],{"id":434,"tags":435,"question":436,"quick_answer":437,"details":438,"dependsOn":439,"difficulty":56},"k8s-049",[7,5,133,196],"Par défaut, deux Pods de namespaces différents peuvent-ils communiquer ?","Oui : le réseau Kubernetes est plat, tout Pod joint tout Pod","Le modèle réseau exige que chaque Pod ait une IP joignable depuis n'importe quel autre Pod, sans NAT. L'isolation se construit avec des **NetworkPolicies** (« les Pods `db` n'acceptent que le trafic des Pods `api` »), à condition que le plugin réseau (CNI : Calico, Cilium…) les applique.",[175],{"id":441,"tags":442,"question":443,"quick_answer":444,"details":445,"dependsOn":446,"difficulty":72,"sources":447},"k8s-050",[7,5,268],"Dans une spec de ressources, `512Mi` et `512M`, c'est pareil ?","Non : Mi est une puissance de 2 (1 Mi = 1 048 576 octets), M est décimal (1 000 000)","`Ki`, `Mi`, `Gi` = kibi, mébi, gibi (base 1024). `K`, `M`, `G` = base 1000. `512Mi` ≈ 537 M. Les outils et dashboards affichent presque toujours en `Mi`/`Gi` : s'y tenir évite les erreurs de 5 à 7 %.\n\nPour le CPU, `1` = un cœur et `500m` = 500 millicores, la moitié d'un cœur.",[266],[448],{"title":449,"url":283},"Kubernetes Docs — Resource units",{"id":451,"tags":452,"question":453,"quick_answer":454,"details":455,"dependsOn":456,"difficulty":56,"sources":457},"k8s-051",[7,5,350],"Dans un rolling update, que règle **maxUnavailable** ?","Le nombre de Pods qui peuvent manquer par rapport au nombre voulu pendant la bascule","Défaut : 25 %. Avec 4 réplicas, Kubernetes peut descendre à 3 Pods disponibles pendant la transition.\n\n`maxUnavailable: 0` garantit qu'on ne passe jamais sous la capacité prévue ; il faut alors `maxSurge ≥ 1` pour que la mise à jour puisse avancer.",[360],[458],{"title":368,"url":358},{"id":460,"tags":461,"question":462,"quick_answer":463,"details":464,"dependsOn":465,"difficulty":56},"k8s-052",[7,5,196],"Quand faut-il un **ClusterRole** plutôt qu'un Role ?","Pour des droits sur tout le cluster ou sur des ressources non namespacées (nœuds, namespaces, PV)","Un ClusterRole n'est rattaché à aucun namespace. Deux usages : donner un droit partout (via ClusterRoleBinding), ou donner accès à des objets qui ne vivent dans aucun namespace, comme les Nodes ou les PersistentVolumes.\n\nAstuce : un ClusterRole peut être lié par un simple RoleBinding, il ne s'applique alors que dans ce namespace. C'est ainsi qu'on réutilise les rôles prédéfinis `view`, `edit`, `admin`.",[385],{"id":467,"tags":468,"question":469,"quick_answer":470,"details":471,"dependsOn":472,"difficulty":72},"k8s-053",[7,5,196],"Comment un Role est-il **attribué** à quelqu'un ?","Par un RoleBinding (ou ClusterRoleBinding) qui lie le rôle à un utilisateur, un groupe ou un ServiceAccount","Le Role dit **quoi**, le Binding dit **qui**. `subjects: - kind: ServiceAccount, name: api` + `roleRef: kind: Role, name: pod-reader`.\n\nUn RoleBinding vit dans un namespace ; un ClusterRoleBinding s'applique à tout le cluster et ne peut référencer qu'un ClusterRole.",[385,392],{"id":474,"tags":475,"question":476,"quick_answer":477,"details":478,"dependsOn":479,"difficulty":56},"k8s-054",[7,5,268],"Que se passe-t-il si un conteneur dépasse sa **limit CPU** ?","Il est ralenti (throttling), pas tué","Contrairement à la mémoire, le CPU est une ressource compressible : le cgroup bride le conteneur au quota fixé, les requêtes ralentissent mais rien ne meurt.\n\nUn throttling important se voit dans la métrique `container_cpu_cfs_throttled_seconds_total`. Beaucoup d'équipes ne mettent pas de limit CPU du tout, seulement des requests.",[274],{"id":481,"tags":482,"question":483,"quick_answer":484,"details":485,"dependsOn":486,"difficulty":35},"k8s-055",[7,5,43],"Qu'est-ce qu'un **CronJob** ?","Un contrôleur qui crée un Job à intervalle régulier, selon une expression cron","`schedule: \"0 3 * * *\"` lance un Job chaque nuit à 3 h (heure du control plane, UTC le plus souvent). Sauvegardes, purges, rapports.\n\n`concurrencyPolicy: Forbid` évite que deux exécutions se chevauchent si la précédente traîne.",[329],{"id":488,"tags":489,"question":490,"quick_answer":491,"details":492,"dependsOn":493,"difficulty":56},"k8s-056",[7,5,29,133],"Rôle de **kube-proxy** ?","Maintenir sur chaque nœud les règles réseau qui font fonctionner les Services","Quand un Service est créé, kube-proxy programme sur le nœud (iptables ou IPVS) la redirection de l'IP virtuelle du Service vers les IP des Pods sélectionnés.\n\nCertains plugins réseau (Cilium en mode eBPF) le remplacent entièrement.",[58,131],{"id":495,"tags":496,"question":497,"quick_answer":498,"details":499,"dependsOn":500,"difficulty":56},"k8s-057",[7,5,133,196],"Qu'est-ce qu'une **NetworkPolicy** ?","Un pare-feu déclaratif entre Pods : qui peut parler à qui, sélectionné par labels et namespaces","Sans NetworkPolicy, tout Pod joint tout Pod. Une policy sur les Pods `app: db` qui n'autorise en ingress que `app: api` sur le port 5432 ferme tout le reste.\n\nElle n'a d'effet que si le plugin réseau (CNI) la supporte : Calico, Cilium oui ; Flannel seul, non.",[434],{"id":502,"tags":503,"question":504,"quick_answer":505,"details":506,"dependsOn":507,"difficulty":35},"k8s-058",[7,5,204,350],"Comment forcer un Deployment à **recréer ses Pods** sans changer son image ?","kubectl rollout restart deployment/\u003Cnom>","Déclenche un rolling update normal (sans coupure) en modifiant une annotation du template. C'est la réponse au ConfigMap modifié que les Pods ne voient pas en variables d'environnement.",[182,348],"ok",null,1792059303553]