kubenow
Se connecterCommencer gratuitement

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.

Contenu aligné sur les programmes publiés par la CNCF (KCNA, CKAD, CKA, CKS), par le Linux Professional Institute (LPIC-1) et par Cisco (CCNA 200-301). KubeNow n'est ni affilié ni approuvé par la CNCF, la Linux Foundation, le LPI ou Cisco ; CKA, CKAD, CKS et KCNA sont des marques de la Linux Foundation, LPIC-1 est une marque du Linux Professional Institute, Cisco et CCNA sont des marques de Cisco Systems.