4.8 · Parcours 4 — Administrer un cluster (CKA)
Les interfaces d'extension : CNI, CSI, CRI
Leçon théorique · questionnaire de validation · gratuit, dans le navigateur
Kubernetes ne sait lui-même ni lancer un conteneur, ni brancher un réseau, ni créer un disque. Pour chacun de ces métiers, il définit une interface standard et laisse des plugins spécialisés faire le travail : CRI pour les conteneurs, CNI pour le réseau, CSI pour le stockage. C'est ce qui permet au même Kubernetes de tourner sur un portable, dans un datacenter VMware ou dans n'importe quel cloud.
Ce que vous saurez à la fin : expliquer le rôle de CRI, CNI et CSI, citer les implémentations courantes, savoir quel composant appelle quoi et quand, et en tirer les bons réflexes de diagnostic.
1. Vue d'ensemble
┌──────────────────── nœud ────────────────────┐
API ──► kubelet ──CRI──► containerd / CRI-O ──OCI──► runc / gVisor (runsc)
│
├─CNI──► plugin réseau (Flannel, Calico, Cilium…)
│
└─CSI──► pilote de stockage (Longhorn, vSphere, EBS, Ceph…)
└──────────────────────────────────────────────┘
Le kubelet, l'agent de chaque nœud, est le chef d'orchestre : quand un pod lui est attribué, il demande au moteur de conteneurs de le créer (CRI), au plugin réseau de lui donner une IP (CNI), et aux pilotes de stockage d'attacher et de monter ses volumes (CSI).
2. CRI : Container Runtime Interface
Le CRI est l'interface (gRPC) entre le kubelet et le moteur de conteneurs :
| Implémentation | Remarque |
|---|---|
| containerd | le plus répandu (k3s, la plupart des distributions et des clouds) |
| CRI-O | conçu uniquement pour Kubernetes (OpenShift) |
Sous le moteur, un runtime OCI crée réellement le conteneur : runc (le standard), gVisor (runsc, un noyau bac à sable, leçon 6.4) ou Kata Containers (une micro-VM par pod). Le choix se fait par pod avec une RuntimeClass :
spec:
runtimeClassName: gvisor
Docker n'est plus un moteur Kubernetes depuis la version 1.24 (retrait de dockershim), mais ses images restent parfaitement utilisables : elles suivent le format OCI.
Outil de diagnostic sur un nœud : crictl (crictl ps, crictl logs, crictl images), le docker du monde CRI.
3. CNI : Container Network Interface
Le CNI est un ensemble de programmes que le moteur appelle à la création et à la destruction de chaque pod, pour lui attribuer une IP et le brancher au réseau. Le plugin garantit ensuite le modèle réseau de Kubernetes : tout pod joint tout pod, sans NAT (leçon 3.2).
| Plugin | Points forts |
|---|---|
| Flannel | simple, léger ; par défaut dans k3s ; pas de NetworkPolicies à lui seul |
| Calico | routage BGP, NetworkPolicies complètes et étendues |
| Cilium | eBPF : performances, NetworkPolicies jusqu'à la couche HTTP, observabilité (Hubble), peut remplacer kube-proxy |
Point d'attention : les NetworkPolicies sont un objet de l'API, mais c'est le plugin CNI qui les applique. Avec un plugin qui ne les gère pas, elles sont acceptées… et sans effet. (k3s ajoute son propre contrôleur de règles à Flannel pour cette raison.)
Symptômes d'un problème de CNI : pods bloqués en ContainerCreating avec un événement FailedCreatePodSandBox … network, pods sans IP, communication impossible entre nœuds.
4. CSI : Container Storage Interface
Le CSI permet à n'importe quel système de stockage de fournir des volumes à Kubernetes, sans modifier Kubernetes. Un pilote CSI comporte en général :
- un contrôleur (Deployment) qui crée, supprime, agrandit et photographie les volumes chez le fournisseur ;
- un plugin de nœud (DaemonSet) qui attache et monte le volume sur le nœud où tourne le pod.
| Pilote | Stockage |
|---|---|
| Longhorn, Rook-Ceph, OpenEBS | stockage distribué sur les disques des nœuds |
| vSphere CSI | disques VMware |
| AWS EBS, Azure Disk, GCE PD | disques des clouds |
| NFS CSI | partages NFS |
Le lien avec les objets que vous manipulez :
PVC (je veux 5Gi) ──► StorageClass (quel pilote, quels paramètres) ──► pilote CSI ──► PV créé et attaché
C'est le provisionnement dynamique (leçons 4.5 et 4.6). Symptômes d'un problème de CSI : PVC bloqué en Pending (waiting for a volume to be created), pod bloqué en ContainerCreating avec FailedAttachVolume ou FailedMount.
5. Et les autres interfaces ?
Le même principe d'extension se retrouve ailleurs :
- Device plugins : exposer des cartes graphiques ou des FPGA aux pods ;
- CRD et opérateurs : ajouter de nouveaux types d'objets à l'API (leçon 2.19) ;
- webhooks d'admission : ajouter ses propres règles (leçon 2.20) ;
- cloud controller manager : brancher les répartiteurs de charge et les nœuds d'un fournisseur.
6. Le réflexe de diagnostic
| Symptôme | Interface en cause | Où regarder |
|---|---|---|
ImagePullBackOff, CreateContainerError |
CRI (image, runtime) | événements du pod, crictl sur le nœud |
FailedCreatePodSandBox, pas d'IP |
CNI | pods du plugin réseau (kube-system), journaux du kubelet |
PVC Pending, FailedMount, FailedAttachVolume |
CSI | pods du pilote CSI, événements du PVC et du pod |
Cette leçon se valide par le QCM de passage.