StorageClasses für Arbeitslasten nutzen

GKE on AWS stellt automatisch die Container Storage Interface (CSI) Amazon Elastic Block Store (EBS) und Amazon Elastic File Store (EFS) bereit.

Die Versionen des EBS-CSI-Treibers und des EFS-CSI-Treibers sind an eine GKE on AWS-Kubernetes-Version gebunden. Die Treiberversion ist in der Regel die neueste Version, die bei der Veröffentlichung einer GKE-Version verfügbar war. Bei einem Upgrade des Clusters werden die Treiber automatisch aktualisiert.

Standard-StorageClass verwenden

Wenn Sie einen PersistentVolumeClaim ohne das Feld spec.storageClassName erstellen, wird ein SSD-Volume für allgemeine Zwecke (gp2) mit der standardmäßigen GKE on AWS EBS CSI Driver StorageClass bereitgestellt.

Mit der folgenden YAML-Datei wird ein PersistentVolumeClaim (PVC) mit dem Namen mypvc mit einer Größe von 30 Gibibyte erstellt.

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

Andere vorinstallierte StorageClass verwenden

Der EBS-CSI-Treiber von GKE on AWS enthält auch die StorageClass premium-rwo, die Provisioned IOPS SSD-Volumes (io1) mit höherem Durchsatz bereitstellt.

Geben Sie sie im spec.storageClassName des PVC an, um sie zu verwenden.

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

Benutzerdefinierte StorageClass verwenden

Wenn weder die Standard- noch die premium-rwo-StorageClass Ihren Anforderungen entspricht, können Sie zusätzliche StorageClasses für EBS-Volumes erstellen oder CSI-Treiber (Container Storage Interface) verwenden.

  1. Wählen Sie aus, ob Sie ein EBS-Volume oder einen anderen CSI-Treiber verwenden.

    EBS-Volume

    Auf diesem Tab wird beschrieben, wie Sie eine benutzerdefinierte StorageClass erstellen, die einen EBS-Volume-Typ, einen Dateisystemtyp und andere Parameter angibt. Weitere StorageClass-Parameter finden Sie auf der GitHub-Seite des EBS-CSI-Treibers von GKE on AWS.

    Zum Konfigurieren einer benutzerdefinierten StorageClass kopieren Sie das folgende YAML-Manifest in eine Datei mit dem Namen my-custom-class.yaml.

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

    Ersetzen Sie dabei CLASS_NAME durch den Namen Ihrer neuen StorageClass.

    Mit der folgenden YAML-Datei wird beispielsweise eine neue StorageClass erstellt, die mit dem XFS Durchsatz-optimierte HDD-EBS-Volumes bereitstellt.

    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
    

    Benutzerdefinierte EFS-StorageClass

    Auf diesem Tab wird beschrieben, wie Sie eine benutzerdefinierte StorageClass für den EFS CSI-Treiber-Bereitsteller erstellen. Eine Liste der Voraussetzungen für diese StorageClass finden Sie unter EFS-Ressource verwenden. Auf der Seite zum EFS CSI-Treiber sind weitere StorageClass-Parameter aufgeführt, die nicht im folgenden Manifest enthalten sind.

    Kopieren Sie das folgende YAML-Manifest in eine Datei mit dem Namen 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"
    

    Ersetzen Sie:

    • EFS_STORAGE_CLASS_NAME durch den Namen der StorageClass.
    • EFS_ID durch Ihre EFS-Dateisystem-ID, z. B. fs-12345678a.

    CSI-Treiber

    Sie können im Feld provisioner einen anderen CSI-Treiber angeben.

    Zum Erstellen einer StorageClass mit einem anderen CSI-Treiber können Sie das folgende YAML-Beispiel verwenden:

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

    Dabei gilt:

    • CSI_DRIVER_NAME durch den Namen des CSI-Treibers, z. B. csi.example.com
    • CLASS_NAME durch den Namen der StorageClass, z. B. my-custom-class

    Konfigurieren Sie die untergeordneten Felder unter parameters gemäß Ihrem CSI-Treiber.

  2. Wenden Sie die YAML-Datei auf Ihren Cluster an.

    kubectl apply -f my-custom-class.yaml
    

PersistentVolumeClaim mit benutzerdefinierter StorageClass erstellen

  1. Nachdem die benutzerdefinierte StorageClass erstellt wurde, können Sie sie in einem PVC angeben. Im folgenden Beispiel wird ein PVC namens my-pvc erstellt, das auf die StorageClass my-custom-class verweist.

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

Standard-StorageClass festlegen

GKE on AWS verwendet die Standard-StorageClass standard-rwo, die gp2-EBS-Volumes bereitstellt. Sie können diese Standardeinstellung in eine andere StorageClass ändern.

So ändern Sie die Standard-StorageClass:

  1. Aktualisieren Sie die Annotation is-default-class für die StorageClass standard-rwo mit kubectl patch.

    kubectl patch storageclass standard-rwo -p \
    '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. Erstellen Sie eine neue StorageClass mit der Annotation storageclass.kubernetes.io/is-default-class: true.

    Die folgende Beispiel-StorageClass nutzt den Treiber ebs.csi.aws.com. Informationen zum Installieren eines weiteren Speichertreibers finden Sie unter Zusätzliche CSI-Treiber installieren.

    Kopieren Sie das folgende YAML-Manifest in eine Datei mit dem Namen 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
    

    Ersetzen Sie Folgendes:

    • EBS_VOLUME_TYPE: der von der StorageClass erstellte AWS EBS-Volume-Typ.
    • CLASS_NAME durch den Namen Ihrer neuen StorageClass

    Mit der folgenden YAML-Datei wird beispielsweise eine neue Standard-StorageClass erstellt, die SSD-Volumes für allgemeine Zwecke (gp3) bereitstellt.

    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. Wenden Sie die neue benutzerdefinierte Klasse auf Ihren Cluster an.

    kubectl apply -f my-custom-class.yaml
    

Nach der Anwendung dieses Manifests verwendet GKE on AWS die StorageClass my-custom-default-class für neue Speicheranfragen.

Auf StorageClass in einem StatefulSet verweisen

Verweisen Sie auf die StorageClass im volumeClaimTemplates eines StatefulSet, um sie zu verwenden.

Wenn Sie in der Spezifikation volumeClaimTemplates eines StatefulSet auf eine StorageClass verweisen, bietet Kubernetes stabilen Speicher mit PersistentVolumes (PVs). Kubernetes ruft den in der StorageClass definierten Bereitsteller auf, um ein neues Speicher-Volume zu erstellen. Nachdem das Volume bereitgestellt wurde, erstellt Kubernetes automatisch eine Produktversion.

Das folgende StatefulSet verweist auf die StorageClass my-custom-class und stellt ein 1-Gibibyte-Volume bereit:

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

Nächste Schritte