Bestehenden nichtflüchtigen Speicher als PersistentVolumes verwenden

Auf dieser Seite wird erläutert, wie Sie mit einem vorhandenen nichtflüchtigen Speicher von Compute Engine, der mit Daten gefüllt ist, ein PersistentVolume erstellen und es in einem Pod verwenden.

PersistentVolume und PersistentVolumeClaim erstellen

Für einen nichtflüchtigen Speicher mit dem Namen pd-name mit 500 GB beschreibt die nachfolgend aufgeführte Manifestdatei existing-pd.yaml das entsprechende PersistentVolume und den entsprechenden PersistentVolumeClaim.

Es gibt mehrere Möglichkeiten, einen PersistentVolumeClaim an ein bestimmtes PersistentVolume zu binden. In diesem Beispiel wird ein claimRef verwendet, das dafür sorgt, dass das PersistentVolume nur mit dem von Ihnen angegebenen PersistentVolumeClaim verknüpft werden kann.

Damit ein PersistentVolume an einen PersistentVolumeClaim gebunden wird, müssen sowohl der storageClassName der beiden Ressourcen übereinstimmen sowie capacity, accessModes und volumeMode. Ein leerer Name kann angegeben werden, doch Sie müssen explizit „“ verwenden, um zu verhindern, dass die Standard-StorageClass des Clusters verwendet wird.

Der storageClassName muss sich nicht auf ein vorhandenes StorageClass-Objekt beziehen. Sie können einen beliebigen Namen verwenden, wenn Sie lediglich den Anspruch an ein Volume binden möchten. Wenn Sie zusätzliche Funktionen benötigen, die von einer StorageClass konfiguriert werden, z. B. zum Ändern der Größe eines Volumes, muss sich der storageClassName auf ein vorhandenes StorageClass-Objekt beziehen.

Weitere Informationen finden Sie in der Kubernetes-Dokumentation zu PersistentVolumes.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  storageClassName: "example-storageclass"
  capacity:
    storage: 500G
  accessModes:
    - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  gcePersistentDisk:
    pdName: pd-name
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-demo
spec:
  storageClassName: "example-storageclass"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500G

Zum Erstellen von PersistentVolume und PersistentVolumeClaim verwenden Sie kubectl apply -f existing-pd.yaml.

PersistentVolume in einem Pod verwenden

Sobald PersistentVolume und PersistentVolumeClaim im Cluster vorhanden sind, können Sie den Containern eines Pods Zugriff auf das Volume gewähren, indem Sie im Feld volumeMounts Werte angeben. In diesem Beispiel geben diese Felder an, dass das Volume mit dem Namen task-pv-storage im Dateipfad /usr/share/nginx/html bereitgestellt wird.

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
       claimName: pv-claim-demo
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

Wenn Sie dieses Manifest auf einen Cluster anwenden, wird der Pod erstellt und der Container task-pv-container hat Zugriff auf das Volume im Verzeichnis /usr/share/nginx/html/.

Vorhandenes Laufwerk in einem StatefulSet verwenden

So verwenden Sie ein bereits vorhandenes Laufwerk in einem StatefulSet:

  1. Legen Sie den StatefulSet-Namen volumeClaimTemplates.name und die Anzahl der Replikate für Ihr StatefulSet fest und notieren Sie sich die Werte. Erstellen Sie das StatefulSet erst, wenn Sie den PersistentVolumeClaim erstellt haben.
  2. Ermitteln Sie den automatisch generierten PersistentVolumeClaim-Namen des StatefulSet. In StatefulSets entspricht der PersistentVolumeClaim-Name einem vorhersehbaren Muster: volumeclaimtemplates-name-statefulset-name-replica-index. Wenn Sie beispielsweise entscheiden, dass der Name des StatefulSet „web“ und der volumeClaimTemplates.name des StatefulSet „www“ lauten und es gibt zwei StatefulSet-Replikate, dann lauten die beiden PersistentVolumeClaim-Namen www-web-0 und www-web-1.
  3. Erstellen Sie PersistentVolumes mit einem Feld claimRef und geben Sie für claimRef.name den generierten PersistentVolumeClaim-Namen an. Wenn mehrere Replikate vorhanden sind, müssen Sie für jedes Replikat ein PersistentVolume erstellen.

    Die folgenden beispielhaften PersistentVolumes gelten für eine Umgebung mit den folgenden Funktionen:

    • Ein StatefulSet, das sich im Standard-Namespace befindet
    • Ein StatefulSet mit zwei Replikaten
    • Ein StatefulSet, in dem die automatisch generierten PersistentVolumeClaim-Namen www-web-0 und www-web-1 lauten
    • Zwei vorhandene nichtflüchtige Speicher mit den Namen pd-zero und pd-one
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-0
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-0
      gcePersistentDisk:
        pdName: pd-zero
        fsType: ext4
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-1
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-1
      gcePersistentDisk:
        pdName: pd-one
        fsType: ext4
    
  4. Erstellen Sie ein StatefulSet mit den Werten, die Sie im ersten Schritt ausgewählt haben. Achten Sie darauf, dass der in volumeClaimTemplates angegebene Speicher kleiner oder gleich der Kapazität Ihrer PersistentVolumes ist. Beispiel:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: k8s.gcr.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 100Gi
    

Nächste Schritte