Utilizza StorageClasses con i tuoi carichi di lavoro

GKE su AWS esegue automaticamente il deployment dell'interfaccia Container Storage (CSI) Amazon Elastic Block Store (EBS) e Amazon Elastic File Store (EFS).

Le versioni dei driver CSI EBS e EFS sono associate a una versione di Kubernetes di GKE su AWS. La versione del driver è in genere l'ultima disponibile al momento del rilascio di una versione di GKE. Quando viene eseguito l'upgrade del cluster, i driver vengono aggiornati automaticamente.

Utilizzare la risorsa StorageClass predefinita

La creazione di un PersistentVolumeClaim senza il campo spec.storageClassName esegue il provisioning di un volume SSD per uso generico (gp2) utilizzando l'oggetto StorageClass predefinito del driver CSI EBS di GKE su AWS.

Il seguente YAML crea una PersistentVolumeClaim (PVC) denominata mypvc con una dimensione di 30 gibibyte.

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

Utilizzare una classe StorageClass preinstallata diversa

Il driver CSI EBS di GKE su AWS include anche StorageClass premium-rwo, che esegue il provisioning di volumi SSD con IOPS di provisioning (io1) con throughput più elevato.

Puoi utilizzarlo specificandolo in spec.storageClassName del PVC.

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

Utilizzo di una classe StorageClass personalizzata

Se né la StorageClass predefinita né quella premium-rwo soddisfano le tue esigenze, puoi creare StorageClass aggiuntive per i volumi EBS o utilizzare i driver Container Storage Interface (CSI).

  1. Scegli se utilizzi un volume EBS o un altro driver CSI.

    Volume EBS

    Questa scheda descrive come creare una StorageClass personalizzata che specifica un tipo di volume EBS, un tipo di file system e altri parametri. Puoi trovare parametri StorageClass aggiuntivi nella pagina GitHub del driver CSI EBS di GKE su AWS.

    Per configurare una StorageClass personalizzata, copia il seguente manifest YAML in un file denominato my-custom-class.yaml.

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

    Sostituisci CLASS_NAME con il nome della nuova StorageClass.

    Ad esempio, il seguente YAML crea una nuova StorageClass che esegue il provisioning di volumi EBS HDD ottimizzati per il throughput formattati con il file system 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
    

    StorageClass EFS personalizzata

    Questa scheda descrive come creare una StorageClass personalizzata per il provisioning del driver CSI EFS. Consulta Utilizzare una risorsa EFS per un elenco dei prerequisiti per questa StorageClass. La pagina del driver CSI EFS elenca parametri StorageClass aggiuntivi oltre a quelli nel seguente manifest.

    Copia il seguente manifest YAML in un file denominato 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"
    

    Sostituisci:

    • EFS_STORAGE_CLASS_NAME con il nome di StorageClass.
    • EFS_ID con l'ID del file system EFS, ad esempio fs-12345678a.

    Driver CSI

    Puoi specificare un driver CSI diverso nel campo provisioner.

    Per creare una StorageClass con un altro driver CSI, puoi utilizzare l'esempio YAML riportato di seguito.

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

    Sostituisci quanto segue:

    • CSI_DRIVER_NAME con il nome del driver CSI,ad esempio csi.example.com
    • CLASS_NAME con il nome di StorageClass, ad esempio my-custom-class

    Configura i campi secondari in parameters in base al driver CSI.

  2. Applica il file YAML al cluster.

    kubectl apply -f my-custom-class.yaml
    

Crea un PersistentVolumeClaim con una classe StorageClass personalizzata

  1. Una volta creata una StorageClass personalizzata, puoi specificarla in un PVC. L'esempio di seguito crea un PVC denominato my-pvc che fa riferimento alla classe di archiviazione my-custom-class.

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

Impostare la risorsa StorageClass predefinita

GKE su AWS utilizza un oggetto StorageClass predefinito denominato standard-rwo che esegue il provisioning di volumi EBS gp2. Puoi modificare il valore predefinito con un'altra risorsa StorageClass.

Per modificare la risorsa StorageClass predefinita:

  1. Aggiorna l'annotazione is-default-class per la classe di archiviazione standard-rwo con kubectl patch.

    kubectl patch storageclass standard-rwo -p \
    '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. Crea una nuova StorageClass con l'annotazione storageclass.kubernetes.io/is-default-class: true.

    La seguente StorageClass di esempio utilizza il driver ebs.csi.aws.com. Per installare un altro driver di archiviazione, vedi Installazione di driver CSI aggiuntivi.

    Copia il seguente codice YAML in un file denominato 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
    

    Sostituisci quanto segue:

    • EBS_VOLUME_TYPE: il tipo di volume EBS di AWS creato da StorageClass.
    • CLASS_NAME con il nome della nuova StorageClass

    Ad esempio, il seguente YAML crea un nuovo oggetto StorageClass predefinito che esegue il provisioning dei volumi SSD per uso generico (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. Applica la nuova classe personalizzata al cluster.

    kubectl apply -f my-custom-class.yaml
    

Dopo aver applicato questo manifest, GKE su AWS utilizza l'oggetto StorageClass my-custom-default-class per le nuove richieste di archiviazione.

Fai riferimento a StorageClass in un oggetto StatefulSet

Per utilizzare il nuovo StorageClass, devi farvi riferimento nel campo volumeClaimTemplates di un StatefulSet.

Quando fai riferimento a una StorageClass nella specifica volumeClaimTemplates di uno StatefulSet, Kubernetes fornisce spazio di archiviazione stabile utilizzando PersistentVolume (PV). Kubernetes chiama il provisioner definito in StorageClass per creare un nuovo volume di archiviazione. Dopo il provisioning del volume, Kubernetes crea automaticamente un PV.

Il seguente StatefulSet fa riferimento alla classe di archiviazione my-custom-class e provisiona un volume di 1 gibibyte:

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

Passaggi successivi