## Introduction L'automatisation du CI/CD des pilotes CSI Kubernetes avec des exemples pratiques doit aider les opérateurs à passer d'un problème observé à un résultat vérifié. Cet article se concentre sur le CI/CD des pilotes CSI Kubernetes pour les développeurs, les consultants DevOps et les équipes techniques de startups. Il relie l'automatisation, le déploiement, le pipeline et le retour arrière des pilotes CSI Kubernetes à des commandes concrètes, des sorties attendues, des signaux d'échec et des décisions de récupération. L'objectif est la sécurité opérationnelle : observer avant de modifier, limiter le rayon d'impact, utiliser des variables fictives au lieu de secrets, vérifier le résultat et documenter comment récupérer si l'état attendu n'est pas atteint. Tout au long de l'article, nous utilisons un exemple cohérent : un pilote CSI AWS EBS s'exécutant dans un cluster sur AWS, avec une StorageClass nommée ebs-sc et un PVC nommé data-pvc . Remplacez ces éléments par les spécificités de votre environnement. ## Inventaire des versions et de l'environnement Avant tout changement CI/CD, capturez l'état actuel du pilote CSI et de ses dépendances. Cet inventaire empêche que des mises à niveau ou des changements de configuration ne cassent les volumes ou les applications existants. ### Identification des composants Identifiez le nom du pilote CSI, l'espace de noms, la version et la version de Kubernetes prise en charge. Pour le pilote CSI AWS EBS, les pods du contrôleur et du nœud s'exécutent généralement dans l'espace de noms kube-system . Vérifiez la version installée avec : kubectl get deployment ebs-csi-controller -n kube-system -o jsonpath='{.spec.template.spec.containers[0].image}' Exemple de sortie attendue : public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.35.0 Notez la version v1.35.0 . Les notes de version du pilote spécifient les versions minimales de Kubernetes et la compatibilité. Par exemple, la version v1.35.0 nécessite Kubernetes 1.21 ou ultérieur. ### Observation en lecture seule Exécutez ces commandes pour observer le système sans rien modifier : kubectl get pods -n kube-system -l app=ebs-csi-controller -o wide kubectl get pods -n kube-system -l app=ebs-csi-node -o wide kubectl get csidriver kubectl get storageclass ebs-sc -o yaml Vérifiez que tous les pods du contrôleur et du nœud sont Running et READY . L'objet csidriver indique si le pilote est enregistré ; pour EBS, il affiche ebs.csi.aws.com avec attachRequired: true et podInfoOnMount: false . Cela vous indique que le pilote nécessite une attache du volume avant le montage. ### Dépendances et prérequis Vérifiez que les secrets et les comptes de service requis existent. Pour le CSI EBS, le contrôleur a besoin d'autorisations IAM via IRSA ou un secret. Vérifiez : kubectl get sa ebs-csi-controller-sa -n kube-system kubectl get secret aws-secret -n kube-system -o yaml Si vous utilisez IRSA, confirmez que l'annotation sur le compte de service pointe vers l'ARN du rôle IAM correct. Enregistrez ces éléments avant les modifications, car les pipelines CI/CD les écrasent souvent. ### Plus petit changement justifié Une fois l'état actuel documenté, définissez le plus petit changement. Pour une mise à niveau du pilote, cela peut être la mise à jour de l'étiquette d'image dans le déploiement du contrôleur. Mais avant de modifier, enregistrez le manifeste de déploiement actuel pour le retour arrière : kubectl get deployment ebs-csi-controller -n kube-system -o yaml > ebs-csi-controller-backup-$(date +%Y%m%d-%H%M%S).yaml Cette sauvegarde est votre artefact de retour arrière. Stockez-la dans un emplacement sûr accessible à votre pipeline.
## Chemin de configuration sûr Cette section montre comment implémenter un changement de configuration en toute sécurité, en utilisant un pipeline CI/CD avec une stratégie de déploiement canari. ### Étape 1 : Construire et tester la nouvelle configuration du pilote Supposons que vous deviez mettre à jour un paramètre du pilote, comme activer l'expansion de volume ou modifier le nombre de réplicas du contrôleur. Dans votre pipeline, créez une nouvelle branche et modifiez les valeurs Helm ou le manifeste YAML. Par exemple, pour augmenter les réplicas du contrôleur de 2 à 3, modifiez le déploiement : apiVersion: apps/v1 kind: Deployment metadata: name: ebs-csi-controller namespace: kube-system spec: replicas: 3 template: spec: containers: - name: ebs-plugin image: public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.35.0 args: - --endpoint=$(CSI_ENDPOINT) - --logtostderr - --v=4 - --enable-volume-scheduling=true - --enable-volume-resizing=true - --enable-volume-snapshots=true Ici, --enable-volume-resizing=true permet l'expansion du PVC. Vérifiez que les arguments sont pris en charge par la version du pilote ; consultez la documentation du pilote pour les indicateurs. ### Étape 2 : Valider les manifestes dans le CI Avant d'appliquer au cluster, exécutez une validation statique. Utilisez kubeconform ou kubectl apply --dry-run=client : kubectl apply -f ebs-csi-controller.yaml --dry-run=client Sortie attendue : deployment.apps/ebs-csi-controller configured (dry run) Cela détecte les erreurs de syntaxe. Exécutez également kubectl diff -f ebs-csi-controller.yaml pour voir les modifications qui seraient appliquées. ### Étape 3 : Déployer dans un espace de noms canari ou un groupe de nœuds Au lieu de déployer sur tous les nœuds en une seule fois, utilisez une approche canari. Pour les plugins de nœud CSI, qui s'exécutent en DaemonSets, vous pouvez utiliser un sélecteur de nœud pour cibler un sous-ensemble de nœuds. Pour le contrôleur, vous pouvez créer un déploiement séparé avec un nom différent dans le même espace de noms, mais cela peut entrer en conflit. Mieux : utilisez une version Helm avec un espace de noms de test. Pour plus de simplicité, nous déployons dans un espace de noms de test csi-test : kubectl create namespace csi-test helm upgrade --install ebs-csi-driver-test aws-ebs-csi-driver \ --namespace csi-test \ --set controller.replicaCount=1 \ --set node.enable=false Cela déploie uniquement le composant contrôleur en test, pas le plugin de nœud. Exécutez des tests d'intégration contre un PVC de test dans cet espace de noms : apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-pvc namespace: csi-test spec: accessModes: - ReadWriteOnce storageClassName: ebs-sc resources: requests: storage: 1Gi Appliquez et attendez la liaison : kubectl apply -f test-pvc.yaml kubectl get pvc test-pvc -n csi-test --watch Sortie attendue après quelques secondes : NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE test-pvc Bound pvc-1234abcd-5678-efgh-ijkl-mnopqrstuvwx 1Gi RWO ebs-sc 10s Si le PVC reste Pending , vérifiez les événements : kubectl describe pvc test-pvc -n csi-test ### Étape 4 : Promouvoir en production Après le succès des tests, promouvez le changement dans l'espace de noms de production ( kube-system ou votre espace dédié). Utilisez votre outil CD (Argo CD, Flux, Jenkins). Par exemple, avec kubectl set image : kubectl set image deployment/ebs-csi-controller -n kube-system ebs-plugin=public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.35.0 Vérifiez l'état du déploiement : kubectl rollout status deployment/ebs-csi-controller -n kube-system Sortie attendue : deployment "ebs-csi-controller" successfully rolled out Pour le plugin de nœud (DaemonSet), utilisez kubectl rollout status daemonset/ebs-csi-node -n kube-system . ### Étape 5 : Vérifier que les volumes persistants fonctionnent toujours Après le déploiement, créez ou vérifiez un PVC existant. Utilisez un secret fictif, jamais de véritables informations d'identification, dans les journaux du pipeline. Si vous utilisez AWS, assurez-vous que les autorisations du rôle IAM sont inchangées. Vérifiez en créant un pod de test qui monte le volume et écrit un fichier. ## Vérification et diagnostic Après avoir déployé ou modifié le pilote CSI, vérifiez que les opérations de stockage fonctionnent de bout en bout. ### Santé des pods et du pilote Exécutez les commandes suivantes : kubectl get pods -n kube-system -l app=ebs-csi-controller kubectl get pods -n kube-system -l app=ebs-csi-node kubectl logs deployment/ebs-csi-controller -n kube-system --tail=50 Recherchez des erreurs comme failed to provision volume , unauthorized ou context deadline exceeded . Si les journaux du contrôleur montrent des erreurs IAM, vérifiez la liaison du rôle IAM du compte de service. ### Test de provisionnement de volume Créez un PVC et un pod qui l'utilise. Utilisez un pod busybox simple : apiVersion: v1 kind: Pod metadata: name: test-ebs-pod spec: containers: - name: app image: busybox command: ["/bin/sh"] args: ["-c", "echo hello > /data/test.txt && sleep 3600"] volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: test-pvc Appliquez et vérifiez : kubectl apply -f test-pod.yaml kubectl get pod test-ebs-pod Si le pod est Running , exécutez une commande pour vérifier le fichier : kubectl exec test-ebs-pod -- cat /data/test.txt Sortie attendue : hello Si le pod est bloqué en ContainerCreating , exécutez kubectl describe pod test-ebs-pod et recherchez des événements comme FailedAttachVolume ou FailedMount . Vérifiez les journaux du plugin de nœud sur le nœud concerné : kubectl logs -n kube-system daemonset/ebs-csi-node -c ebs-plugin --tail=50 ### Vérifications spécifiques au pilote CSI Pour le CSI EBS, vérifiez que l'objet CSI Driver existe : kubectl get csidriver ebs.csi.aws.com -o yaml Vérifiez attachRequired: true , podInfoOnMount: false et volumeLifecycleModes inclut Persistent . Si ces valeurs sont incorrectes, les volumes peuvent ne pas s'attacher ou se monter. Utilisez les tests csi-sanity si disponibles, ou exécutez la validation propre au pilote. De nombreux pilotes CSI incluent un mode --check ou un plugin kubectl csi (du CSI cert-manager ou similaire) pour tester les points de terminaison gRPC. ## Modes de défaillance et récupération Le CI/CD des pilotes CSI doit inclure des procédures de retour arrière et de récupération pour les scénarios de défaillance courants. ### Scénario 1 : La mise à niveau du pilote casse les PVC existants Si après la mise à niveau, les PVC existants ne se montent pas (pods bloqués en ContainerCreating avec Volume not attached ), vérifiez d'abord si la version du pilote est incompatible avec la version de Kubernetes. La solution consiste à revenir à l'image précédente. Utilisez le YAML de sauvegarde créé précédemment ou votre historique git. Par exemple : kubectl apply -f ebs-csi-controller-backup-20250101-120000.yaml kubectl rollout status deployment/ebs-csi-controller -n kube-system --timeout=60s Si le retour arrière du déploiement échoue, utilisez kubectl rollout undo : kubectl rollout undo deployment/ebs-csi-controller -n kube-system Ensuite, vérifiez les pods et les PVC. Si les volumes ont été modifiés de manière incorrecte, vous devrez peut-être restaurer à partir de snapshots. Assurez-vous d'avoir activé et testé les snapshots de volume. ### Scénario 2 : Le DaemonSet du plugin de nœud échoue sur les nouveaux nœuds Un problème courant après l'ajout de nouveaux nœuds est que le pod du plugin de nœud CSI ne s'exécute pas sur le nouveau nœud. Vérifiez avec : kubectl get pods -n kube-system -l app=ebs-csi-node -o wide | grep