Version imprimable multipages. Cliquer ici pour imprimer.
Stockage
1 - Volumes
Les fichiers sur disque dans un conteneur sont éphémères, ce qui présente des problèmes pour
des applications non-triviales lorsqu'elles s'exécutent dans des conteneurs. Premièrement, lorsqu'un
conteneur plante, kubelet va le redémarrer mais les fichiers seront perdus - le conteneur démarre
avec un état propre. Deuxièmement, lorsque plusieurs conteneurs s'exécutent ensemble dans un Pod
,
il est souvent nécessaire de partager des fichiers entre ces conteneurs. L'abstraction Kubernetes
Volume
résout ces deux problèmes.
Une connaissance des Pods est suggérée.
Contexte
Docker a également un concept de volumes, bien qu'il soit, dans une certaine mesure, plus relâché et moins géré. Avec Docker, un volume est simplement un dossier sur le disque ou dans un autre conteneur. Les durées de vie ne sont pas gérées et, jusqu'à très récemment, seuls les volumes supportés par un disque local l'étaient. Docker fournit maintenant des pilotes de volume, mais la fonctionnalité est très limitée pour le moment (par exemple, à partir de Docker 1.7, seulement un pilote de volume est autorisé par conteneur et il n'est pas possible de passer des paramètres aux volumes).
Un volume Kubernetes, en revanche, a une durée de vie explicite - la même que le Pod qui l'inclut. Par conséquent, un volume survit aux conteneurs qui s'exécutent à l'intérieur du Pod et les données sont préservées lorsque le conteneur redémarre. Bien sûr, lorsqu'un Pod cesse d'exister, le volume va également cesser d'exister. Peut-être plus important encore, Kubernetes supporte de nombreux types de volumes et un Pod peut en utiliser plusieurs simultanément.
À la base, un volume est juste un dossier, contenant possiblement des données, qui est accessible aux conteneurs dans un Pod. La manière dont ce dossier est créé, le support qui le sauvegarde et son contenu sont déterminés par le type de volume utilisé.
Pour utiliser un volume, un Pod spécifie les volumes à fournir au Pod (le champ .spec.volumes
)
et où les monter dans les conteneurs (le champ .spec.containers.volumeMounts
).
Un processus dans un conteneur a une vue système de fichiers composée de son image et de ses volumes Docker. L'image Docker est à la racine de la hiérarchie du système de fichiers et tous les volumes sont montés sur les chemins spécifiés dans l'image. Les volumes ne peuvent pas être montés sur d'autres volumes ou avoir des liens physiques vers d'autres volumes. Chaque conteneur dans le Pod doit spécifier indépendamment où monter chaque volume.
Types de Volumes
Kubernetes supporte plusieurs types de Volumes:
- awsElasticBlockStore
- azureDisk
- azureFile
- cephfs
- cinder
- configMap
- csi
- downwardAPI
- emptyDir
- fc (fibre channel)
- flexVolume
- flocker
- gcePersistentDisk
- gitRepo (deprecated)
- glusterfs
- hostPath
- iscsi
- local
- nfs
- persistentVolumeClaim
- projected
- portworxVolume
- quobyte
- rbd
- scaleIO
- secret
- storageos
- vsphereVolume
Toute contribution supplémentaire est la bienvenue.
awsElasticBlockStore
Un type de volume awsElasticBlockStore
monte un Volume EBS d'Amazon Web Services (AWS) dans un Pod.
À la différence de emptyDir
, qui est écrasé lorsqu'un Pod est supprimé, le contenu d'un volume EBS
est préservé et le volume est seulement démonté. Cela signifie qu'un volume EBS peut être prérempli avec des données et que les données peuvent être transmises entre les Pods.
Avertissement:
Vous devez créer un volume EBS avec la commandeaws ec2 create-volume
ou l'API AWS avant de pouvoir l'utiliser.Des restrictions existent lorsque l'on utilise un volume awsElasticBlockStore
:
- les nœuds dans lesquels les Pods s'exécutent doivent être des instances AWS EC2
- ces instances doivent être dans la même région et la même zone de disponibilité que le volume EBS
- EBS supporte uniquement le montage d'un volume par une seule instance EC2
Création d'un volume EBS
Avant que vous puissiez utiliser un volume EBS dans un Pod, vous devez le créer.
aws ec2 create-volume --availability-zone=eu-west-1a --size=10 --volume-type=gp2
Assurez-vous que la zone correspond à la zone de votre grappe de serveurs (cluster). (Et vérifiez aussi que la taille et le type du volume EBS conviennent à votre utilisation!)
Exemple de configuration AWS EBS
apiVersion: v1
kind: Pod
metadata:
name: test-ebs
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-ebs
name: test-volume
volumes:
- name: test-volume
# Ce volume AWS EBS doit déjà exister.
awsElasticBlockStore:
volumeID: <volume-id>
fsType: ext4
Migration CSI
Kubernetes v1.14 [alpha]
La fonctionnalité de migration CSI pour awsElasticBlockStore, lorsque activée, fixe toutes les opérations de plugin depuis le plugin "in-tree" vers le pilote de l'interface CSI (Container Storage Interface) ebs.csi.aws.com
.
Afin d'utiliser cette fonctionnalité, le Pilote AWS EBS CSI doit être installé dans le cluster et les fonctionnalités Alpha CSIMigration
et CSIMigrationAWS
doivent être activées.
azureDisk
Un type de volume azureDisk
est utilisé pour monter un disque de données (Data Disk) dans un Pod.
Plus de détails sont disponibles ici.
Migration CSI
Kubernetes v1.15 [alpha]
La fonctionnalité de migration CSI pour azureDisk, lorsque activée, fixe toutes les opérations de plugin depuis le plugin "in-tree" vers le pilote de l'interface CSI (Container Storage Interface) disk.csi.azure.com
.
Afin d'utiliser cette fonctionnalité, le Pilote Azure Disk CSI doit être installé dans le cluster et les fonctionnalités Alpha CSIMigration
et CSIMigrationAzureDisk
doivent être activées.
azureFile
Un type de volume azureFile
est utilisé pour monter un volume de fichier Microsoft Azure (SMB 2.1 et 3.0) dans un Pod.
Plus de détails sont disponibles ici.
Migration CSI
Kubernetes v1.15 [alpha]
La fonctionnalité de migration CSI pour azureFile, lorsque activée, fixe toutes les opérations de plugin depuis le plugin "in-tree" vers le pilote de l'interface CSI (Container Storage Interface) file.csi.azure.com
.
Afin d'utiliser cette fonctionnalité, le Pilote Azure File CSI doit être installé dans le cluster et les fonctionnalités Alpha CSIMigration
et CSIMigrationAzureFile
doivent être activées.
cephfs
Un volume cephfs
permet de monter un volume CephFS existant dans un Pod.
Contrairement à emptyDir
, qui est écrasé quand un Pod est supprimé, le contenu d'un volume cephfs
est préservé et le volume est simplement démonté.
Cela signifie qu'un volume CephFS peut être prérempli avec des données et ces données peuvent être transmises entre les Pods.
CephFS peut être monté plusieurs fois en écriture simultanément.
Avertissement:
Vous devez exécuter votre propre serveur Ceph avec le partage exporté avant de pouvoir l'utiliser.Voir l'exemple CephFS pour plus de détails.
cinder
Note:
prérequis : Kubernetes avec le fournisseur infonuagique OpenStack (OpenStack Cloud Provider) configuré. Pour la configuration cloudprovider, se référer à cloud provider openstack.cinder
est utilisé pour monter un volume Cinder OpenStack dans un Pod.
Exemple de configuration d'un volume Cinder
apiVersion: v1
kind: Pod
metadata:
name: test-cinder
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-cinder-container
volumeMounts:
- mountPath: /test-cinder
name: test-volume
volumes:
- name: test-volume
# Ce volume OpenStack doit déjà exister.
cinder:
volumeID: <volume-id>
fsType: ext4
Migration CSI
Kubernetes v1.14 [alpha]
La fonctionnalité de migration CSI pour Cinder, lorsque activée, fixe toutes les opérations de plugin depuis le plugin "in-tree" vers le pilote de l'interface CSI (Container Storage Interface) cinder.csi.openstack.org
.
Afin d'utiliser cette fonctionnalité, le Pilote Cinder CSI doit être installé dans le cluster et les fonctionnalités Alpha CSIMigration
et CSIMigrationOpenStack
doivent être activées.
configMap
La ressource configMap
fournit un moyen d'injecter des données de configuration dans les Pods.
Les données stockées dans un objet ConfigMap
peuvent être référencées dans un volume de type configMap
et être ensuite consommées par des applications conteneurisées s'exécutant dans un Pod.
Lorsque l'on référence un objet configMap
, on peut simplement fournir son nom dans le volume
pour le référencer. On peut également personnaliser le chemin pour utiliser une entrée spécifique dans
la ConfigMap. Par exemple, pour monter la ConfigMap log-config
sur un Pod appelé configmap-pod
,
vous pourriez utiliser le YAML suivant :
apiVersion: v1
kind: Pod
metadata:
name: configmap-pod
spec:
containers:
- name: test
image: busybox
volumeMounts:
- name: config-vol
mountPath: /etc/config
volumes:
- name: config-vol
configMap:
name: log-config
items:
- key: log_level
path: log_level
La ConfigMap log-config
est montée comme un volume et tout le contenu stocké dans son entrée log_level
est monté dans le Pod au chemin "/etc/config/log_level
".
À noter que ce chemin est dérivé du mountPath
du volume et le path
est étiqueté avec la clef log_level
.
Avertissement:
Vous devez créer une ConfigMap avant de pouvoir l'utiliser.Note:
Un conteneur utilisant une ConfigMap en tant que montage de volume subPath ne recevra pas les mises à jour de la ConfigMap.downwardAPI
Un volume downwardAPI
est utilisé pour rendre disponibles aux applications les données de l'API Downward.
Il monte un dossier et écrit les données demandées dans des fichiers de texte brut.
Note:
Un conteneur utilisant l'API Downward en tant que montage de volume subPath ne recevra pas les mises à jour de l'API Downward.Voir l'exemple de volume downwardAPI
pour plus de détails.
emptyDir
Un volume emptyDir
est d'abord créé lorsqu'un Pod est assigné à un nœud et existe aussi longtemps que le Pod s'exécute sur ce nœud.
Comme le nom l'indique, le volume est initialement vide. Les conteneurs dans le Pod peuvent tous lire et écrire les mêmes fichiers dans le volume emptyDir
, bien que ce volume puisse être monté sur le même ou différents chemins dans chaque conteneur.
Lorsqu'un Pod est supprimé d'un nœud pour une raison quelconque, les données dans le emptyDir
sont supprimées à jamais.
Note:
Un conteneur qui plante ne retire PAS un Pod d'un nœud, ainsi, les données présentes dans unemptyDir
sont protégées en cas de plantage du conteneur.Des cas d'utilisation pour un emptyDir
peuvent être :
- un espace de travail, par exemple pour un tri fusion sur disque.
- l'établissement d'un point de reprise d'un long calcul à des fins de récupération des données après un crash.
- le stockage de fichiers qu'un conteneur de gestion de contenu va chercher pendant qu'un conteneur serveur web expose les données.
Par défaut, les volumes emptyDir
sont stockés sur tout médium supporté par le nœud - que ce soit un disque dur, un disque SSD ou un stockage réseau, dépendamment de l'environnement.
Cependant, vous pouvez définir le champ emptyDir.medium
à "Memory"
pour indiquer à Kubernetes de monter un tmpfs (système de fichiers supporté par la RAM) pour vous à la place.
Tandis que tmpfs est très rapide, soyez conscient qu'au contraire des disques, un tmpfs est effacé au redémarrage du nœud et tous les fichiers que vous écrivez seront comptabilisés dans la limite de mémoire de votre conteneur.
Exemple de Pod
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
fc (fibre channel)
Un volume fc
permet à un volume Fibre Channel existant d'être monté dans un Pod.
Vous pouvez spécifier une ou plusieurs cibles World Wide Names en utilisant le paramètre
targetWWNs
dans votre configuration de volume.
Si plusieurs WWNs sont spécifiés, targetWWNs s'attend à ce que ces WWNs proviennent de connexions multi-path.
Avertissement:
Vous devez configurer un zonage FC SAN pour allouer et masquer au préalable ces LUNs (volumes) aux cibles WWNs afin que les hôtes Kubernetes puissent y accéder.Voir l'exemple FC pour plus de détails.
flocker
Flocker est un gestionnaire de volumes de données en cluster open-source. Il assure la gestion et l'orchestration de volumes de données supportés par divers serveurs de stockage.
Un volume flocker
permet de monter un ensemble de données Flocker dans un Pod.
Si l'ensemble de données n'existe pas déjà dans Flocker, il doit d'abord être créé avec la CLI Flocker ou en utilisant l'API Flocker.
Si l'ensemble de données existe déjà, il sera réattaché par Flocker au nœud sur lequel le Pod est planifié.
Cela signifie que les données peuvent être transmises entre les Pods selon les besoins.
Avertissement:
Vous devez exécuter votre propre installation de Flocker avant de pouvoir l'utiliser.Voir l'exemple Flocker pour plus de détails.
gcePersistentDisk
Un volume gcePersistentDisk
monte un Disque Persistant Google Compute Engine (GCE) dans un Pod.
À la différence d'un emptyDir
, qui est écrasé lorsqu'un Pod est supprimé, le contenu d'un disque persistant est préservé et le volume est simplement démonté. Cela signifie qu'un disque persistant peut être prérempli avec des données et que ces données peuvent être transmises entre les Pods.
Avertissement:
Vous devez créer un disque persistant en utilisantgcloud
, l'API GCE ou l'interface utilisateur avant de pouvoir utiliser ce disque.Des restrictions existent lors de l'utilisation d'un gcePersistentDisk
:
- les nœuds sur lesquels les Pods s'exécutent doivent être des machines virtuelles (VMs) GCE.
- ces VMs doivent se trouver dans le même projet et la même zone GCE que le disque persistant
Une fonctionnalité des disques persistants est qu'ils peuvent être montés en lecture seule par plusieurs consommateurs simultanément. Cela signifie que vous pouvez préremplir un disque persistant avec votre jeu de données et l'exposer en parallèle à partir d'autant de Pods que nécessaire. Malheureusement, les disques persistants peuvent seulement être montés par un seul consommateur en mode lecture-écriture - les écritures simultanées ne sont pas autorisées.
Utiliser un disque persistant dans un Pod contrôlé par un ReplicationController échouera à moins que le disque persistant soit en lecture seule ou que le nombre de répliques soit de 0 ou 1.
Création d'un disque persistant
Avant de pouvoir utiliser un disque persistant GCE avec un Pod, vous devez le créer.
gcloud compute disks create --size=500GB --zone=us-central1-a my-data-disk
Exemple de Pod
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
# Ce disque persistant GCE doit déjà exister.
gcePersistentDisk:
pdName: my-data-disk
fsType: ext4
Disques persistants régionaux
Kubernetes v1.10 [beta]
La fonctionnalité de disques persistants régionaux (Regional Persistent Disks) permet la création de disques persistants disponibles dans deux zones à l'intérieur d'une même région. Afin d'utiliser cette fonctionnalité, le volume doit être provisionné en tant que PersistentVolume; le référencement du volume directement depuis un Pod n'est pas supporté.
Provisionnement manuel d'un disque persistant régional en tant que PersistentVolume
Le provisionnement dynamique est possible en utilisant une StorageClass pour un disque persistant GCE. Avant de créer un PersistentVolume, vous devez créer le disque persistant :
gcloud beta compute disks create --size=500GB my-data-disk
--region us-central1
--replica-zones us-central1-a,us-central1-b
Exemple de spec PersistentVolume :
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-volume
labels:
failure-domain.beta.kubernetes.io/zone: us-central1-a__us-central1-b
spec:
capacity:
storage: 400Gi
accessModes:
- ReadWriteOnce
gcePersistentDisk:
pdName: my-data-disk
fsType: ext4
Migration CSI
Kubernetes v1.14 [alpha]
La fonctionnalité de migration CSI pour un disque persistant GCE, lorsque activée, fixe toutes les opérations de plugin depuis le plugin "in-tree" vers le pilote de l'interface CSI (Container Storage Interface) pd.csi.storage.gke.io
.
Afin d'utiliser cette fonctionnalité, le Pilote CSI de disque persistant GCE doit être installé dans le cluster et les fonctionnalités Alpha CSIMigration
et CSIMigrationGCE
doivent être activées.
gitRepo (obsolète)
Attention:
Le type de volume gitRepo est obsolète. Pour provisionner un conteneur avec un dépôt git, il faut monter un EmptyDir dans un InitContainer qui clone le dépôt en utilisant git, ensuite, monter le EmptyDir dans le conteneur du Pod.Un volume gitRepo
est un exemple de ce qui peut être réalisé en tant que plugin de volume.
Cela monte un dossier vide et clone un dépôt git à l'intérieur, à la disposition d'un Pod.
Dans le futur, de tels volumes pourraient être déplacé vers un modèle encore plus découplé plutôt qu'étendre l'API Kubernetes pour chaque cas d'utilisation.
Voici un exemple d'un volume gitRepo :
apiVersion: v1
kind: Pod
metadata:
name: server
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- mountPath: /mypath
name: git-volume
volumes:
- name: git-volume
gitRepo:
repository: "git@somewhere:me/my-git-repository.git"
revision: "22f1d8406d464b0c0874075539c1f2e96c253775"
glusterfs
Un volume glusterfs
permet à un volume Glusterfs (un système de fichiers en réseau open
source) d'être monté dans un Pod. À la différence d'un emptyDir
, qui est écrasé lorsqu'un Pod est supprimé. le contenu d'un volume glusterfs
est préservé et le volume est simplement démonté.
Cela signifie qu'un volume glusterfs peut être prérempli avec des données et que ces données peuvent être transmises entre les Pods.
GlusterFS peut être monté plusieurs fois en écriture simultanément.
Avertissement:
Vous devez exécuter votre propre installation de GlusterFS avant de pouvoir l'utiliser.Voir l'exemple GlusterFS pour plus de détails.
hostPath
Un volume hostPath
monte un fichier ou un dossier depuis le système de fichiers du nœud hôte à l'intérieur d'un Pod.
Ce ne sera pas requis pour la plupart des Pods, mais cela offre une puissante solution de secours pour certaines applications.
Par exemple, des utilisations du hostPath
peuvent être :
- exécuter un conteneur qui nécessite l'accès aux éléments internes de Docker; utiliser un
hostPath
de/var/lib/docker
- exécuter cAdvisor dans un conteneur; utiliser un
hostPath
de/sys
- autoriser un Pod à spécifier si un
hostPath
donné devrait exister avant la mise en exécution du Pod, s'il devrait être créé et en tant que quoi il devrait exister.
En plus de la propriété requise path
, un utilisateur peut optionnellement spécifier un type
pour un volume hostPath
.
Les valeurs supportées pour le champ type
sont les suivantes :
Valeur | Comportement |
---|---|
Une chaîne de caractères vide (par défaut) sert à la rétrocompatibilité, ce qui signifie qu'aucune vérification ne sera effectuée avant de monter le volume hostPath. | |
DirectoryOrCreate | Si rien n'existe au chemin fourni, un dossier vide y sera créé au besoin avec les permissions définies à 0755, avec le même groupe et la même possession que Kubelet. |
Directory | Un dossier doit exister au chemin fourni |
FileOrCreate | Si rien n'existe au chemin fourni, un fichier vide y sera créé au besoin avec les permissions définies à 0644, avec le même groupe et la même possession que Kubelet. |
File | Un fichier doit exister au chemin fourni |
Socket | Un socket UNIX doit exister au chemin fourni |
CharDevice | Un périphérique en mode caractère doit exister au chemin fourni |
BlockDevice | Un périphérique en mode bloc doit exister au chemin fourni |
Une attention particulière doit être portée lors de l'utilisation de ce type de volume car :
- les Pods avec une configuration identique (tels que ceux créés depuis un podTemplate) peuvent se comporter différemment sur des nœuds différents à cause de fichiers différents sur les nœuds.
- lorsque Kubernetes ajoute une planification tenant compte des ressources, comme prévu, il ne pourra pas prendre en compte les ressources utilisées par un
hostPath
. - les fichiers ou dossiers créés sur les hôtes sous-jacents ne sont accessibles en écriture que par root. Vous devez soit exécuter votre programme en tant que root dans un conteneur privilégié ou modifier les permissions du fichier sur l'hôte pour pouvoir écrire dans un volume
hostPath
.
Exemple de Pod
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# chemin du dossier sur l'hôte
path: /data
# ce champ est optionnel
type: Directory
iscsi
Un volume iscsi
permet à un volume existant iSCSI (SCSI over IP) d'être monté dans un Pod.
À la différence d'un emptyDir
, qui est écrasé lorsqu'un Pod est supprimé, le contenu d'un volume iscsi
est préservé et le volume est simplement démonté.
Cela signifie qu'un volume iscsi peut être prérempli avec des données que ces données peuvent être transmises entre les Pods.
Avertissement:
Vous devez exécuter votre propre serveur iSCSI avec le volume créé avant de pouvoir l'utiliser.Une fonctionnalité de iSCSI est qu'il peut être monté en lecture seule par plusieurs consommateurs simultanément. Cela signifie que vous pouvez préremplir un volume avec votre jeu de données et l'exposer en parallèle à partir d'autant de Pods que nécessaire. Malheureusement, les volumes iSCSI peuvent seulement être montés par un seul consommateur en mode lecture-écriture - les écritures simultanées ne sont pas autorisées.
Voir l'exemple iSCSI pour plus de détails.
local
Kubernetes v1.14 [stable]
Un volume local
représente un périphérique de stockage local monté tels qu'un disque, une partition ou un dossier.
Les volumes locaux peuvent seulement être utilisés comme un PersistentVolume créé statiquement. Le provisionnement dynamique n'est pas encore supporté.
Comparés aux volumes hostPath
, les volumes locaux peuvent être utilisés de manière durable et portable sans planifier manuellement des Pods sur les nœuds, puisque le système est conscient des contraintes de nœud du volume en examinant l'affinité de nœud sur le PersistentVolume.
Toutefois, les volumes locaux sont encore sujets à la disponibilité du nœud sous-jacent et ne conviennent pas à toutes les applications. Si un nœud devient "en mauvaise santé" (unhealthy), alors le volume local deviendra également inaccessible et un Pod qui l'utilise ne sera pas en mesure de s'exécuter. Les applications qui utilisent des volumes locaux doivent être en mesure de tolérer cette disponibilité réduite, ainsi que de potentielles pertes de données, dépendamment des caractéristiques de durabilité du disque sous-jacent.
L'exemple suivant traite d'une spec d'un PersistentVolume utilisant un volume local
et une nodeAffinity
:
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 100Gi
# le champ volumeMode requiert l'activation de la "feature gate" Alpha BlockVolume
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- example-node
La nodeAffinity
d'un PersistentVolume est requise lors de l'utilisation de volumes locaux.
Cela permet au planificateur (scheduler) Kubernetes de planifier correctement des Pods utilisant des volumes locaux aux bons nœuds.
Le volumeMode
d'un PersistentVolume peut maintenant être configuré à "Block" (au lieu de la valeur par défaut "Filesystem") pour exposer le volume local en tant que périphérique bloc brut (raw block device).
Le champ volumeMode
requiert l'activation de la "feature gate" Alpha BlockVolume
.
Lors de l'utilisation des volumes locaux, il est recommandé de créer une StorageClass avec volumeBindingMode
configuré à WaitForFirstConsumer
. Voir l'exemple. Retarder la liaison (binding) du volume garantit que la décision de liaison du PersistentVolumeClaim sera également évaluée avec toutes les autres contraintes de nœud que le Pod peut avoir, tels que les exigences en ressources du nœud, les sélecteurs de nœud, leur affinité et leur anti-affinité.
Un provisionneur statique externe peut être exécuté séparément pour une gestion améliorée du cycle de vie du volume local. Noter que ce provisionneur ne supporte pas encore le provisionnement dynamique. Pour un exemple sur la façon d'exécuter un provisionneur externe local, voir le guide utilisateur de provisionneur de volume local.
Note:
Le PersistentVolume local requiert un nettoyage manuel et une suppression par l'utilisateur si le provisionneur statique n'est pas utilisé pour gérer le cycle de vie du volume.nfs
Un volume nfs
permet à un partage NFS (Network File System) existant d'être monté dans un Pod.
À la différence d'un emptyDir
, qui est écrasé lorsqu'un Pod est supprimé, le contenu d'un volume nfs
est préservé et le volume est simplement démonté.
Cela signifie qu'un volume NFS peut être prérempli avec des données et que les données peuvent être transmises entre les Pods. NFS peut être monté plusieurs fois en écriture simultanément.
Avertissement:
Vous devez exécuter votre propre serveur NFS avec le partage exporté avant de pouvoir l'utiliser.Voir l'exemple NFS pour plus de détails.
persistentVolumeClaim
Un volume persistentVolumeClaim
est utilisé pour monter un PersistentVolume dans un Pod. Les PersistentVolumes sont une manière pour les utilisateurs de "revendiquer" un stockage durable (comme un PersistentDisk GCE ou un volume iSCSI) sans savoir les détails d'un environnement cloud particulier.
Voir l'exemple PersistentVolumes pour plus de détails.
projected
Un volume projected
mappe plusieurs sources de volume existantes dans le même dossier.
Actuellement, les types de sources de volume suivantes peuvent être projetés :
secret
downwardAPI
configMap
serviceAccountToken
Toutes les sources doivent se trouver dans le même namespace que celui du Pod. Pour plus de détails, voir le document de conception tout-en-un .
La projection des jetons de compte de service (service account) est une fonctionnalité introduite dans Kubernetes 1.11 et promue en Beta dans la version 1.12.
Pour activer cette fonctionnalité dans la version 1.11, il faut configurer explicitement la "feature gate" TokenRequestProjection
à "True".
Exemple d'un Pod avec un secret, une API downward et une configmap.
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "cpu_limit"
resourceFieldRef:
containerName: container-test
resource: limits.cpu
- configMap:
name: myconfigmap
items:
- key: config
path: my-group/my-config
Exemple d'un Pod avec plusieurs secrets avec une configuration de mode de permission autre que celle par défaut.
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- secret:
name: mysecret2
items:
- key: password
path: my-group/my-password
mode: 511
Chaque source de volume projeté est listée dans la spec, sous sources
. Les paramètres sont à peu près les mêmes avec deux exceptions :
- Pour les secrets, le champ
secretName
a été changé parname
pour être consistant avec le nommage des ConfigMap. - Le
defaultMode
peut seulement être spécifié au niveau projeté et non pour chaque source de volume. Cependant, tel qu'illustré au-dessus, il est possible de configurer explicitement lemode
pour chaque projection individuelle.
Lorsque la fonctionnalité TokenRequestProjection
est activée, vous pouvez injecter le jeton pour le service account courant dans un Pod au chemin spécifié. Ci-dessous, un exemple :
apiVersion: v1
kind: Pod
metadata:
name: sa-token-test
spec:
containers:
- name: container-test
image: busybox
volumeMounts:
- name: token-vol
mountPath: "/service-account"
readOnly: true
volumes:
- name: token-vol
projected:
sources:
- serviceAccountToken:
audience: api
expirationSeconds: 3600
path: token
Le pod d'exemple possède un volume projeté contenant le jeton injecté du service account.
Ce jeton peut être utilisé par des conteneurs de Pod pour accéder au service d'API Kubernetes API, par exemple.
Le champ audience
contient l'audience-cible du jeton.
Un destinataire du jeton doit s'identifier avec un identificateur spécifié dans l'audience du jeton, sinon il doit rejeter le jeton. Ce champ est facultatif et sa valeur par défaut est l'identifiant du serveur API.
Le champ expirationSeconds
est la durée de validité attendue du jeton de service account.
Sa valeur par défaut est de 1 heure et doit être au moins de 10 minutes (600 secondes). Un administrateur peut aussi limiter sa valeur maximum en spécifiant l'option --service-account-max-token-expiration
pour le serveur API.
Le champ path
spécifie un chemin relatif au point de montage du volume projeté.
Note:
Un conteneur utilisant une source de volume projeté en tant que point de montage de volume subPath ne recevra pas de mises à jour pour ces sources de volume.portworxVolume
Un portworxVolume
est une couche de stockage bloc élastique qui s'exécute de manière hyperconvergée avec Kubernetes.
Portworx donne l'empreinte digitale d'un stockage dans un serveur, tiers basés sur les capacités et agrège la capacité sur plusieurs serveurs. Portworx s'exécute en invité sur des machines virtuelles ou sur des nœuds Linux bare metal.
Un portworxVolume
peut être créé dynamiquement à travers Kubernetes ou il peut également être pré-provisionné et référencé à l'intérieur d'un Pod Kubernetes.
Voici un exemple de Pod référençant un PortworxVolume pré-provisionné :
apiVersion: v1
kind: Pod
metadata:
name: test-portworx-volume-pod
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /mnt
name: pxvol
volumes:
- name: pxvol
# Ce volume Portworx doit déjà exister.
portworxVolume:
volumeID: "pxvol"
fsType: "<fs-type>"
Avertissement:
Il faut s'assurer d'avoir un PortworxVolume existant avec le nompxvol
avant de l'utiliser dans le Pod.Plus de détails et d'exemples peuvent être trouvé ici.
quobyte
Un volume quobyte
permet à un volume existant Quobyte d'être monté dans un Pod.
Avertissement:
Vous devez exécuter votre propre configuration Quobyte avec les volumes créés avant de pouvoir l'utiliser.Quobyte supporte le Container Storage Interface. CSI est le plugin recommandé pour utiliser les volumes Quobyte volumes dans Kubernetes. Le projet GitHub Quobyte dispose d'instructions pour déployer Quobyte en utilisant CSI, avec des exemples.
rbd
Un volume rbd
permet à un volume périphérique bloc Rados (Rados Block
Device) d'être monté dans un Pod.
À la différence d'un emptyDir
, qui est écrasé lorsqu'un Pod est supprimé, le contenu d'un volume rbd
est préservé et le volume est simplement démonté.
Cela signifie qu'un volume RBD peut être prérempli avec des données et que ces données peuvent être transmises entre les Pods.
Avertissement:
Vous devez exécuter votre propre installation Ceph avant de pouvoir utiliser RBD.Une fonctionnalité de RBD est qu'il peut être monté en lecture seule par plusieurs consommateurs simultanément. Cela signifie que vous pouvez préremplir un volume avec votre jeu de données et l'exposer en parallèle à partir d'autant de Pods que nécessaire. Malheureusement, les volumes RBD peuvent seulement être montés par un seul consommateur en mode lecture-écriture - les écritures simultanées ne sont pas autorisées.
Voir l'exemple RBD pour plus de détails.
scaleIO
ScaleIO est une plateforme de stockage logicielle qui peut utiliser du matériel physique existant pour créer des clusters de stockage bloc partagé en réseau évolutif.
Le plugin de volume scaleIO
permet aux Pods déployés d'accéder à des volumes ScaleIO existants (ou il peut provisionner dynamiquement de nouveaux volumes pour des revendications de volumes persistants, voir ScaleIO Persistent Volumes).
Avertissement:
Vous devez exécuter un cluster ScaleIO déjà configuré avec les volumes créés avant de pouvoir les utiliser.L'exemple suivant montre une configuration de Pod avec ScaleIO :
apiVersion: v1
kind: Pod
metadata:
name: pod-0
spec:
containers:
- image: registry.k8s.io/test-webserver
name: pod-0
volumeMounts:
- mountPath: /test-pd
name: vol-0
volumes:
- name: vol-0
scaleIO:
gateway: https://localhost:443/api
system: scaleio
protectionDomain: sd0
storagePool: sp1
volumeName: vol-0
secretRef:
name: sio-secret
fsType: xfs
Pour plus de détails, consulter les exemples ScaleIO.
secret
Un volume secret
est utilisé pour fournir des informations sensibles, comme des mots de passe, aux Pods.
Vous pouvez stocker des secrets dans l'API Kubernetes et les monter en tant que fichiers pour être utilisés par les Pods sans les coupler directement avec Kubernetes. Les volumes secret
sont supportés par tmpfs (un système de fichiers en RAM) pour qu'ils ne soient jamais écrits sur du stockage non volatil.
Avertissement:
Vous devez créer un secret dans l'API Kubernetes avant de pouvoir l'utiliser.Note:
Un conteneur utilisant un secret en tant que point de montage de volume subPath ne recevra pas les mises à jour des secrets.Les secrets sont décrits plus en détails ici.
storageOS
Un volume storageos
permet à un volume StorageOS existant d'être monté dans un Pod.
StorageOS s'exécute en tant que conteneur dans l'environnement Kubernetes en rendant le stockage local ou attaché accessible depuis n'importe quel nœud dans le cluster Kubernetes. Les données peuvent être répliquées pour se protéger des défaillances de nœuds. Les techniques d'allocation fine et dynamique et de compression peuvent améliorer l'utilisation et réduire les coûts.
À la base, StorageOS fournit un stockage bloc aux conteneurs accessible via un système de fichiers.
Le conteneur StorageOS requiert Linux 64-bit et n'a pas besoin de dépendances supplémentaires. Une licence développeur libre est disponible.
Avertissement:
Vous devez exécuter le conteneur StorageOS sur chaque nœud qui souhaite accéder aux volumes StorageOS ou qui veut contribuer à la capacité de stockage du pool. Pour les instructions d'installation, consulter la documentation StorageOS.apiVersion: v1
kind: Pod
metadata:
labels:
name: redis
role: master
name: test-storageos-redis
spec:
containers:
- name: master
image: kubernetes/redis:v1
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /redis-master-data
name: redis-data
volumes:
- name: redis-data
storageos:
# Le volume `redis-vol01` doit déjà exister dans StorageOS, dans le namespace `default`.
volumeName: redis-vol01
fsType: ext4
Pour plus d'informations incluant le provisionnement dynamique (Dynamic Provisioning) et les réclamations de volume persistant (Persistent Volume Claims), consulter les exemples StorageOS.
vsphereVolume
Note:
Prérequis : Kubernetes avec vSphere Cloud Provider configuré. Pour la configuration cloudprovider, se référer au guide de mise en marche vSphere.Un volume vsphereVolume
est utilisé pour monter un volume vSphere VMDK dans un Pod. Le contenu d'un volume est préservé lorsqu'il est démonté. Il supporte les banques de données (datastore) VMFS and VSAN.
Avertissement:
Vous devez créer VMDK en utilisant une des méthodes suivantes avant de l'utiliser avec un Pod.Création d'un volume VMDK
Choisir une des méthodes suivantes pour créer un VMDK.
Premièrement, se connecter en ssh dans l'ESX, ensuite, utiliser la commande suivante pour créer un VMDK :
vmkfstools -c 2G /vmfs/volumes/DatastoreName/volumes/myDisk.vmdk
Utiliser la commande suivante pour créer un VMDK:
vmware-vdiskmanager -c -t 0 -s 40GB -a lsilogic myDisk.vmdk
Exemple de configuration vSphere VMDK
apiVersion: v1
kind: Pod
metadata:
name: test-vmdk
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-vmdk
name: test-volume
volumes:
- name: test-volume
# Ce volume VMDK doit déjà exister.
vsphereVolume:
volumePath: "[DatastoreName] volumes/myDisk"
fsType: ext4
Plus d'exemples sont disponibles ici.
Utilisation de subPath
Parfois, il est utile de partager un volume pour plusieurs utilisations dans un même Pod.
La propriété volumeMounts[*].subPath
peut être utilisée pour spécifier un sous-chemin à l'intérieur du volume référencé au lieu de sa racine.
Voici un exemple d'un Pod avec une stack LAMP (Linux Apache Mysql PHP) utilisant un unique volume partagé.
Le contenu HTML est mappé à son dossier html
et les bases de données seront stockées dans son dossier mysql
:
apiVersion: v1
kind: Pod
metadata:
name: my-lamp-site
spec:
containers:
- name: mysql
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpasswd"
volumeMounts:
- mountPath: /var/lib/mysql
name: site-data
subPath: mysql
- name: php
image: php:7.0-apache
volumeMounts:
- mountPath: /var/www/html
name: site-data
subPath: html
volumes:
- name: site-data
persistentVolumeClaim:
claimName: my-lamp-site-data
Utilisation d'un subPath avec des variables d'environnement étendues
Kubernetes v1.15 [beta]
Utiliser le champ subPathExpr
pour construire des noms de dossier subPath
depuis les variables d'environnement de l'API Downward.
Avant d'utiliser cette fonctionnalité, vous devez activer la "feature gate" VolumeSubpathEnvExpansion
.
Les propriétés subPath
et subPathExpr
sont mutuellement exclusives.
Dans cet exemple, un Pod utilise subPathExpr
pour créer un dossier pod1
à l'intérieur du volume hostPath /var/log/pods
, en utilisant le nom du pod depuis l'API Downward.
Le dossier hôte /var/log/pods/pod1
est monté sur /logs
dans le conteneur.
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: container1
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
image: busybox
command: [ "sh", "-c", "while [ true ]; do echo 'Hello'; sleep 10; done | tee -a /logs/hello.txt" ]
volumeMounts:
- name: workdir1
mountPath: /logs
subPathExpr: $(POD_NAME)
restartPolicy: Never
volumes:
- name: workdir1
hostPath:
path: /var/log/pods
Ressources
Le support de stockage (Disk, SSD, etc.) d'un volume emptyDir
est déterminé par le support du système de fichiers
contenant le dossier racine de kubelet (typiquement /var/lib/kubelet
).
Il n'y a pas de limite sur l'espace qu'un volume emptyDir
ou hostPath
peut consommer
et pas d'isolation entre les conteneurs ou entre les Pods.
Dans le futur, il est prévu que les volumes emptyDir
et hostPath
soient en mesure de demander une certaine quantité d'espace en utilisant une spécification de ressource et de sélectionner un type de support à utiliser, pour les clusters qui ont plusieurs types de support.
Plugins de volume Out-of-Tree
Les plugins de volume Out-of-tree incluent l'interface CSI (Container Storage Interface) et FlexVolume. Ils permettent aux fournisseurs de stockage de créer des plugins de stockage personnalisés sans les ajouter au dépôt Kubernetes.
Avant l'introduction de l'interface CSI et FlexVolume, tous les plugins de volume (tels que les types de volume listés plus haut) étaient "in-tree", ce qui signifie qu'ils étaient construits, liés, compilés et livrés avec les binaires de base Kubernetes et étendent l'API Kubernetes de base. Cela signifiait que l'ajout d'un nouveau système de stockage à Kubernetes (un plugin de volume) requérait de vérifier le code dans le dépôt de base de Kubernetes.
CSI et FlexVolume permettent à des plugins de volume d'être développés indépendamment de la base de code Kubernetes et déployés (installés) sur des clusters Kubernetes en tant qu'extensions.
Pour les fournisseurs de stockage qui cherchent à créer un plugin de volume "out-of-tree", se référer à cette FAQ.
CSI
L'interface Container Storage Interface (CSI) définit une interface standard pour les systèmes d'orchestration de conteneurs (comme Kubernetes) pour exposer des systèmes de stockage arbitraires aux charges de travail de leurs conteneurs.
Pour plus d'informations, lire la proposition de conception CSI.
Le support CSI a été introduit en alpha à partir de Kubernetes v1.9, a évolué en beta dans Kubernetes v1.10 et est en disponibilité générale (GA) depuis Kubernetes v1.13.
Note:
Le support des versions spec CSI 0.2 et 0.3 sont obsolètes dans Kubernetes v1.13 et seront retirés dans une version future.Note:
Les pilotes CSI peuvent ne pas être compatibles avec toutes les versions de Kubernetes. Vérifier la documentation des pilotes CSI spécifiques pour les étapes de déploiement supportées pour chaque version de Kubernetes et la matrice de compatibilité.Une fois qu'un pilote de volume CSI compatible est déployé dans un cluster Kubernetes, les utilisateurs peuvent
utiliser le type de volume csi
pour attacher, monter, etc.., les volumes exposés par le pilote CSI.
Le type de volume csi
ne supporte pas de référence directe depuis un Pod et ne peut être référencé seulement dans un Pod que par un objet PersistentVolumeClaim
.
Les champs suivants sont disponibles aux administrateurs de stockage pour configurer un volume persistant CSI :
driver
: Une valeur texte qui spécifie le nom du pilote de volume à utiliser. Cette valeur doit correspondre à la valeur retournée dans leGetPluginInfoResponse
par le pilote CSI tel que défini dans la spec CSI. Elle est utilisée par Kubernetes pour identifier le pilote CSI à appeler et par les composants du pilote CSI pour identifier quels objets PV appartiennent au pilote CSI.volumeHandle
: Une valeur texte qui identifie le volume de manière unique. Cette valeur doit correspondre à la valeur retournée dans le champvolume.id
deCreateVolumeResponse
par le pilote CSI tel que défini dans la spec CSI. La valeur est passée en tant quevolume_id
sur tous les appels au pilote de volume CSI lorsque le volume est référencé.readOnly
: Une valeur booléenne optionnelle indiquant si le volume doit être "ControllerPublished" (attaché) en lecture seule. La valeur par défaut est "false". Cette valeur est passées au pilote CSI via le champreadonly
dans leControllerPublishVolumeRequest
.fsType
: Si leVolumeMode
du PV estFilesystem
, alors ce champ peut être utilisé pour spécifier le système de fichiers qui devrait être utilisé pour monter le volume. Si le volume n'a pas été formaté et que le formatage est supporté, cette valeur sera utilisée pour formater le volume. Cette valeur est passée au pilote CSI driver via le champVolumeCapability
deControllerPublishVolumeRequest
,NodeStageVolumeRequest
, etNodePublishVolumeRequest
.volumeAttributes
: Un tableau associatif (map) string vers string qui spécifie les propriétés statiques d'un volume. Ce tableau associatif doit correspondre à celui retourné dans le champvolume.attributes
duCreateVolumeResponse
par le pilote CSI tel que défini dans la spec CSI. Le tableau associatif est passé au pilote CSI via le champvolume_attributes
dans laControllerPublishVolumeRequest
,NodeStageV olumeRequest
, etNodePublishVolumeRequest
.controllerPublishSecretRef
: Une référence de l'objet de type secret contenant des informations sensibles à passer au driver CSI pour compléter les appels CSIControllerPublishVolume
etControllerUnpublishVolume
. Ce champ est optionnel et peut être vide si aucun secret n'est requis. Si l'objet secret contient plus qu'un secret, tous les secrets sont passés.nodeStageSecretRef
: Une référence à l'objet de type secret contenant des informations sensibles à passer au pilote CSI pour compléter l'appel CSINodeStageVolume
. Ce champ est optionnel et peut être vide si aucun secret n'est requis. Si l'objet secret contient plus qu'un secret, tous les secrets sont passés.nodePublishSecretRef
: Une référence vers l'objet de type secret contenant des informations sensibles à passer au pilote CSI pour compléter l'appel CSINodePublishVolume
. Ce champ est optionnel et peut être vide si aucun secret n'est requis. Si l'objet secret contient plus qu'un secret, tous les secrets sont passés.
Support de volume bloc brut CSI
Kubernetes v1.14 [beta]
À partir de la version 1.11, CSI a introduit le support des volumes bloc bruts, qui s'appuient sur la fonctionnalité de volume bloc brut introduite dans une version précédente de Kubernetes. Cette fonctionnalité va permettre aux fournisseurs avec des pilotes CSI externes d'implémenter le support pour les volumes bloc bruts dans les charges de travail Kubernetes.
Le support volume bloc CSI est une "feature-gate", mais est activée par défaut. Les deux
"feature gates" qui doivent être activées pour cette fonctionnalité sont BlockVolume
et CSIBlockVolume
.
Apprenez comment configurer votre PV/PVC avec le support de volume bloc brut.
Volumes CSI éphémères
Kubernetes v1.15 [alpha]
Cette fonctionnalité permet aux volumes CSI d'être embarqués directement dans la spécification du Pod au lieu de celle d'un PersistentVolume. Les Volumes spécifiés de cette manière sont éphémères et ne persistent pas lorsque le Pod redémarre.
Exemple :
kind: Pod
apiVersion: v1
metadata:
name: my-csi-app
spec:
containers:
- name: my-frontend
image: busybox
volumeMounts:
- mountPath: "/data"
name: my-csi-inline-vol
command: [ "sleep", "1000000" ]
volumes:
- name: my-csi-inline-vol
csi:
driver: inline.storage.kubernetes.io
volumeAttributes:
foo: bar
Cette fonctionnalité requiert l'activation de la "feature gate" CSIInlineVolume :
--feature-gates=CSIInlineVolume=true
Les volumes éphémères CSI sont seulement supportés par un sous-ensemble des pilotes CSI. La liste des pilotes CSI est disponible ici.
Ressources pour développeur
Pour plus d'informations sur la manière de développer un pilote CSI, se référer à la documentation kubernetes-csi
Migration de pilotes CSI depuis des plugins "in-tree"
Kubernetes v1.14 [alpha]
La fonctionnalité de migration CSI, lorsque activée, dirige les opérations sur les plugins "in-tree" existants vers les plugins CSI correspondants (qui sont sensés être installés et configurés). Cette fonctionnalité implémente la logique de translation nécessaire et les fixations nécessaires pour rerouter les opérations de manière transparente. En conséquence, les opérateurs n'ont pas à effectuer de changements de configuration aux classes de stockage (Storage Classes) existantes, PV ou PVC (référençant aux plugins "in-tree") lors de la transition vers un pilote CSI qui remplace un plugin "in-tree".
Dans l'état alpha, les opérations et fonctionnalités qui sont supportées incluent provisionnement/suppression, attachement/détachement, montage/démontage et le redimensionnement des volumes.
Les plugins "in-tree" qui supportent la migration CSI et qui ont un pilote CSI correspondant implémenté sont listés dans la section "Types de volumes" au-dessus.
FlexVolume
FlexVolume est une interface de plugin "out-of-tree" qui existe dans Kubernetes depuis la version 1.2 (avant CSI). Elle utilise un modèle basé sur exec pour s'interfacer avec les pilotes. Les binaires de pilote FlexVolume doivent être installés dans un chemin de volume de plugin prédéfini sur chaque nœud (et dans certains cas le nœud maître).
Les Pods interagissent avec les pilotes FlexVolume à travers le plugin "in-tree" flexvolume
Plus de détails sont disponibles ici.
Propagation de montage
La propagation de montage permet à des volumes partagés montés par un conteneur à d'autres conteneurs dans un même Pod, ou même à d'autres Pods dans le même nœud.
La propagation de montage d'un volume est contrôlée par le champ mountPropagation
dans Container.volumeMounts.
Ses valeurs sont :
None
- Ce montage de volume ne recevra aucun montage subséquent qui est monté à ce volume ou n'importe lequel de ses sous-dossiers par l'hôte. De la même manière, aucun montage créé par le conteneur ne sera visible sur l'hôte. C'est le mode par défaut.Ce mode équivaut à une propagation de montage
private
tel que décrit dans la documentation du noyau LinuxHostToContainer
- Ce montage de volume recevra les montages subséquents qui sont montés sur ce volume ou n'importe lequel de ses sous-dossiers.En d'autres termes, si l'hôte monte quoi que ce soit dans le montage de volume, le conteneur va le voir monté à cet endroit.
De manière similaire, si un Pod avec la propagation de montage
Bidirectional
vers le même volume y monte quoi que ce soit, le conteneur avec la propagation de montageHostToContainer
le verra.Ce mode est équivalent à la propagation de montage
rslave
tel que décrit dans la documentation du noyau LinuxBidirectional
- Ce montage de volume se comporte de la même manière que le montageHostToContainer
. De plus, tous les montages de volume créés par le conteneur seront propagés à l'hôte et à tous les conteneurs des autres Pods qui utilisent le même volume.Un cas d'utilisation typique pour ce mode est un Pod avec un FlexVolume ou un pilote CSI, ou un Pod qui nécessite de monter quelque chose sur l'hôte en utilisant un volume
hostPath
.Ce mode est équivalent à une propagation de montage
rshared
tel que décrit dans la documentation du noyau Linux
Avertissement:
La propagation de montageBidirectional
peut être dangereuse. Elle peut endommager le système d'exploitation hôte
et est donc autorisée seulement dans des conteneurs privilégiés.
Il est fortement recommandé d'être familier avec le comportement du noyau Linux.
De plus, tous les montages de volume créés par des conteneurs dans des Pods doivent être détruits (démontés) par les conteneurs lors de la terminaison.Configuration
Avant que la propagation de montage puisse fonctionner correctement sur certains déploiements (CoreOS, RedHat/Centos, Ubuntu) le partage de montage doit être correctement configuré dans Docker tel qu'illustré ci-dessous :
Modifiez le fichier de service systemd
de votre Docker. Configurez votre MountFlags
comme suit :
MountFlags=shared
Ou bien retirez MountFlags=slave
si présent. Redémarrez ensuite le démon Docker :
sudo systemctl daemon-reload
sudo systemctl restart docker
A suivre
- Suivez un exemple de déploiement de WordPress et MySQL avec des volumes persistants.
2 - Volumes persistants
Ce document décrit l'état actuel de PersistentVolumes
dans Kubernetes.
Une connaissance des volumes est suggérée.
Introduction
La gestion du stockage est un problème distinct de la gestion des instances de calcul.
Le sous-système PersistentVolume
fournit une API pour les utilisateurs et les administrateurs qui abstrait les détails de la façon dont le stockage est fourni et de la façon dont il est utilisé.
Pour ce faire, nous introduisons deux nouvelles ressources API: PersistentVolume
et PersistentVolumeClaim
.
Un PersistentVolume
(PV) est un élément de stockage dans le cluster qui a été provisionné par un administrateur ou provisionné dynamiquement à l'aide de Storage Classes.
Il s'agit d'une ressource dans le cluster, tout comme un nœud est une ressource de cluster.
Les PV sont des plugins de volume comme Volumes, mais ont un cycle de vie indépendant de tout pod individuel qui utilise le PV.
Cet objet API capture les détails de l'implémentation du stockage, que ce soit NFS, iSCSI ou un système de stockage spécifique au fournisseur de cloud.
Un PersistentVolumeClaim
(PVC) est une demande de stockage par un utilisateur.
Il est similaire à un Pod.
Les pods consomment des ressources de noeud et les PVC consomment des ressources PV.
Les pods peuvent demander des niveaux spécifiques de ressources (CPU et mémoire).
Les PVC peuvent demander une taille et des modes d'accès spécifiques (par exemple, ils peuvent être montés une fois en lecture/écriture ou plusieurs fois en lecture seule).
Alors que les PersistentVolumeClaims
permettent à un utilisateur de consommer des ressources de stockage abstraites, il est courant que les utilisateurs aient besoin de PersistentVolumes
avec des propriétés et des performances variables pour différents problèmes.
Les administrateurs de cluster doivent être en mesure d'offrir une variété de PersistentVolumes
qui diffèrent de bien des façons plus que la taille et les modes d'accès, sans exposer les utilisateurs aux détails de la façon dont ces volumes sont mis en œuvre.
Pour ces besoins, il existe la ressource StorageClass
.
Voir la procédure détaillée avec des exemples.
Cycle de vie d'un PV et d'un PVC
Les PV sont des ressources du cluster. Les PVC sont des demandes pour ces ressources et agissent également comme des contrôles de réclamation pour la ressource. L'interaction entre les PV et les PVC suit ce cycle de vie:
Provisionnement
Les PV peuvent être provisionnés de deux manières: statiquement ou dynamiquement.
Provisionnement statique
Un administrateur de cluster crée un certain nombre de PV. Ils contiennent les détails du stockage réel, qui est disponible pour une utilisation par les utilisateurs du cluster. Ils existent dans l'API Kubernetes et sont disponibles pour la consommation.
Provisionnement dynamique
Lorsqu'aucun des PV statiques créés par l'administrateur ne correspond au PersistentVolumeClaim
d'un utilisateur, le cluster peut essayer de provisionner dynamiquement un volume spécialement pour le PVC.
Ce provisionnement est basé sur les StorageClasses
: le PVC doit demander une storage class et l'administrateur doit avoir créé et configuré cette classe pour que l'approvisionnement dynamique se produise.
Les PVC qui demandent la classe ""
désactive le provisionnement dynamique pour eux-mêmes.
Pour activer le provisionnement de stockage dynamique basé sur la classe de stockage, l'administrateur de cluster doit activer le DefaultStorageClass
dans l'contrôleur d'admission sur le serveur API.
Cela peut être fait, par exemple, en veillant à ce que DefaultStorageClass
figure parmi la liste de valeurs séparées par des virgules pour l'option --enable-admission-plugins
du composant serveur API.
Pour plus d'informations sur les options de ligne de commande du serveur API, consultez la documentation kube-apiserver.
Liaison
Un utilisateur crée, ou dans le cas d'un provisionnement dynamique, a déjà créé, un PersistentVolumeClaim
avec une quantité spécifique de stockage demandée et avec certains modes d'accès.
Une boucle de contrôle dans le maître surveille les nouveaux PVC, trouve un PV correspondant (si possible) et les lie ensemble.
Si un PV a été dynamiquement provisionné pour un nouveau PVC, la boucle liera toujours ce PV au PVC.
Sinon, l'utilisateur obtiendra toujours au moins ce qu'il a demandé, mais le volume peut être supérieur à ce qui a été demandé.
Une fois liées, les liaisons PersistentVolumeClaim
sont exclusives, quelle que soit la façon dont elles ont été liées.
Une liaison PVC-PV est une relation 1-à-1.
Les PVC resteront non liés indéfiniment s'il n'existe pas de volume correspondant. Le PVC sera lié à mesure que les volumes correspondants deviendront disponibles. Par exemple, un cluster provisionné avec de nombreux PV 50Gi ne correspondrait pas à un PVC demandant 100Gi. Le PVC peut être lié lorsqu'un PV 100Gi est ajouté au cluster.
Utilisation
Les Pods utilisent les PVC comme des volumes. Le cluster inspecte le PVC pour trouver le volume lié et monte ce volume pour un Pod. Pour les volumes qui prennent en charge plusieurs modes d'accès, l'utilisateur spécifie le mode souhaité lors de l'utilisation de leur PVC comme volume dans un Pod.
Une fois qu'un utilisateur a un PVC et que ce PVC est lié, le PV lié appartient à l'utilisateur aussi longtemps qu'il en a besoin.
Les utilisateurs planifient des pods et accèdent à leurs PV revendiqués en incluant un persistentVolumeClaim
dans le bloc de volumes de leur Pod Voir ci-dessous pour les détails de la syntaxe.
Protection de l'objet de stockage en cours d'utilisation
Le but de la fonction de protection des objets de stockage utilisés est de garantir que les revendications de volume persistantes (PVC) en cours d'utilisation par un Pod et les volumes persistants (PV) liés aux PVC ne sont pas supprimées du système, car cela peut entraîner des pertes de données.
Note:
Le PVC est utilisé activement par un pod lorsqu'il existe un objet Pod qui utilise le PVC.Si un utilisateur supprime un PVC en cours d'utilisation par un pod, le PVC n'est pas supprimé immédiatement. L'élimination du PVC est différée jusqu'à ce que le PVC ne soit plus activement utilisé par les pods. De plus, si un administrateur supprime un PV lié à un PVC, le PV n'est pas supprimé immédiatement. L'élimination du PV est différée jusqu'à ce que le PV ne soit plus lié à un PVC.
Vous pouvez voir qu'un PVC est protégé lorsque son état est Terminating
et la liste Finalizers
inclus kubernetes.io/pvc-protection
:
kubectl describe pvc hostpath
Name: hostpath
Namespace: default
StorageClass: example-hostpath
Status: Terminating
Volume:
Labels: <none>
Annotations: volume.beta.kubernetes.io/storage-class=example-hostpath
volume.beta.kubernetes.io/storage-provisioner=example.com/hostpath
Finalizers: [kubernetes.io/pvc-protection]
...
Vous pouvez voir qu'un PV est protégé lorsque son état est Terminating
et la liste Finalizers
inclus kubernetes.io/pv-protection
aussi:
kubectl describe pv task-pv-volume
Name: task-pv-volume
Labels: type=local
Annotations: <none>
Finalizers: [kubernetes.io/pv-protection]
StorageClass: standard
Status: Available
Claim:
Reclaim Policy: Delete
Access Modes: RWO
Capacity: 1Gi
Message:
Source:
Type: HostPath (bare host directory volume)
Path: /tmp/data
HostPathType:
Events: <none>
Récupération des volumes
Lorsqu'un utilisateur a terminé avec son volume, il peut supprimer les objets PVC de l'API qui permet la récupération de la ressource.
La politique de récupération pour un PersistentVolume
indique au cluster ce qu'il doit faire du volume une fois qu'il a été libéré de son PVC.
Actuellement, les volumes peuvent être conservés, recyclés ou supprimés.
Volumes conservés
La politique de récupération Retain
permet la récupération manuelle de la ressource.
Lorsque le PersistentVolumeClaim
est supprimé, le PersistentVolume
existe toujours et le volume est considéré comme «libéré».
Mais il n'est pas encore disponible pour une autre demande car les données du demandeur précédent restent sur le volume.
Un administrateur peut récupérer manuellement le volume en procédant comme suit.
- Supprimer le
PersistentVolume
. L'actif de stockage associé dans une infrastructure externe (comme un volume AWS EBS, GCE PD, Azure Disk ou Cinder) existe toujours après la suppression du PV. - Nettoyez manuellement les données sur l'actif de stockage associé en conséquence.
- Supprimez manuellement l'actif de stockage associé ou, si vous souhaitez réutiliser le même actif de stockage, créez un nouveau
PersistentVolume
avec la définition de l'actif de stockage.
Volumes supprimés
Pour les plug-ins de volume qui prennent en charge la stratégie de récupération Delete
, la suppression supprime à la fois l'objet PersistentVolume
de Kubernetes, ainsi que l'actif de stockage associé dans l'infrastructure externe, tel qu'un volume AWS EBS, GCE PD, Azure Disk ou Cinder.
Les volumes qui ont été dynamiquement provisionnés héritent de la politique de récupération de leur StorageClass
, qui par défaut est Delete
.
L'administrateur doit configurer la StorageClass
selon les attentes des utilisateurs; sinon, le PV doit être édité ou corrigé après sa création.
Voir Modifier la politique de récupération d'un PersistentVolume.
Volumes recyclés
Attention:
La politique de récupérationRecycle
est obsolète.
Au lieu de cela, l'approche recommandée consiste à utiliser l'approvisionnement dynamique.Si elle est prise en charge par le plug-in de volume sous-jacent, la stratégie de récupération Recycle
effectue un nettoyage de base (rm -rf /thevolume/*
) sur le volume et le rend à nouveau disponible pour une nouvelle demande.
Cependant, un administrateur peut configurer un modèle de module de recyclage personnalisé à l'aide des arguments de ligne de commande du gestionnaire de contrôleur Kubernetes, comme décrit ici.
Le modèle de pod de recycleur personnalisé doit contenir une définition de volumes
, comme le montre l'exemple ci-dessous:
apiVersion: v1
kind: Pod
metadata:
name: pv-recycler
namespace: default
spec:
restartPolicy: Never
volumes:
- name: vol
hostPath:
path: /any/path/it/will/be/replaced
containers:
- name: pv-recycler
image: "registry.k8s.io/busybox"
command: ["/bin/sh", "-c", "test -e /scrub && rm -rf /scrub/..?* /scrub/.[!.]* /scrub/* && test -z \"$(ls -A /scrub)\" || exit 1"]
volumeMounts:
- name: vol
mountPath: /scrub
Cependant, le chemin particulier spécifié dans la partie volumes
du template personnalisé de Pod est remplacée par le chemin particulier du volume qui est recyclé.
Redimensionnement des PVC
Kubernetes v1.24 [stable]
La prise en charge du redimensionnement des PersistentVolumeClaims (PVCs) est désormais activée par défaut. Vous pouvez redimensionner les types de volumes suivants:
- gcePersistentDisk
- awsElasticBlockStore
- Cinder
- glusterfs
- rbd
- Azure File
- Azure Disk
- Portworx
- FlexVolumes
- CSI
Vous ne pouvez redimensionner un PVC que si le champ allowVolumeExpansion
de sa classe de stockage est défini sur true.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gluster-vol-default
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://192.168.10.100:8080"
restuser: ""
secretNamespace: ""
secretName: ""
allowVolumeExpansion: true
Pour demander un volume plus important pour un PVC, modifiez l'objet PVC et spécifiez une taille plus grande.
Cela déclenche l'expansion du volume qui soutient le PersistentVolume
sous-jacent.
Un nouveau PersistentVolume
n'est jamais créé pour satisfaire la demande.
Au lieu de cela, un volume existant est redimensionné.
Redimensionnement de volume CSI
Kubernetes v1.24 [stable]
La prise en charge du redimensionnement des volumes CSI est activée par défaut, mais elle nécessite également un pilote CSI spécifique pour prendre en charge le redimensionnement des volumes. Reportez-vous à la documentation du pilote CSI spécifique pour plus d'informations.
Redimensionner un volume contenant un système de fichiers
Vous ne pouvez redimensionner des volumes contenant un système de fichiers que si le système de fichiers est XFS, Ext3 ou Ext4.
Lorsqu'un volume contient un système de fichiers, le système de fichiers n'est redimensionné que lorsqu'un nouveau pod utilise le PersistentVolumeClaim
en mode ReadWrite.
L'extension du système de fichiers est effectuée au démarrage d'un pod ou lorsqu'un pod est en cours d'exécution et que le système de fichiers sous-jacent prend en charge le redimensionnement en ligne.
FlexVolumes autorise le redimensionnement si le pilote est défini avec la capacité requiresFSResize
sur true
.
Le FlexVolume peut être redimensionné au redémarrage du pod.
Redimensionnement d'un PersistentVolumeClaim en cours d'utilisation
Kubernetes v1.15 [beta]
Note:
Redimensionner un PVCs à chaud est disponible en version bêta depuis Kubernetes 1.15 et en version alpha depuis 1.11. La fonctionnalitéExpandInUsePersistentVolumes
doit être activée, ce qui est le cas automatiquement pour de nombreux clusters de fonctionnalités bêta.
Se référer à la documentation de la feature gate pour plus d'informations.Dans ce cas, vous n'avez pas besoin de supprimer et de recréer un pod ou un déploiement qui utilise un PVC existant. Tout PVC en cours d'utilisation devient automatiquement disponible pour son pod dès que son système de fichiers a été étendu. Cette fonctionnalité n'a aucun effet sur les PVC qui ne sont pas utilisés par un pod ou un déploiement. Vous devez créer un pod qui utilise le PVC avant que l'extension puisse se terminer.
Semblable à d'autres types de volume - les volumes FlexVolume peuvent également être étendus lorsqu'ils sont utilisés par un pod.
Note:
Le redimensionnement de FlexVolume n'est possible que lorsque le pilote sous-jacent prend en charge le redimensionnement.Note:
L'augmentation des volumes EBS est une opération longue. En outre, il existe un quota par volume d'une modification toutes les 6 heures.Types de volumes persistants
Les types PersistentVolume
sont implémentés en tant que plugins.
Kubernetes prend actuellement en charge les plugins suivants:
- GCEPersistentDisk
- AWSElasticBlockStore
- AzureFile
- AzureDisk
- CSI
- FC (Fibre Channel)
- FlexVolume
- Flocker
- NFS
- iSCSI
- RBD (Ceph Block Device)
- CephFS
- Cinder (OpenStack block storage)
- Glusterfs
- VsphereVolume
- Quobyte Volumes
- HostPath (Test de nœud unique uniquement -- le stockage local n'est en aucun cas pris en charge et NE FONCTIONNERA PAS dans un cluster à plusieurs nœuds)
- Portworx Volumes
- ScaleIO Volumes
- StorageOS
Volumes persistants
Chaque PV contient une spécification et un état, qui sont les spécifications et l'état du volume.
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
Note:
Des logiciels additionnels supportant un type de montage de volume pourraient être nécessaires afin d'utiliser un PersistentVolume depuis un cluster. Dans l'exemple d'un PersistentVolume de type NFS, le logiciel additionnel/sbin/mount.nfs
est requis pour permettre de monter des systèmes de fichiers de type NFS.Capacité
Généralement, un PV aura une capacité de stockage spécifique.
Ceci est réglé en utilisant l'attribut capacity
des PV.
Voir le Kubernetes modèle de ressource pour comprendre les unités attendues par capacity
.
Actuellement, la taille du stockage est la seule ressource qui peut être définie ou demandée. Les futurs attributs peuvent inclure les IOPS, le débit, etc.
Mode volume
Kubernetes v1.13 [beta]
Avant Kubernetes 1.9, tous les plug-ins de volume créaient un système de fichiers sur le volume persistant.
Maintenant, vous pouvez définir la valeur de volumeMode
sur block
pour utiliser un périphérique de bloc brut, ou filesystem
pour utiliser un système de fichiers.
filesystem
est la valeur par défaut si la valeur est omise.
Il s'agit d'un paramètre API facultatif.
Modes d'accès
Un PersistentVolume
peut être monté sur un hôte de n'importe quelle manière prise en charge par le fournisseur de ressources.
Comme indiqué dans le tableau ci-dessous, les fournisseurs auront des capacités différentes et les modes d'accès de chaque PV sont définis sur les modes spécifiques pris en charge par ce volume particulier.
Par exemple, NFS peut prendre en charge plusieurs clients en lecture/écriture, mais un PV NFS spécifique peut être exporté sur le serveur en lecture seule.
Chaque PV dispose de son propre ensemble de modes d'accès décrivant les capacités spécifiques de ce PV.
Les modes d'accès sont:
- ReadWriteOnce -- le volume peut être monté en lecture-écriture par un seul nœud
- ReadOnlyMany -- le volume peut être monté en lecture seule par plusieurs nœuds
- ReadWriteMany -- le volume peut être monté en lecture-écriture par de nombreux nœuds
Dans la CLI, les modes d'accès sont abrégés comme suit:
- RWO - ReadWriteOnce
- ROX - ReadOnlyMany
- RWX - ReadWriteMany
Important! Un volume ne peut être monté qu'en utilisant un seul mode d'accès à la fois, même s'il prend en charge plusieurs. Par exemple, un GCEPersistentDisk peut être monté en tant que ReadWriteOnce par un seul nœud ou ReadOnlyMany par plusieurs nœuds, mais pas en même temps.
Volume Plugin | ReadWriteOnce | ReadOnlyMany | ReadWriteMany |
---|---|---|---|
AWSElasticBlockStore | ✓ | - | - |
AzureFile | ✓ | ✓ | ✓ |
AzureDisk | ✓ | - | - |
CephFS | ✓ | ✓ | ✓ |
Cinder | ✓ | - | - |
CSI | dépend du pilote | dépend du pilote | dépend du pilote |
FC | ✓ | ✓ | - |
FlexVolume | ✓ | ✓ | dépend du pilote |
Flocker | ✓ | - | - |
GCEPersistentDisk | ✓ | ✓ | - |
Glusterfs | ✓ | ✓ | ✓ |
HostPath | ✓ | - | - |
iSCSI | ✓ | ✓ | - |
Quobyte | ✓ | ✓ | ✓ |
NFS | ✓ | ✓ | ✓ |
RBD | ✓ | ✓ | - |
VsphereVolume | ✓ | - | - (fonctionne lorsque les pods sont colocalisés) |
PortworxVolume | ✓ | - | ✓ |
ScaleIO | ✓ | ✓ | - |
StorageOS | ✓ | - | - |
Classe
Un PV peut avoir une classe, qui est spécifiée en définissant l'attribut storageClassName
sur le nom d'une StorageClass.
Un PV d'une classe particulière ne peut être lié qu'à des PVC demandant cette classe.
Un PV sans storageClassName
n'a pas de classe et ne peut être lié qu'à des PVC qui ne demandent aucune classe particulière.
Dans le passé, l'annotation volume.beta.kubernetes.io/storage-class
a été utilisé à la place de l'attribut storageClassName
.
Cette annotation fonctionne toujours; cependant, il deviendra complètement obsolète dans une future version de Kubernetes.
Politique de récupération
Les politiques de récupération actuelles sont:
- Retain -- remise en état manuelle
- Recycle -- effacement de base (
rm -rf /thevolume/*
) - Delete -- l'élément de stockage associé tel qu'AWS EBS, GCE PD, Azure Disk ou le volume OpenStack Cinder est supprimé
Actuellement, seuls NFS et HostPath prennent en charge le recyclage. Les volumes AWS EBS, GCE PD, Azure Disk et Cinder prennent en charge la suppression.
Options de montage
Un administrateur Kubernetes peut spécifier des options de montage supplémentaires pour quand un PersistentVolume
est monté sur un nœud.
Note:
Tous les types de volumes persistants ne prennent pas en charge les options de montage.Les types de volume suivants prennent en charge les options de montage:
- AWSElasticBlockStore
- AzureDisk
- AzureFile
- CephFS
- Cinder (OpenStack block storage)
- GCEPersistentDisk
- Glusterfs
- NFS
- Quobyte Volumes
- RBD (Ceph Block Device)
- StorageOS
- VsphereVolume
- iSCSI
Les options de montage ne sont pas validées, donc le montage échouera simplement si l'une n'est pas valide.
Dans le passé, l'annotation volume.beta.kubernetes.io/mount-options
était utilisée à la place de l'attribut mountOptions
.
Cette annotation fonctionne toujours; cependant, elle deviendra complètement obsolète dans une future version de Kubernetes.
Affinité des nœuds
Note:
Pour la plupart des types de volume, vous n'avez pas besoin de définir ce champ. Il est automatiquement rempli pour les volumes bloc de type AWS EBS, GCE PD et Azure Disk. Vous devez définir explicitement ceci pour les volumes locaux.Un PV peut spécifier une affinité de nœud pour définir les contraintes qui limitent les nœuds à partir desquels ce volume est accessible. Les pods qui utilisent un PV seront uniquement planifiés sur les nœuds sélectionnés par l'affinité de nœud.
Phase
Un volume sera dans l'une des phases suivantes:
- Available -- une ressource libre qui n'est pas encore liée à une demande
- Bound -- le volume est lié à une demande
- Released -- la demande a été supprimée, mais la ressource n'est pas encore récupérée par le cluster
- Failed -- le volume n'a pas réussi sa récupération automatique
Le CLI affichera le nom du PVC lié au PV.
PersistentVolumeClaims
Chaque PVC contient une spécification et un état, qui sont les spécifications et l'état de la réclamation.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: slow
selector:
matchLabels:
release: "stable"
matchExpressions:
- {key: environment, operator: In, values: [dev]}
Modes d'accès
Les PVC utilisent les mêmes conventions que les volumes lorsque vous demandez un stockage avec des modes d'accès spécifiques.
Modes de volume
Les PVC utilisent la même convention que les volumes pour indiquer la consommation du volume en tant que système de fichiers ou périphérique de bloc.
Ressources
Les PVC, comme les pods, peuvent demander des quantités spécifiques d'une ressource. Dans ce cas, la demande concerne le stockage. Le même modèle de ressource s'applique aux volumes et aux PVC.
Sélecteur
Les PVC peuvent spécifier un sélecteur de labels pour filtrer davantage l'ensemble des volumes. Seuls les volumes dont les étiquettes correspondent au sélecteur peuvent être liés au PVC. Le sélecteur peut comprendre deux champs:
matchLabels
- le volume doit avoir un label avec cette valeurmatchExpressions
- une liste des exigences définies en spécifiant la clé, la liste des valeurs et l'opérateur qui relie la clé et les valeurs. Les opérateurs valides incluent In, NotIn, Exists et DoesNotExist.
Toutes les exigences, à la fois de matchLabels
et de matchExpressions
doivent toutes être satisfaites pour correspondre (application d'un opérateur booléen ET).
Classe
Un PVC peut demander une classe particulière en spécifiant le nom d'une StorageClass en utilisant l'attribut storageClassName
.
Seuls les PV de la classe demandée, ceux ayant le même storageClassName
que le PVC, peuvent être liés au PVC.
Les PVC n'ont pas nécessairement à demander une classe.
Un PVC avec son attribut storageClassName
égal à ""
est toujours interprété comme demandant un PV sans classe, il ne peut donc être lié qu'à des PV sans classe (pas d'annotation ou une annotation égal à ""
).
Un PVC sans storageClassName
n'est pas tout à fait la même et est traité différemment par le cluster, selon que le DefaultStorageClass
admission plugin est activé.
- Si le plug-in d'admission est activé, l'administrateur peut spécifier une valeur par défaut
StorageClass
. Tous les PVC qui n'ont pas destorageClassName
ne peuvent être liés qu'aux PV de cette valeur par défaut. La spécification d'uneStorageClass
par défaut se fait en définissant l'annotationstorageclass.kubernetes.io/is-default-class
égal àtrue
dans un objetStorageClass
. Si l'administrateur ne spécifie pas de valeur par défaut, le cluster répond à la création de PVC comme si le plug-in d'admission était désactivé. Si plusieurs valeurs par défaut sont spécifiées, le plugin d'admission interdit la création de tous les PVC. - Si le plugin d'admission est désactivé, il n'y a aucune notion de défaut
StorageClass
. Tous les PVC qui n'ont passtorageClassName
peut être lié uniquement aux PV qui n'ont pas de classe. Dans ce cas, les PVC qui n'ont passtorageClassName
sont traités de la même manière que les PVC qui ont leurstorageClassName
égal à""
.
Selon la méthode d'installation, une StorageClass
par défaut peut être déployée sur un cluster Kubernetes par le gestionnaire d'extensions pendant l'installation.
Lorsqu'un PVC spécifie un selector
en plus de demander une StorageClass
, les exigences sont ET ensemble: seul un PV de la classe demandée et avec les labels demandées peut être lié au PVC.
Note:
Actuellement, un PVC avec unselector
non vide ne peut pas avoir un PV provisionné dynamiquement pour cela.Dans le passé, l'annotation volume.beta.kubernetes.io/storage-class
a été utilisé au lieu de l'attribut storageClassName
.
Cette annotation fonctionne toujours; cependant, elle ne sera pas pris en charge dans une future version de Kubernetes.
PVC sous forme de volumes
Les pods accèdent au stockage en utilisant le PVC comme volume.
Les PVC et les pods qui les utilisent doivent exister dans le même namespace.
Le cluster trouve le PVC dans le namespace où se trouve le pod et l'utilise pour obtenir le PersistentVolume
visé par le PVC.
Le volume est ensuite monté sur l'hôte et dans le pod.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
Remarque au sujet des namespaces
Les liaisons PersistentVolumes
sont exclusives, et comme les objets PersistentVolumeClaims
sont des objets vivant dans un namespace donné, le montage de PVC avec les modes "Many" (ROX
, RWX
) n'est possible qu'au sein d'un même namespace.
Prise en charge du volume de bloc brut
Kubernetes v1.13 [beta]
Les plug-ins de volume suivants prennent en charge les volumes de blocs bruts, y compris l'approvisionnement dynamique, le cas échéant:
- AWSElasticBlockStore
- AzureDisk
- FC (Fibre Channel)
- GCEPersistentDisk
- iSCSI
- Local volume
- RBD (Ceph Block Device)
- VsphereVolume (alpha)
Note:
Seuls les volumes FC et iSCSI prennent en charge les volumes de blocs bruts dans Kubernetes 1.9. La prise en charge des plugins supplémentaires a été ajoutée dans 1.10.Volumes persistants utilisant un volume de bloc brut
apiVersion: v1
kind: PersistentVolume
metadata:
name: block-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
volumeMode: Block
persistentVolumeReclaimPolicy: Retain
fc:
targetWWNs: ["50060e801049cfd1"]
lun: 0
readOnly: false
Revendication de volume persistant demandant un volume de bloc brut
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: block-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 10Gi
Spécification de pod ajoutant le chemin du périphérique de bloc brut dans le conteneur
apiVersion: v1
kind: Pod
metadata:
name: pod-with-block-volume
spec:
containers:
- name: fc-container
image: fedora:26
command: ["/bin/sh", "-c"]
args: [ "tail -f /dev/null" ]
volumeDevices:
- name: data
devicePath: /dev/xvda
volumes:
- name: data
persistentVolumeClaim:
claimName: block-pvc
Note:
Lorsque vous ajoutez un périphérique de bloc brut pour un pod, vous spécifiez le chemin de périphérique dans le conteneur au lieu d'un chemin de montage.Lier des volumes bloc bruts
Si un utilisateur demande un volume de bloc brut en l'indiquant à l'aide du champ volumeMode
dans la spécification PersistentVolumeClaim
, les règles de liaison diffèrent légèrement des versions précédentes qui ne considéraient pas ce mode comme faisant partie de la spécification.
Voici un tableau des combinaisons possibles que l'utilisateur et l'administrateur peuvent spécifier pour demander un périphérique de bloc brut.
Le tableau indique si le volume sera lié ou non compte tenu des combinaisons:
Matrice de liaison de volume pour les volumes provisionnés statiquement:
| PV volumeMode | PVC volumeMode | Result | |---------------|-:-:------------|--:------| | unspecified | unspecified | BIND | | unspecified | Block | NO BIND | | unspecified | Filesystem | BIND | | Block | unspecified | NO BIND | | Block | Block | BIND | | Block | Filesystem | NO BIND | | Filesystem | Filesystem | BIND | | Filesystem | Block | NO BIND | | Filesystem | unspecified | BIND |
Note:
Seuls les volumes provisionnés statiquement sont pris en charge pour la version alpha. Les administrateurs doivent prendre en compte ces valeurs lorsqu'ils travaillent avec des périphériques de bloc brut.Snapshot et restauration de volumes
Kubernetes v1.12 [alpha]
La fonction de snapshot de volume a été ajoutée pour prendre en charge uniquement les plug-ins de volume CSI. Pour plus de détails, voir volume snapshots.
Pour activer la prise en charge de la restauration d'un volume à partir d'un snapshot de volume, activez la fonctionnalité VolumeSnapshotDataSource
sur l'apiserver et le controller-manager.
Créer du PVC à partir d'un snapshot de volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-pvc
spec:
storageClassName: csi-hostpath-sc
dataSource:
name: new-snapshot-test
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Clonage de volume
Kubernetes v1.16 [beta]
La fonctionnalité de clonage de volume a été ajoutée pour prendre en charge uniquement les plug-ins de volume CSI. Pour plus de détails, voir clonage de volume.
Pour activer la prise en charge du clonage d'un volume à partir d'une source de données PVC, activez la propriété VolumePVCDataSource
sur l'apiserver et le controller-manager.
Créer un PVC à partir d'un PVC existant
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cloned-pvc
spec:
storageClassName: my-csi-plugin
dataSource:
name: existing-src-pvc-name
kind: PersistentVolumeClaim
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Écriture d'une configuration portable
Si vous écrivez des templates de configuration ou des exemples qui s'exécutent sur une large gamme de clusters et nécessitent un stockage persistant, il est recommandé d'utiliser le modèle suivant:
- Incluez des objets
PersistentVolumeClaim
dans votre ensemble de config (aux côtés deDeployments
,ConfigMaps
, etc.). - N'incluez pas d'objets
PersistentVolume
dans la configuration, car l'utilisateur qui instancie la configuration peut ne pas être autorisé à créer desPersistentVolumes
. - Donnez à l'utilisateur la possibilité de fournir un nom de classe de stockage lors de l'instanciation du template.
- Si l'utilisateur fournit un nom de classe de stockage, mettez cette valeur dans le champ
persistentVolumeClaim.storageClassName
. Cela entraînera le PVC pour utiliser la bonne classe de stockage si le cluster a cetteStorageClasses
activé par l'administrateur. - Si l'utilisateur ne fournit pas de nom de classe de stockage, laissez le champ
persistentVolumeClaim.storageClassName
à zéro. Cela entraînera un PV à être automatiquement provisionné pour l'utilisateur avec laStorageClass
par défaut dans le cluster. De nombreux environnements de cluster ont uneStorageClass
par défaut installée, où les administrateurs peuvent créer leur propreStorageClass
par défaut.
- Si l'utilisateur fournit un nom de classe de stockage, mettez cette valeur dans le champ
- Dans votre outillage, surveillez les PVCs qui ne sont pas liés après un certain temps et signalez-le à l'utilisateur, car cela peut indiquer que le cluster n'a pas de support de stockage dynamique (auquel cas l'utilisateur doit créer un PV correspondant) ou que le cluster n'a aucun système de stockage (auquel cas l'utilisateur ne peut pas déployer de configuration nécessitant des PVCs).