Montez des volumes éphémères sur vos pods lorsque votre application nécessite un espace de stockage supplémentaire sans exiger la persistance des données. Ces volumes sont provisionnés au démarrage du pod et supprimés automatiquement lors de sa destruction, ce qui vous dispense de gérer manuellement les persistent volume claims (PVC).
Cette rubrique explique comment ajouter le champ ephemeral.volumeClaimTemplate à la spécification d'un Deployment afin de provisionner un volume éphémère sur disque pour chaque pod. Vous vérifierez ensuite que le PVC et le persistent volume (PV) associés sont bien supprimés automatiquement lors de la suppression du pod.
Pourquoi utiliser des volumes éphémères
Les volumes éphémères génériques fonctionnent comme des volumes emptyDir : leur cycle de vie est lié à celui d'un seul pod et ils sont supprimés avec lui. La différence majeure réside dans leur adossement à un PVC, offrant ainsi toutes les capacités d'un pilote de stockage persistant :
Capacité fixe : Définissez une limite de taille précise par pod pour empêcher l'application de dépasser son budget de stockage.
Stockage réseau : Utilisez un disque cloud plutôt que le stockage local du nœud, souvent limité en capacité et partagé entre plusieurs charges de travail.
Prise en charge des StorageClass : Configurez le niveau de performance, le mode d'accès et d'autres propriétés du disque.
Utilisez des volumes éphémères lorsque votre application a besoin d'un stockage temporaire trop volumineux pour le stockage local du nœud, ou lorsqu'une capacité garantie par pod est nécessaire. Voici quelques cas d'usage courants :
Services de cache : Les applications qui transfèrent des données peu consultées de la mémoire vers le disque bénéficient d'un volume isolé et borné par pod.
Stockage des journaux : Les applications générant d'importants volumes de logs peuvent écrire dans un volume éphémère dédié au lieu d'utiliser le système de fichiers partagé du nœud.
Données temporaires : Traitements par lots nécessitant un débit E/S disque élevé sans conservation des données après l'exécution du job.
Fonctionnement
Lorsque Kubernetes crée un pod contenant un volumeClaimTemplate dans sa spécification de volume ephemeral, le contrôleur de volumes éphémères crée un PVC dans le même namespace que le pod. Le nom du PVC suit un modèle déterministe : {pod-name}-{volume-name}. Cette convention de nommage prévisible permet de retrouver directement le PVC sans recherche, à condition de connaître le nom du pod et celui du volume.
À la suppression du pod, le garbage collector de Kubernetes supprime le PVC en se basant sur la relation de propriété des ressources. Étant donné que la politique de récupération par défaut des StorageClasses est Delete, le volume disque sous-jacent est également supprimé avec le PVC.
Le nommage des PVC suit le modèle{pod-name}-{volume-name}. Si deux pods d'un même namespace ont des noms produisant la même chaîne combinée (par exemple, un pod nommépod-aavec un volume nomméscratchet un pod nommépodavec un volume nomméa-scratch), un conflit de nommage survient. Utilisez des noms de pods distincts au sein d'un namespace pour éviter ce problème.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster Alibaba Cloud Container Compute Service (ACS)
kubectlconfiguré pour se connecter au cluster — consultez Obtenir le fichier kubeconfig d'un cluster et utiliser kubectl pour s'y connecter et Utiliser kubectl sur Cloud Shell pour gérer les clusters ACS
Monter un volume éphémère sur un Deployment
-
Créez un fichier nommé
ephemeral-example.yamlavec le contenu suivant :apiVersion: apps/v1 kind: Deployment metadata: name: ephemeral-example spec: replicas: 2 selector: matchLabels: pod: example-pod strategy: type: Recreate template: metadata: labels: pod: example-pod spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest resources: requests: cpu: 500m memory: 2Gi ephemeral-storage: 2Gi volumeMounts: - mountPath: "/scratch" name: scratch-volume volumes: - name: scratch-volume ephemeral: volumeClaimTemplate: metadata: labels: type: scratch-volume spec: accessModes: [ "ReadWriteOncePod" ] storageClassName: alicloud-disk-topology-alltype resources: requests: storage: 40GiCe Deployment crée deux pods, chacun disposant d'un volume éphémère dédié de 40 Gio monté sur
/scratch. Le champephemeral.volumeClaimTemplateest pris en charge sur les Deployments, les StatefulSets et les pods autonomes. Le tableau ci-dessous décrit les champs contenus dansvolumeClaimTemplate.spec:Champ Description accessModesDéfinissez cette valeur sur ReadWriteOncePodafin que le volume soit monté par un seul pod à la fois.storageClassNameLa StorageClass à utiliser. Cet exemple emploie alicloud-disk-topology-alltype, la StorageClass ACS par défaut, qui provisionne un SSD Enterprise (ESSD) de niveau de performance 1 (PL1). Un ESSD PL1 prend en charge des capacités de 20 à 65 536 Gio. Les disques sont facturés selon le mode paiement à l'utilisation — consultez Facturation des périphériques de stockage bloc et Prix des périphériques de stockage bloc.storageCapacité demandée pour le volume éphémère. -
Déployez le Deployment :
kubectl create -f ephemeral-example.yaml -
Vérifiez que les deux pods sont en cours d'exécution :
kubectl get podSortie attendue :
NAME READY STATUS RESTARTS AGE ephemeral-example-64db7b9f5c-hcpz5 1/1 Running 0 108s ephemeral-example-64db7b9f5c-qqvl5 1/1 Running 0 108s -
Confirmez qu'un PVC a été créé pour chaque pod :
kubectl get pvcSortie attendue :
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE ephemeral-example-64db7b9f5c-hcpz5-scratch-volume Bound d-uf6h6nl0yf2y1331**** 40Gi RWOP alicloud-disk-topology-alltype 3m28s ephemeral-example-64db7b9f5c-qqvl5-scratch-volume Bound d-uf6a3lk85znunou6**** 40Gi RWOP alicloud-disk-topology-alltype 3m28sLes noms des PVC suivent le modèle
{pod-name}-scratch-volume. Le champVOLUMEaffiche l'ID du disque cloud sous-jacent.
Vérifier la suppression des volumes éphémères avec le pod
-
Réduisez le Deployment à un seul réplica :
kubectl scale deploy ephemeral-example --replicas=1 -
Confirmez la suppression d'un pod :
kubectl get podSortie attendue :
NAME READY STATUS RESTARTS AGE ephemeral-example-64db7b9f5c-qqvl5 1/1 Running 0 11m -
Vérifiez que le PV du pod supprimé a bien été retiré :
kubectl get pvSortie attendue (seul le PV du pod restant subsiste) :
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE d-uf6a3lk85znunou6**** 40Gi RWOP Delete Bound default/ephemeral-example-64db7b9f5c-qqvl5-scratch-volume alicloud-disk-topology-alltype 20m -
Vérifiez que le PVC du pod supprimé a également disparu :
kubectl get pvcSortie attendue (seul le PVC du pod restant subsiste) :
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE ephemeral-example-64db7b9f5c-qqvl5-scratch-volume Bound d-uf6a3lk85znunou6**** 40Gi RWOP alicloud-disk-topology-alltype 15mLe PVC et son disque sous-jacent ont été supprimés conjointement avec le pod. Le volume éphémère du pod restant demeure lié.