Kubernetes ne gère pas directement le réseau, le stockage ou l’exécution des conteneurs. Il délègue ces responsabilités à des plugins externes via trois interfaces standardisées : CNI (réseau), CSI (stockage) et CRI (runtime). Comprendre ces interfaces est essentiel pour la certification CKA (domaine Cluster Architecture, 25%).
Ce guide explique le rôle de chaque interface et comment les diagnostiquer.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- CNI : comment Kubernetes configure le réseau des Pods
- CSI : comment Kubernetes accède au stockage externe
- CRI : comment le kubelet communique avec le runtime de conteneurs
- Les commandes de diagnostic pour chaque interface
Vue d’ensemble des trois interfaces
Section intitulée « Vue d’ensemble des trois interfaces »┌─────────────────────────────────────────────────────────────────────────┐│ KUBERNETES ││ ││ ┌─────────────────────────────────────────────────────────────────┐ ││ │ kubelet │ ││ └───────────┬─────────────────────┬─────────────────────┬─────────┘ ││ │ │ │ ││ ▼ ▼ ▼ ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │ CRI │ │ CNI │ │ CSI │ ││ │ Runtime │ │ Réseau │ │ Stockage │ ││ └────┬─────┘ └────┬─────┘ └────┬─────┘ ││ │ │ │ │└────────────┼─────────────────────┼─────────────────────┼────────────────┘ │ │ │ ▼ ▼ ▼ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ containerd │ │ Calico │ │ AWS EBS │ │ CRI-O │ │ Cilium │ │ Ceph CSI │ │ etc. │ │ Flannel │ │ NFS CSI │ └────────────┘ └────────────┘ └────────────┘| Interface | Acronyme | Rôle | Exemple de plugins |
|---|---|---|---|
| CRI | Container Runtime Interface | Créer/gérer les conteneurs | containerd, CRI-O |
| CNI | Container Network Interface | Configurer le réseau des Pods | Calico, Cilium, Flannel |
| CSI | Container Storage Interface | Provisionner le stockage | AWS EBS, Ceph, NFS |
CRI — Container Runtime Interface
Section intitulée « CRI — Container Runtime Interface »C’est quoi ?
Section intitulée « C’est quoi ? »Le CRI est l’interface gRPC entre le kubelet et le runtime de conteneurs. Il permet au kubelet de créer, démarrer, arrêter et supprimer des conteneurs sans connaître les détails d’implémentation du runtime.
Pourquoi c’est important ?
Section intitulée « Pourquoi c’est important ? »Avant le CRI (Kubernetes < 1.5), le kubelet était couplé à Docker. Le CRI a permis de supporter d’autres runtimes comme containerd ou CRI-O.
Runtimes CRI compatibles
Section intitulée « Runtimes CRI compatibles »| Runtime | Description | Cas d’usage |
|---|---|---|
| containerd | Runtime léger, standard de facto | Clusters kubeadm, cloud providers |
| CRI-O | Optimisé pour Kubernetes | OpenShift, clusters minimalistes |
Vérifier le runtime configuré
Section intitulée « Vérifier le runtime configuré »# Voir le runtime utilisé par le kubeletkubectl get nodes -o wideNAME STATUS ROLES VERSION CONTAINER-RUNTIMEmaster1 Ready control-plane v1.35.2 containerd://1.7.14worker1 Ready <none> v1.35.2 containerd://1.7.14# Détails du socket CRIkubectl get node <node-name> -o jsonpath='{.status.nodeInfo.containerRuntimeVersion}'Configuration kubelet
Section intitulée « Configuration kubelet »Le kubelet se connecte au runtime via un socket Unix. C’est le paramètre clé de la configuration CRI :
# Socket containerd (défaut sur la plupart des distributions)--container-runtime-endpoint=unix:///run/containerd/containerd.sock
# Socket CRI-O--container-runtime-endpoint=unix:///var/run/crio/crio.sockLa configuration exacte varie selon les distributions. Sur un nœud kubeadm, vous pouvez vérifier :
# Voir l'endpoint configuréps aux | grep kubelet | grep container-runtime-endpoint
# Ou dans la config kubelet (selon distribution)cat /var/lib/kubelet/kubeadm-flags.envDiagnostic CRI
Section intitulée « Diagnostic CRI »# Vérifier que le socket existels -la /run/containerd/containerd.sock
# Tester la connexion avec crictlcrictl info
# Lister les conteneurs via CRIcrictl ps
# Lister les imagescrictl imagesCNI — Container Network Interface
Section intitulée « CNI — Container Network Interface »C’est quoi ?
Section intitulée « C’est quoi ? »Le CNI est la spécification qui définit comment configurer le réseau des conteneurs. Quand un Pod est créé, le runtime appelle les plugins CNI pour :
- Créer une interface réseau dans le Pod
- Assigner une adresse IP
- Configurer les routes
Le flow réseau Pod
Section intitulée « Le flow réseau Pod »1. kubelet demande la création d'un Pod au runtime (CRI) │ ▼2. Le runtime crée le conteneur et son namespace réseau │ ▼3. Le runtime appelle les plugins CNI configurés │ ▼4. CNI assigne une IP et configure le réseau │ ▼5. Le Pod est accessible sur le réseau du clusterPlugins CNI populaires
Section intitulée « Plugins CNI populaires »| Plugin | Mode réseau | Forces |
|---|---|---|
| Calico | BGP / VXLAN / IP-in-IP | Network Policies, performance |
| Cilium | eBPF | Observabilité, sécurité avancée |
| Flannel | VXLAN / host-gw | Simplicité, idéal pour débuter |
| Canal | Calico + Flannel | Combine les deux |
Configuration CNI
Section intitulée « Configuration CNI »Les plugins CNI sont configurés dans /etc/cni/net.d/ :
# Lister les configurations CNIls /etc/cni/net.d/10-calico.conflistExemple de configuration Calico :
{ "name": "k8s-pod-network", "cniVersion": "1.0.0", "plugins": [ { "type": "calico", "datastore_type": "kubernetes", "ipam": { "type": "calico-ipam" }, "policy": { "type": "k8s" } }, { "type": "portmap", "capabilities": {"portMappings": true} } ]}Binaires CNI
Section intitulée « Binaires CNI »Les binaires des plugins sont dans /opt/cni/bin/ :
ls /opt/cni/bin/bandwidth bridge calico calico-ipam flannel host-local loopback portmap ...Diagnostic CNI
Section intitulée « Diagnostic CNI »# Vérifier le plugin CNI installékubectl get pods -n kube-system | grep -E 'calico|cilium|flannel|weave'
# Voir l'IP attribuée à un Podkubectl get pod <pod-name> -o wide
# Vérifier le CIDR du clusterkubectl cluster-info dump | grep -m 1 cluster-cidr
# Voir le CIDR alloué à chaque nœudkubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'Problèmes CNI courants
Section intitulée « Problèmes CNI courants »| Symptôme | Cause probable | Solution |
|---|---|---|
Pod en ContainerCreating | Plugin CNI manquant | Installer un CNI (Calico, Flannel…) |
| Pod sans IP | Erreur IPAM | Vérifier logs du plugin CNI |
| Pods ne communiquent pas | Network Policy ou erreur plugin | Vérifier les Network Policies |
CSI — Container Storage Interface
Section intitulée « CSI — Container Storage Interface »C’est quoi ?
Section intitulée « C’est quoi ? »Le CSI est l’interface standard pour provisionner et attacher du stockage aux conteneurs. Il remplace les plugins de stockage “in-tree” (intégrés au code de Kubernetes).
Pourquoi CSI ?
Section intitulée « Pourquoi CSI ? »Avant CSI, chaque type de stockage (AWS EBS, GCE PD, Ceph…) nécessitait du code dans le core Kubernetes. Avec CSI :
- Les drivers sont développés indépendamment de Kubernetes
- Les mises à jour de drivers n’impactent pas le cycle de release Kubernetes
- N’importe quel vendor peut créer un driver CSI
Migration CSI
Section intitulée « Migration CSI »Kubernetes redirige automatiquement les appels aux plugins in-tree vers les drivers CSI correspondants :
| Plugin in-tree (déprécié) | Driver CSI |
|---|---|
| awsElasticBlockStore | ebs.csi.aws.com |
| gcePersistentDisk | pd.csi.storage.gke.io |
| azureDisk | disk.csi.azure.com |
| cinder (OpenStack) | cinder.csi.openstack.org |
| vsphereVolume | csi.vsphere.vmware.com |
Architecture CSI
Section intitulée « Architecture CSI »┌─────────────────────────────────────────────────────────────────┐│ Kubernetes ││ ││ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ││ │ PVC │───▶│ StorageClass │───▶│ CSI Driver │ ││ │ (claim) │ │ (provisioner)│ │ (controller) │ ││ └──────────────┘ └──────────────┘ └──────┬───────┘ ││ │ │└──────────────────────────────────────────────────┼───────────────┘ │ ▼ ┌──────────────┐ │ Stockage │ │ externe │ └──────────────┘Composants CSI
Section intitulée « Composants CSI »Un driver CSI se compose de plusieurs pods :
| Composant | Rôle | Déploiement typique |
|---|---|---|
| Controller | Provisionne/supprime les volumes | Deployment dans kube-system |
| Node | Monte/démonte les volumes | DaemonSet sur chaque nœud |
| CSI Sidecars | external-provisioner, external-attacher… | Avec le controller |
Vérifier les drivers CSI
Section intitulée « Vérifier les drivers CSI »# Lister les CSI Drivers installéskubectl get csidriversNAME ATTACHREQUIRED PODINFOONMOUNT ...ebs.csi.aws.com true falseefs.csi.aws.com false false# Détails d'un driverkubectl describe csidriver ebs.csi.aws.comStorageClass CSI
Section intitulée « StorageClass CSI »apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: gp3provisioner: ebs.csi.aws.comparameters: type: gp3 fsType: ext4volumeBindingMode: WaitForFirstConsumerallowVolumeExpansion: trueDiagnostic CSI
Section intitulée « Diagnostic CSI »# Vérifier les pods CSIkubectl get pods -n kube-system | grep csi
# Logs du controller CSIkubectl logs -n kube-system -l app=ebs-csi-controller -c csi-provisioner
# Vérifier les PV créés via CSIkubectl get pv -o custom-columns=NAME:.metadata.name,DRIVER:.spec.csi.driver
# Événements de PVCkubectl describe pvc <pvc-name>Tableau comparatif
Section intitulée « Tableau comparatif »| Aspect | CRI | CNI | CSI |
|---|---|---|---|
| Rôle | Exécuter les conteneurs | Configurer le réseau | Provisionner le stockage |
| Appelé par | kubelet | Container runtime | kubelet + sidecars + controller |
| Config | Socket runtime | /etc/cni/net.d/ | StorageClass |
| Exemples | containerd, CRI-O | Calico, Cilium | AWS EBS, Ceph |
| Diagnostic | crictl | kubectl get pods -n kube-system | kubectl get csidrivers |
Où regarder quand ça casse
Section intitulée « Où regarder quand ça casse »Structurez votre diagnostic par interface :
Problèmes CRI (runtime)
Section intitulée « Problèmes CRI (runtime) »Symptômes : kubelet ne lance pas les Pods, erreurs “container runtime is down”
# Vérifier que le socket existels -la /run/containerd/containerd.sock
# Vérifier l'état du servicesystemctl status containerdjournalctl -u containerd -n 50
# Tester la connexioncrictl infoProblèmes CNI (réseau)
Section intitulée « Problèmes CNI (réseau) »Symptômes : Pods bloqués en ContainerCreating, pas d’IP assignée
# Vérifier qu'un plugin CNI est installéls /etc/cni/net.d/ls /opt/cni/bin/
# Vérifier les Pods CNIkubectl get pods -n kube-system | grep -E 'calico|cilium|flannel'
# Logs du plugin CNIkubectl logs -n kube-system -l k8s-app=calico-nodeProblèmes CSI (stockage)
Section intitulée « Problèmes CSI (stockage) »Symptômes : PVC en Pending, volume qui ne se monte pas
# Vérifier le driver CSIkubectl get csidrivers
# Vérifier les événements du PVCkubectl describe pvc <name>
# Logs du controller CSIkubectl logs -n kube-system -l app=ebs-csi-controller -c csi-provisionerCommandes CKA essentielles
Section intitulée « Commandes CKA essentielles »# === CRI ===# Vérifier le runtimekubectl get nodes -o widecrictl infocrictl ps
# === CNI ===# Voir le plugin CNIls /etc/cni/net.d/kubectl get pods -n kube-system | grep -E 'calico|cilium|flannel'
# Voir les CIDR par nœudkubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'
# === CSI ===# Lister les drivers CSIkubectl get csidrivers
# Vérifier les StorageClasseskubectl get storageclasses
# Debug un PVC bloquékubectl describe pvc <name>À retenir
Section intitulée « À retenir »- CRI = interface kubelet ↔ container runtime (containerd, CRI-O)
- CNI = interface pour configurer le réseau des Pods
- CSI = interface pour provisionner du stockage externe
- Les plugins in-tree sont dépréciés — utilisez CSI pour le stockage
- crictl pour diagnostiquer le runtime
- Config CNI dans
/etc/cni/net.d/, binaires dans/opt/cni/bin/ - StorageClass définit quel driver CSI utiliser