Utiliser des ressources StorageClass avec vos charges de travail

GKE sur AWS déploie automatiquement les CSI (Container Storage Interface) Amazon Elastic Block Store (EBS) et Amazon Elastic File Store (EFS).

Les versions du pilote CSI EBS et du pilote CSI EFS sont liées à une version Kubernetes de GKE sur AWS. La version du pilote est généralement la dernière disponible lors de la publication de la version de GKE. Lorsque le cluster est mis à niveau, les pilotes sont automatiquement mis à jour.

Utiliser la ressource StorageClass par défaut

La création d'un objet PersistentVolumeClaim sans champ spec.storageClassName définit le provisionnement d'un volume SSD à usage général (gp2) en utilisant la ressource StorageClass par défaut du pilote CSI pour EBS de GKE sur AWS.

Le code YAML suivant crée un objet PersistentVolumeClaim (PVC) nommé mypvc avec une taille de 30 GiB.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

Utiliser une autre ressource StorageClass préinstallée

Le pilote CSI pour EBS de GKE sur AWS inclut également la ressource StorageClass premium-rwo, qui provisionne des volumes SSD IOPS provisionnés (io1) offrant un débit supérieur.

Vous pouvez l'utiliser en le spécifiant dans le fichier spec.storageClassName du PVC.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  storageClassName: premium-rwo

Utiliser une ressource StorageClass personnalisée

Si ni la ressource StorageClass par défaut, ni la ressource StorageClass premium-rwo ne répondent à vos besoins, vous pouvez créer des ressources StorageClass supplémentaires pour les volumes EBS ou utiliser des pilotes CSI (Container Storage Interface).

  1. Indiquez si vous utilisez un volume EBS ou un autre pilote CSI.

    Volume EBS

    Cet onglet décrit comment créer votre propre ressource StorageClass personnalisée qui spécifie un type de volume EBS, un type de système de fichiers et d'autres paramètres. Vous trouverez des paramètres StorageClass supplémentaires sur la page GitHub du pilote CSI pour EBS de GKE sur AWS.

    Pour configurer une ressource StorageClass personnalisée, copiez le fichier manifeste YAML suivant dans un fichier nommé my-custom-class.yaml.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    

    Remplacez CLASS_NAME par le nom de votre nouvelle ressource StorageClass.

    Par exemple, le code YAML suivant crée une nouvelle ressource StorageClass qui provisionne des volumes EBS HDD à débit optimisé formatés avec le système de fichiers XFS.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-class
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    Ressource StorageClass EFS personnalisée

    Cet onglet décrit comment créer une ressource StorageClass personnalisée pour l'approvisionneur CSI pour EFS. Pour obtenir la liste des conditions préalables à l'utilisation de cette ressource StorageClass, consultez la page Utiliser une ressource EFS. La page du pilote CSI pour EFS présente des paramètres StorageClass supplémentaires en plus de ceux du fichier manifeste suivant.

    Copiez le fichier manifeste YAML suivant dans un fichier nommé my-custom-class.yaml.

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: <var>EFS_STORAGE_CLASS_NAME</var>
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: EFS_ID
      directoryPerms: "700"
    

    Remplacez :

    • EFS_STORAGE_CLASS_NAME par le nom de l'objet StorageClass
    • EFS_ID par votre ID de système de fichiers EFS (par exemple, fs-12345678a).

    Pilote CSI

    Vous pouvez spécifier un autre pilote CSI dans le champ provisioner.

    Pour créer une ressource StorageClass avec un autre pilote CSI, vous pouvez utiliser l'exemple YAML ci-dessous.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: CSI_DRIVER_NAME
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      ...
    

    Remplacez les éléments suivants :

    • CSI_DRIVER_NAME par le nom du pilote CSI, par exemple, csi.example.com
    • CLASS_NAME par le nom de la ressource StorageClass (par exemple, my-custom-class)

    Configurez les sous-champs sous parameters en fonction de votre pilote CSI.

  2. Appliquez le code YAML à votre cluster.

    kubectl apply -f my-custom-class.yaml
    

Créer un objet PersistentVolumeClaim avec une ressource StorageClass personnalisée

  1. Une fois créée, vous pouvez spécifier votre ressource StorageClass personnalisée dans un objet PVC. L'exemple ci-dessous crée un objet PVC nommé my-pvc qui référence la ressource StorageClass my-custom-class.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 30Gi
      storageClassName: my-custom-class
    

Définir la ressource StorageClass par défaut

GKE sur AWS utilise une ressource StorageClass par défaut appelée standard-rwo qui provisionne les volumes EBS gp2. Vous pouvez remplacer la valeur par défaut par une autre ressource StorageClass.

Pour modifier la ressource StorageClass par défaut, procédez comme suit :

  1. Mettez à jour l'annotation is-default-class de la ressource StorageClass standard-rwo avec kubectl patch.

    kubectl patch storageclass standard-rwo -p \
    '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. Créez une ressource StorageClass comportant l'annotation storageclass.kubernetes.io/is-default-class: true.

    L'exemple suivant de ressource StorageClass utilise le pilote ebs.csi.aws.com. Pour installer un autre pilote de stockage, consultez la section Installer des pilotes CSI supplémentaires.

    Copiez le fichier YAML suivant dans un fichier nommé my-custom-class.yaml.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
      annotations:
        storageclass.kubernetes.io/is-default-class: true
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

    Remplacez les éléments suivants :

    • EBS_VOLUME_TYPE : type de volume EBS AWS créé par la StorageClass.
    • CLASS_NAME par le nom de votre nouvelle StorageClass

    Par exemple, le code YAML suivant crée une nouvelle ressource StorageClass par défaut qui provisionne des volumes SSD à usage général (gp3).

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-default-class
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: gp3
    
  3. Appliquez la nouvelle classe personnalisée à votre cluster.

    kubectl apply -f my-custom-class.yaml
    

Après avoir appliqué ce fichier manifeste, GKE sur AWS utilise la ressource StorageClass my-custom-default-class pour les nouvelles requêtes de stockage.

Référencer la ressource StorageClass dans un StatefulSet

Pour utiliser votre nouvelle StorageClass, vous pouvez faire référence à cette ressource dans la spécification volumeClaimTemplates d'un StatefulSet.

Lorsque vous référencez une ressource StorageClass dans la spécification volumeClaimTemplates d'un StatefulSet, Kubernetes fournit un espace de stockage stable à l'aide de PersistentVolumes (PVs). Kubernetes appelle l'approvisionneur défini dans la StorageClass pour créer un volume de stockage. Une fois le volume provisionné, Kubernetes crée automatiquement un PV.

L'objet StatefulSet suivant référence la StorageClass my-custom-class et provisionne un volume de 1 gibioctet :

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # This is the specification in which you reference the StorageClass
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
      storageClassName: my-custom-class # This field references the existing StorageClass

Étape suivante