9.2. Définition d'une classe de stockage
StorageClass
sont actuellement des objets à portée globale et doivent être créés par les utilisateurs cluster-admin
ou storage-admin
.
L'opérateur de stockage en cluster peut installer une classe de stockage par défaut en fonction de la plate-forme utilisée. Cette classe de stockage est détenue et contrôlée par l'opérateur. Elle ne peut pas être supprimée ou modifiée au-delà de la définition des annotations et des étiquettes. Si vous souhaitez un comportement différent, vous devez définir une classe de stockage personnalisée.
Les sections suivantes décrivent la définition de base d'un objet StorageClass
et des exemples spécifiques pour chacun des types de plugins pris en charge.
9.2.1. Définition de base de l'objet StorageClass
La ressource suivante présente les paramètres et les valeurs par défaut que vous utilisez pour configurer une classe de stockage. Cet exemple utilise la définition de l'objet AWS ElasticBlockStore (EBS).
Exemple de définition StorageClass
kind: StorageClass 1 apiVersion: storage.k8s.io/v1 2 metadata: name: <storage-class-name> 3 annotations: 4 storageclass.kubernetes.io/is-default-class: 'true' ... provisioner: kubernetes.io/aws-ebs 5 parameters: 6 type: gp3 ...
- 1
- (obligatoire) Le type d'objet de l'API.
- 2
- (obligatoire) Version actuelle de l'api.
- 3
- (obligatoire) Nom de la classe de stockage.
- 4
- (facultatif) Annotations pour la classe de stockage.
- 5
- (obligatoire) Le type de provisionneur associé à cette classe de stockage.
- 6
- (optionnel) Les paramètres requis pour le provisionneur spécifique, cela changera d'un plugin à l'autre.
9.2.2. Annotations de la classe de stockage
Pour définir une classe de stockage comme étant la classe par défaut à l'échelle du cluster, ajoutez l'annotation suivante aux métadonnées de votre classe de stockage :
storageclass.kubernetes.io/is-default-class: "true"
Par exemple :
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: storageclass.kubernetes.io/is-default-class: "true" ...
Cela permet à toute demande de volume persistant (PVC) qui ne spécifie pas de classe de stockage spécifique d'être automatiquement approvisionnée par la classe de stockage par défaut. Cependant, votre cluster peut avoir plus d'une classe de stockage, mais une seule d'entre elles peut être la classe de stockage par défaut.
La version bêta de l'annotation storageclass.beta.kubernetes.io/is-default-class
fonctionne toujours, mais elle sera supprimée dans une prochaine version.
Pour définir la description d'une classe de stockage, ajoutez l'annotation suivante aux métadonnées de votre classe de stockage :
kubernetes.io/description: My Storage Class Description
Par exemple :
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: kubernetes.io/description: My Storage Class Description ...
9.2.3. Définition de l'objet RHOSP Cinder
cinder-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <storage-class-name> 1 provisioner: kubernetes.io/cinder parameters: type: fast 2 availability: nova 3 fsType: ext4 4
- 1
- Nom de la classe de stockage. La revendication de volume persistant utilise cette classe de stockage pour provisionner les volumes persistants associés.
- 2
- Type de volume créé dans Cinder. La valeur par défaut est vide.
- 3
- Zone de disponibilité. S'ils ne sont pas spécifiés, les volumes sont généralement arrondis dans toutes les zones actives où le cluster OpenShift Container Platform a un nœud.
- 4
- Système de fichiers créé sur les volumes provisionnés dynamiquement. Cette valeur est copiée dans le champ
fsType
des volumes persistants provisionnés dynamiquement et le système de fichiers est créé lorsque le volume est monté pour la première fois. La valeur par défaut estext4
.
9.2.4. Définition de l'objet AWS Elastic Block Store (EBS)
aws-ebs-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <storage-class-name> 1 provisioner: kubernetes.io/aws-ebs parameters: type: io1 2 iopsPerGB: "10" 3 encrypted: "true" 4 kmsKeyId: keyvalue 5 fsType: ext4 6
- 1
- (obligatoire) Nom de la classe de stockage. La revendication de volume persistant utilise cette classe de stockage pour le provisionnement des volumes persistants associés.
- 2
- (obligatoire) Choisissez parmi
io1
,gp3
,sc1
,st1
. La valeur par défaut estgp3
. Voir la documentation AWS pour les valeurs valides de l'Amazon Resource Name (ARN). - 3
- Optionnel : Uniquement pour les volumes io1. Opérations d'E/S par seconde et par gigaoctet. Le plugin de volume AWS multiplie cette valeur avec la taille du volume demandé pour calculer les IOPS du volume. La valeur maximale est de 20 000 IOPS, ce qui correspond au maximum supporté par AWS. Voir la documentation AWS pour plus de détails.
- 4
- Facultatif : Indique s'il faut crypter le volume EBS. Les valeurs valides sont
true
oufalse
. - 5
- Facultatif : L'ARN complet de la clé à utiliser pour le chiffrement du volume. Si aucune valeur n'est fournie, mais que
encypted
est défini surtrue
, AWS génère une clé. Voir la documentation AWS pour une valeur ARN valide. - 6
- Facultatif : Système de fichiers créé sur les volumes approvisionnés dynamiquement. Cette valeur est copiée dans le champ
fsType
des volumes persistants provisionnés dynamiquement et le système de fichiers est créé lorsque le volume est monté pour la première fois. La valeur par défaut estext4
.
9.2.5. Définition de l'objet Azure Disk
azure-advanced-disk-storageclass.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: <storage-class-name> 1 provisioner: kubernetes.io/azure-disk volumeBindingMode: WaitForFirstConsumer 2 allowVolumeExpansion: true parameters: kind: Managed 3 storageaccounttype: Premium_LRS 4 reclaimPolicy: Delete
- 1
- Nom de la classe de stockage. La revendication de volume persistant utilise cette classe de stockage pour provisionner les volumes persistants associés.
- 2
- L'utilisation de
WaitForFirstConsumer
est fortement recommandée. Cela permet de provisionner le volume tout en laissant suffisamment de stockage pour planifier le pod sur un nœud de travail libre à partir d'une zone disponible. - 3
- Les valeurs possibles sont
Shared
(par défaut),Managed
etDedicated
.ImportantRed Hat ne prend en charge que l'utilisation de
kind: Managed
dans la classe de stockage.Avec
Shared
etDedicated
, Azure crée des disques non gérés, tandis qu'OpenShift Container Platform crée un disque géré pour les disques du système d'exploitation de la machine (racine). Mais comme Azure Disk ne permet pas l'utilisation de disques gérés et non gérés sur un nœud, les disques non gérés créés avecShared
ouDedicated
ne peuvent pas être attachés aux nœuds d'OpenShift Container Platform. - 4
- Niveau SKU du compte de stockage Azure. La valeur par défaut est vide. Notez que les VM Premium peuvent attacher les disques
Standard_LRS
etPremium_LRS
, les VM Standard ne peuvent attacher que les disquesStandard_LRS
, les VM gérées ne peuvent attacher que les disques gérés, et les VM non gérées ne peuvent attacher que les disques non gérés.-
Si
kind
est défini surShared
, Azure crée tous les disques non gérés dans quelques comptes de stockage partagé dans le même groupe de ressources que le cluster. -
Si
kind
est défini surManaged
, Azure crée de nouveaux disques gérés. Si
kind
est défini surDedicated
et qu'unstorageAccount
est spécifié, Azure utilise le compte de stockage spécifié pour le nouveau disque non géré dans le même groupe de ressources que le cluster. Pour que cela fonctionne :- Le compte de stockage spécifié doit se trouver dans la même région.
- Azure Cloud Provider doit avoir un accès en écriture au compte de stockage.
-
Si
kind
est défini surDedicated
et questorageAccount
n'est pas spécifié, Azure crée un nouveau compte de stockage dédié pour le nouveau disque non géré dans le même groupe de ressources que le cluster.
-
Si
9.2.6. Définition de l'objet Azure File
La classe de stockage Azure File utilise des secrets pour stocker le nom et la clé du compte de stockage Azure nécessaires à la création d'un partage Azure Files. Ces autorisations sont créées dans le cadre de la procédure suivante.
Procédure
Définir un objet
ClusterRole
qui permet de créer et de consulter des secrets :apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: # name: system:azure-cloud-provider name: <persistent-volume-binder-role> 1 rules: - apiGroups: [''] resources: ['secrets'] verbs: ['get','create']
- 1
- Nom du rôle de cluster permettant de visualiser et de créer des secrets.
Ajouter le rôle de cluster au compte de service :
oc adm policy add-cluster-role-to-user <persistent-volume-binder-role> system:serviceaccount:kube-system:persistent-volume-binder
Créez l'objet Azure File
StorageClass
:kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <azure-file> 1 provisioner: kubernetes.io/azure-file parameters: location: eastus 2 skuName: Standard_LRS 3 storageAccount: <storage-account> 4 reclaimPolicy: Delete volumeBindingMode: Immediate
- 1
- Nom de la classe de stockage. La revendication de volume persistant utilise cette classe de stockage pour provisionner les volumes persistants associés.
- 2
- Emplacement du compte de stockage Azure, tel que
eastus
. La valeur par défaut est vide, ce qui signifie qu'un nouveau compte de stockage Azure sera créé à l'emplacement du cluster OpenShift Container Platform. - 3
- Niveau SKU du compte de stockage Azure, par exemple
Standard_LRS
. La valeur par défaut est vide, ce qui signifie qu'un nouveau compte de stockage Azure sera créé avec l'UGSStandard_LRS
. - 4
- Nom du compte de stockage Azure. Si un compte de stockage est fourni, les adresses
skuName
etlocation
sont ignorées. Si aucun compte de stockage n'est fourni, la classe de stockage recherche tout compte de stockage associé au groupe de ressources pour tout compte correspondant aux valeurs définiesskuName
etlocation
.
9.2.6.1. Points à prendre en compte lors de l'utilisation d'Azure File
Les fonctionnalités suivantes du système de fichiers ne sont pas prises en charge par la classe de stockage Azure File par défaut :
- Liens symboliques
- Liens directs
- Attributs étendus
- Fichiers épars
- Tuyaux nommés
De plus, l'identifiant de l'utilisateur propriétaire (UID) du répertoire monté Azure File est différent de l'UID du processus du conteneur. L'option uid
mount peut être spécifiée dans l'objet StorageClass
pour définir un identifiant utilisateur spécifique à utiliser pour le répertoire monté.
L'objet StorageClass
suivant montre comment modifier l'identifiant de l'utilisateur et du groupe, et comment activer les liens symboliques pour le répertoire monté.
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: azure-file mountOptions: - uid=1500 1 - gid=1500 2 - mfsymlinks 3 provisioner: kubernetes.io/azure-file parameters: location: eastus skuName: Standard_LRS reclaimPolicy: Delete volumeBindingMode: Immediate
9.2.7. Définition de l'objet GCE PersistentDisk (gcePD)
gce-pd-storageclass.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: <storage-class-name> 1 provisioner: kubernetes.io/gce-pd parameters: type: pd-standard 2 replication-type: none volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true reclaimPolicy: Delete
9.2.8. Définition de l'objet VMware vSphere
vsphere-storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <storage-class-name> 1 provisioner: kubernetes.io/vsphere-volume 2 parameters: diskformat: thin 3
- 1
- Nom de la classe de stockage. La revendication de volume persistant utilise cette classe de stockage pour provisionner les volumes persistants associés.
- 2
- Pour plus d'informations sur l'utilisation de VMware vSphere avec OpenShift Container Platform, consultez la documentation de VMware vSphere.
- 3
diskformat
:thin
,zeroedthick
eteagerzeroedthick
sont tous des formats de disque valides. Voir la documentation vSphere pour plus de détails sur les types de format de disque. La valeur par défaut estthin
.
9.2.9. Définition de l'objet Red Hat Virtualization (RHV)
OpenShift Container Platform crée un objet par défaut de type StorageClass
nommé ovirt-csi-sc
qui est utilisé pour créer des volumes persistants provisionnés dynamiquement.
Pour créer des classes de stockage supplémentaires pour différentes configurations, créez et enregistrez un fichier avec l'objet StorageClass
décrit par l'exemple YAML suivant :
ovirt-storageclass.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: <storage_class_name> 1 annotations: storageclass.kubernetes.io/is-default-class: "<boolean>" 2 provisioner: csi.ovirt.org allowVolumeExpansion: <boolean> 3 reclaimPolicy: Delete 4 volumeBindingMode: Immediate 5 parameters: storageDomainName: <rhv-storage-domain-name> 6 thinProvisioning: "<boolean>" 7 csi.storage.k8s.io/fstype: <file_system_type> 8
- 1
- Nom de la classe de stockage.
- 2
- Défini à
false
si la classe de stockage est la classe de stockage par défaut dans le cluster. Si la valeur esttrue
, la classe de stockage par défaut existante doit être modifiée et définie surfalse
. - 3
true
permet une expansion dynamique du volume, tandis quefalse
l'empêche.true
est recommandé.- 4
- Les volumes persistants provisionnés dynamiquement de cette classe de stockage sont créés avec cette politique de récupération. Cette politique par défaut est
Delete
. - 5
- Indique comment provisionner et lier
PersistentVolumeClaims
. S'il n'est pas défini, c'estVolumeBindingImmediate
qui est utilisé. Ce champ ne s'applique qu'aux serveurs qui activent la fonctionVolumeScheduling
. - 6
- Le nom du domaine de stockage RHV à utiliser.
- 7
- Si
true
, le disque est en mode "thin provisioned". Sifalse
, le disque est pré-alloué. Le provisionnement fin est recommandé. - 8
- Facultatif : Type de système de fichiers à créer. Valeurs possibles :
ext4
(par défaut) ouxfs
.