Utilizza StorageClasses con i tuoi carichi di lavoro

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

Le versioni EBS CSI Driver e EFS CSI Driver sono collegate a una versione GKE su AWS Kubernetes. Al momento del rilascio di una versione di GKE, la versione del driver è in genere quella più recente. Quando viene eseguito l'upgrade del cluster, i driver si aggiornano automaticamente.

Utilizza il valore predefinito di StorageClass

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

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

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

Utilizza un oggetto StorageClass preinstallato diverso

Il driver CSI GKE su AWS EBS include anche premium-rwo StorageClass, che esegue il provisioning di volumi SSD IOPS di cui è stato eseguito il provisioning (io1) con una velocità effettiva più elevata.

Puoi utilizzarlo specificandolo nel campo spec.storageClassName della 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é il valore predefinito né l'oggetto StorageClass di premium-rwo soddisfa le tue esigenze, puoi creare classi di archiviazione aggiuntive per i volumi EBS o utilizzare i driver Container Storage Interface (CSI).

  1. Scegli se stai utilizzando un volume EBS o un altro driver CSI.

    Volume EBS

    In questa scheda viene descritto come creare un oggetto StorageClass personalizzato che specifica un tipo di volume EBS, un tipo di file system e altri parametri. Puoi trovare ulteriori parametri di StorageClass nella pagina GitHub del driver CSI GKE su AWS EBS.

    Per configurare un oggetto StorageClass personalizzato, 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 del tuo nuovo StorageClass.

    Ad esempio, il codice YAML seguente crea un nuovo oggetto StorageClass che esegue il provisioning di volumi EBS throughput Optimized HDD 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
    

    classe di archiviazione EFS personalizzata

    Questa scheda descrive come creare un oggetto StorageClass personalizzato per il provisioner del driver CSI EFS. Consulta Utilizzare una risorsa EFS per un elenco dei prerequisiti per questo oggetto StorageClass. La pagina del driver CSI EFS elenca altri parametri StorageClass oltre a quelli nel manifest che segue.

    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 StorageClass.
    • EFS_ID con il tuo ID file system EFS, ad esempio fs-12345678a.

    Driver CSI

    Puoi specificare un driver CSI diverso nel campo provisioner.

    Per creare un oggetto StorageClass con un altro driver CSI, puoi utilizzare l'esempio YAML 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 esempiocsi.example.com
    • CLASS_NAME con il nome dell'oggetto StorageClass, ad esempio my-custom-class

    Configura i sottocampi in parameters in base al tuo driver CSI.

  2. Applica il codice YAML al tuo cluster.

    kubectl apply -f my-custom-class.yaml
    

Crea un PersistentVolumeClaim con un oggetto StorageClass personalizzato

  1. Una volta creato un oggetto StorageClass personalizzato, puoi specificarlo in un PVC. L'esempio riportato di seguito crea una PVC denominata my-pvc che fa riferimento a StorageClass my-custom-class.

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

imposta il valore predefinito di StorageClass

GKE su AWS utilizza un oggetto StorageClass predefinito denominato standard-rwo che esegue il provisioning dei volumi EBS gp2. Puoi modificare il valore predefinito in un altro oggetto StorageClass.

Per modificare il valore predefinito di StorageClass:

  1. Aggiorna l'annotazione is-default-class per StorageClass standard-rwo con kubectl patch.

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

    Nell'esempio seguente StorageClass utilizza il driver ebs.csi.aws.com. Per installare un altro driver di archiviazione, consulta Installare 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 AWS creato da StorageClass.
    • CLASS_NAME con il nome del nuovo oggetto StorageClass

    Ad esempio, il codice YAML seguente crea un nuovo oggetto StorageClass predefinito che esegue il provisioning di 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 StorageClass my-custom-default-class per le nuove richieste di archiviazione.

Riferimento a StorageClass in un StatefulSet

Per utilizzare il nuovo oggetto StorageClass, devi farvi riferimento in uno StatefulSet volumeClaimTemplates.

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

Il seguente StatefulSet fa riferimento a my-custom-class StorageClass e esegue il provisioning di un volume da 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