StorageClasses für Arbeitslasten nutzen

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

Die Versionen des EBS-CSI-Treibers und des EFS-CSI-Treibers sind an eine Kubernetes-Version von GKE on AWS 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 allgemeines SSD-Volume (gp2) mit der standardmäßigen EBS-CSI-Treiber-Speicherklasse von GKE on AWS 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 Speicherklasse premium-rwo, die bereitgestellte 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-Speicherklasse 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 Ihre eigene benutzerdefinierte Speicherklasse erstellen, die einen EBS-Volume-Typ, einen Dateisystemtyp und andere Parameter angibt. Zusätzliche Speicherklasse-Parameter finden Sie auf der GitHub-Seite zum EBS-CSI-Treiber für 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-Dateisystem 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-Speicherklasse

    Auf diesem Tab wird beschrieben, wie Sie eine benutzerdefinierte Speicherklasse für den EFS-CSI-Treiber-Bereitsteller erstellen. Eine Liste der Voraussetzungen für diese Speicherklasse finden Sie unter EFS-Ressource verwenden. Auf der EFS-CSI-Treiberseite werden zusätzlich zu den Parametern im folgenden Manifest zusätzliche Speicherklassenparameter aufgeführt.

    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:
      ...
    

    Ersetzen Sie Folgendes:

    • 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 ist 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-Speicherklasse erstellt, die Standard-SSD-Volumes (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