Persistent Volume Claims (PVCs) im Block Volume-Service bereitstellen

Erfahren Sie, wie Sie Persistent Volume Claims für Cluster bereitstellen, die Sie mit der Kubernetes Engine (OKE) erstellt haben, indem Sie Volumes aus dem Block Volume Service anhängen.

Der Oracle Cloud Infrastructure Block Volume-Service (Block Volume-Service) bietet persistenten, dauerhaften und leistungsstarken Blockspeicher für Ihre Daten. Sie können die Volume-Plug-ins für CSI-Volume oder FlexVolume verwenden, um Cluster mit Volumes aus dem Block Volume-Service zu verbinden. Oracle empfiehlt die Verwendung des CSI-Volume Plug-ins aus folgenden Gründen:
  • Neue Funktionen werden nur dem CSI-Volume-Plug-in hinzugefügt, nicht dem Volume-Plug-in FlexVolume (obwohl Kubernetes-Entwickler das Volume-Plug-in FlexVolume weiterhin verwalten werden).
  • Das CSI-Volume-Plug-in setzt keinen Zugriff auf zugrunde liegende Betriebssystem- und Root-Dateisystemabhängigkeiten voraus.
Hinweis

Das Upstream-Kubernetes-Projekt setzt das Volume-Plug-in FlexVolume in Kubernetes-Version 1.23 ein. Das Entfernen des Features entspricht den Richtlinien in der Kubernetes-Ablehnungs-Policy.

Es wird empfohlen, vorhandene Workloads vom Volume-Plug-in FlexVolume in das CSI-Volume-Plug-in zu migrieren. Anweisungen zur Migration finden Sie unter Vom Volume-Plug-in FlexVolume zum CSI-Volume-Plug-in migrieren.

Die für einen PVC angegebene StorageClass steuert, mit welchem Volume-Plug-in eine Verbindung zu Block Volume-Service-Volumes hergestellt werden soll. Standardmäßig sind zwei Speicherklassen definiert: oci-bv für das CSI-Volume-Plug-in und oci für das FlexVolume-Plug-in. Wenn Sie in der YAML-Datei, die PVCs definiert, keinen Wert für storageClassName explizit angeben, wird die Standardspeicherklasse des Clusters verwendet. Die Standardspeicherklasse des Clusters wird anfänglich wie folgt gemäß der Kubernetes-Version festgelegt, die beim Erstellen des Clusters angegeben wurde:

  • In Clustern, die von der Kubernetes-Engine zur Ausführung von Kubernetes-Version 1.24 (oder höher) erstellt wurden, wird die Speicherklasse oci-bv anfänglich als Standard festgelegt. Die Speicherklasse oci-bv wird vom CSI-Volume-Plug-in verwendet.
  • In Clustern, die von der Kubernetes-Engine zur Ausführung von Kubernetes-Version 1.23 (oder früher) erstellt wurden, wird die Speicherklasse oci anfänglich als Standard festgelegt. Die oci-Speicherklasse wird vom Volume-Plug-in FlexVolume verwendet.
Hinweis

In Clustern, die ursprünglich von der Kubernetes-Engine zur Ausführung von Kubernetes-Version 1.23 (oder früher) erstellt und anschließend auf Kubernetes-Version 1.24 (oder höher) upgegradet wurden, wird die Standardspeicherklasse während des Upgradeprozesses nicht geändert. Wenn also die Standardspeicherklasse vor dem Upgrade oci war, ist die Standardspeicherklasse nach dem Upgrade weiterhin oci.

Wenn oci-bv anstelle von oci die Standardspeicherklasse eines Clusters sein soll, für das Sie ein Upgrade von Kubernetes-Version 1.23 (oder früher) auf Kubernetes-Version 1.24 (oder höher) durchgeführt haben, ändern Sie die Standardspeicherklasse wie folgt:

  1. Geben Sie an, dass oci nicht die Standardspeicherklasse ist, indem Sie Folgendes eingeben:
    kubectl patch storageclass oci -p '{"metadata": {"annotations": {"storageclass.beta.kubernetes.io/is-default-class":"false"}}}'
  2. Geben Sie an, dass oci-bv die Standardspeicherklasse ist, indem Sie Folgendes eingeben:
    kubectl patch storageclass oci-bv -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class":"true"}}}'

Im Fall des CSI-Volume-Plug-ins stellt das CSI-Topologiefeature sicher, dass sich Worker-Knoten und Volumes in derselben Availability-Domain befinden. Im Fall des FlexVolume-Volume-Plug-ins können Sie das Element matchLabels verwenden, um die Availability-Domain auszuwählen, in der ein Persistent Volume Claim bereitgestellt ist. Beachten Sie, dass Sie das Element matchLabels nicht mit dem CSI-Volume-Plug-in verwenden dürfen.

Wenn sich ein Cluster in einem anderen Compartment als die Worker-Knoten befindet, müssen Sie unabhängig vom verwendeten Volume-Plug-in eine zusätzliche Policy erstellen, um den Zugriff auf Block-Volume-Service-Volumes zuzulassen. Diese Situation tritt auf, wenn das für einen Knotenpool angegebene Subnetz zu einem anderen Compartment als das Cluster gehört. Um den Worker-Knoten den Zugriff auf Block-Volume-Service-Volumes zu ermöglichen, erstellen Sie die zusätzliche Policy mit den folgenden beiden Policy-Anweisungen:

  • ALLOW any-user to manage volumes in TENANCY where request.principal.type = 'cluster'
  • ALLOW any-user to manage volume-attachments in TENANCY where request.principal.type = 'cluster'

Für eine explizite Angabe des Volume-Plug-ins für die Verbindung mit dem Block Volume-Service während des Provisionings eines Persistent Volume Claims geben Sie einen Wert für storageClassName in der YAML-Datei an, die den PVC definiert:

  • Geben Sie zur Verwendung des CSI-Volume-Plug-ins storageClassName: "oci-bv" an.
  • Geben Sie zur Verwendung des FlexVolume-Volume-Plug-ins storageClassName: "oci" an.

Beachten Sie Folgendes:

  • Der minimale persistente Speicherplatz, den ein PVC anfordern kann, beträgt 50 GB. Beträgt die Anforderung weniger als 50 GB, wird sie auf 50 GB aufgerundet.
  • Wenn Sie den persistenten Speicher, den ein PVC anfordern kann, erhöhen möchten, legen Sie allowVolumeExpansion: true in der Definition der für das PVC angegebenen Speicherklasse fest. Siehe Block Volume einblenden.
  • Wenn Sie ein Cluster erstellen, können Sie optional Tags definieren, die auf Block-Volumes angewendet werden sollen, die bei der Definition von Persistent Volume Claims (PVCs) erstellt werden. Mit Tagging können Sie verschiedene Ressourcen über Compartments hinweg gruppieren. Außerdem können Sie Ressourcen mit Ihren eigenen Metadaten annotieren. Siehe Tags auf Block Volumes anwenden.
  • Nachdem Sie mit dem CSI-Volume-Plug-in einen PVC auf einem neuen Block-Volume erstellt haben, können Sie Kapazitätsstatistiken für das Block-Volume mit einem Metrikaggregationstool (wie Prometheus) anzeigen, einschließlich:
    • kubelet_volume_stats_available_bytes
    • kubelet_volume_stats_capacity_bytes
    • kubelet_volume_stats_inodes
    • kubelet_volume_stats_inodes_free
    • kubelet_volume_stats_inodes_used
    • kubelet_volume_stats_used_bytes

PVC auf einem Block-Volume mit dem CSI-Volume-Plug-in erstellen

Sie können ein Block-Volume dynamisch mit dem CSI-Plug-in bereitstellen, das in der Definition der Speicherklasse oci-bv (provisioner: blockvolume.csi.oraclecloud.com) angegeben ist. Beispiel: Der Clusteradministrator hat keine geeigneten PVs erstellt, die der PVC-Anforderung entsprechen.

Sie definieren einen PVC in einer Datei namens csi-bvs-pvc.yaml. Beispiel:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mynginxclaim
spec:
  storageClassName: "oci-bv"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Geben Sie den folgenden Befehl ein, um den PVC aus der csi-bvs-pvc.yaml-Datei zu erstellen:

kubectl create -f  csi-bvs-pvc.yaml

Die Ausgabe des obigen Befehls bestätigt die Erstellung des PVC:

persistentvolumeclaim "mynginxclaim" created

Prüfen Sie, ob der PVC erstellt wurde, indem Sie den Befehl kubectl get pvc ausführen:

kubectl get pvc

Die Ausgabe des obigen Befehls zeigt den aktuellen Status des PVC an:

		
NAME               STATUS   VOLUME   CAPACITY   ACCESSMODES   STORAGECLASS   AGE
mynginxclaim       Pending                                    oci-bv         4m

Der PVC hat den Status Pending, da die Speicherklasse oci-bv den Wert volumeBindingMode: WaitForFirstConsumer enthält.

Sie können diesen PVC beim Erstellen anderer Objekte, wie Pods, verwenden. Beispiel: Sie können einen neuen Pod aus der folgenden Poddefinition erstellen, die das System anweist, den mynginxclaim-PVC als nginx-Volume zu verwenden, das vom Pod bei /data gemountet wird.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: mynginxclaim

Nach Erstellen des neuen Pods können Sie prüfen, ob der PVC an ein neues Persistent Volume gebunden wurde, indem Sie Folgendes eingeben:

kubectl get pvc

Die Ausgabe des obigen Befehls bestätigt, dass der PVC gebunden wurde:

			
NAME               STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS   AGE
mynginxclaim       Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci-bv         4m

Sie können prüfen, ob der Pod den neuen Persistent Volume Claim verwendet, indem Sie Folgendes eingeben:

kubectl describe pod nginx

Sie können Kapazitätsstatistiken für das neue persistente Volume mit einem Aggregationstool für Metriken wie Prometheus anzeigen.

Volume Snapshot aus einem Block-Volume-Backup mit dem CSI-Volume-Plug-in erstellen

Ein Kubernetes-Volume Snapshot ist ein Snapshot eines persistenten Volumes auf einem Speichersystem. Mit einem Volume Snapshot können Sie ein neues persistentes Volume bereitstellen. Weitere Informationen zu Kubernetes-Volume Snapshots finden Sie unter Volume Snapshots in der Kubernetes-Dokumentation.

Wenn Sie mit dem CSI-Volume-Plug-in Cluster mit Block-Volumes im Block-Volume-Service verbinden, können Sie Block-Volume-Backups verwenden, um Kubernetes-Volume-Snapshots bereitzustellen. Sie können einen Volume Snapshot verwenden, um ein neues Block-Volume zu erstellen und es mit Daten aus dem Block-Volume-Backup vorab aufzufüllen. Weitere Informationen zu Block-Volume-Backups im Block Volume Service finden Sie unter Überblick über Block-Volume-Backups.

Mit dem CSI-Volume-Plug-in können Sie einen Volume Snapshot auf zwei Arten bereitstellen:

  • Dynamisch: Sie können die Erstellung eines Backups des Block-Volumes anfordern, das ein persistentes Volume bereitstellt. Sie geben den Persistent Volume Claim mit dem Objekt VolumeSnapshot an, und Sie geben die Parameter an, mit denen das Block-Volume-Backup mit dem Objekt VolumeSnapshotClass erstellt werden soll. Dynamisch bereitgestellte Volume Snapshots werden auch als dynamische Volume Snapshots bezeichnet. Siehe Dynamisch bereitgestellte Volume Snapshots erstellen.
  • Statisch: Sie können Details zu einem vorhandenen Block-Volume-Backup mit dem Objekt VolumeSnapshotContent angeben. Statisch bereitgestellte Volume Snapshots werden auch als statische Volume Snapshots und als vorab bereitgestellte Volume Snapshots bezeichnet. Statisch bereitgestellte Volume Snapshots erstellen

Wenn Sie einen dynamisch bereitgestellten Volume Snapshot erstellen, werden dieselben Freiformtags und definierten Tags, die auf das Quellblock-Volume angewendet wurden, auf das Block-Volume-Backup angewendet. Sie können jedoch Parameter verwenden, um zusätzliche Tags auf das Block-Volume-Backup anzuwenden (siehe Block-Volume-Backups taggen).

Vor dem Erstellen von Volume Snapshots zur Verwendung mit Clustern, die von der Kubernetes-Engine erstellt werden, müssen mehrere Voraussetzungen erfüllt sein. Siehe Voraussetzungen für das Erstellen von Volume Snapshots.

Beachten Sie beim Erstellen und Verwenden von Volume Snapshots Folgendes:

  • Sie können Volume-Snapshots nur erstellen, wenn Sie das CSI-Volume-Plug-in verwenden (das heißt, Sie können keine Volume-Snapshots erstellen, wenn Sie das Volume-Plug-in FlexVolume verwenden).
  • Bei dynamischen Volume-Backups erstellt das CSI-Volume-Plug-in ein neues Block-Volume-Backup, um einen dynamischen Volume-Snapshot im selben Compartment wie das Cluster bereitzustellen. Bei statischen Volume Snapshots kann sich das Block-Volume-Backup, das ein statischer Volume Snapshot bereitstellt, in einem anderen Compartment als das Cluster befinden, sofern entsprechende Policy-Anweisungen vorhanden sind, damit das Cluster auf dieses andere Compartment zugreifen kann (siehe Voraussetzungen für das Erstellen von Volume Snapshots).
  • Mit dem CSI-Volume-Plug-in können Sie ein vorhandenes Volume nicht erneut mit Daten auffüllen. Mit anderen Worten: Sie können Daten in einem vorhandenen persistenten Volume nicht in einen früheren Status zurücksetzen (wiederherstellen), indem Sie den Volume Snapshot ändern, der im Manifest des Persistent Volume Claims angegeben ist. Sie können nur das CSI-Volume-Plug-in verwenden, um ein neues Volume mit Daten zu füllen.
  • Wenn Sie ein Block-Volume-Backup erstellen (z.B. beim Erstellen eines dynamischen Volume-Snapshots), wird der Verschlüsselungsschlüssel, der beim Erstellen des Block-Volumes verwendet wurde, auch zum Erstellen des Block-Volume-Backups verwendet. Beim Erstellen eines Block-Volume-Backups können Sie keinen neuen Verschlüsselungsschlüssel angeben. Daher verwendet das Block-Volume-Backup dieselbe Verschlüsselung wie das Block-Volume, das gesichert wird.
  • Die für ein persistentes Volume, das von einem Volume Snapshot bereitgestellt wird, angegebene Größe darf nicht kleiner als die Größe des ursprünglichen Volumes sein, von dem der Snapshot erstellt wurde.
  • Wenn das CSI-Volume-Plug-in ein neues Block-Volume erstellt, um ein persistentes Volume zu sichern, das von einem Volume Snapshot bereitgestellt wird, hängt die Platzierung des Block-Volumes von den Topologieanforderungen der Volume-Erstellungsanforderung ab. Beispiel: Wenn das CSI-Volume-Plug-in ein Block-Volume für einen Pod erstellt, der einen persistenten Volume Claim verwendet, wird das Block-Volume in derselben Availability-Domain wie der Worker-Knoten erstellt, auf dem der Pod ausgeführt wird.
  • Namespace-übergreifende Snapshots werden nicht unterstützt.
  • Wenn die Anzahl der VolumeSnapshot- und VolumeSnapshotContent-Objekte in einem Cluster zunimmt, können sie erheblichen Speicherplatz in etcd belegen, was zu unerwartetem Clusterverhalten führen kann. Um das Cluster fehlerfrei zu halten, wird empfohlen, einen Löschmechanismus zu implementieren, um nicht mehr benötigte VolumeSnapshot- und VolumeSnapshotContent-Objekte regelmäßig zu bereinigen.

Voraussetzungen für das Erstellen von Volume Snapshots

So erstellen Sie Volume Snapshots zur Verwendung mit Clustern, die von der Kubernetes-Engine erstellt wurden:

  • Auf den Control-Plane-Knoten des Clusters muss Kubernetes-Version 1.24 oder höher ausgeführt werden
  • Die Worker-Knoten des Clusters müssen x86-basierte oder ARM-basierte Prozessor-Compute-Ausprägungen verwenden
  • Die Worker-Knoten des Clusters müssen Oracle Linux 7, Oracle Linux 8 oder Ubuntu ausführen

Die Objekte VolumeSnapshot, VolumeSnapshotContent und VolumeSnapshotClass sind nicht Teil der Kubernetes-Core-API. Bevor Sie Volume Snapshots mit dem CSI-Volume-Plug-in erstellen können, müssen Sie daher die erforderlichen CRD-Dateien (Benutzerdefinierte Ressourcendefinition) im Cluster installieren, indem Sie die folgenden Befehle ausführen:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml

Wenn Sie einen statisch bereitgestellten Volume Snapshot zum Provisioning eines neuen persistenten Volumes verwenden möchten und sich das zugrunde liegende Block-Volume-Backup in einem anderen Compartment als das Cluster befindet, müssen entsprechende Policy-Anweisungen vorhanden sein, damit das Cluster auf die Block-Volume-Backups in diesem anderen Compartment zugreifen kann. Beispiel:

ALLOW any-user to manage volume-backups in compartment <compartment-name> where request.principal.type = 'cluster'
ALLOW any-user to use volumes in compartment <compartment-name> where request.principal.type = 'cluster'

Dynamisch bereitgestellte Volume Snapshots erstellen

Um einen Volume Snapshot dynamisch durch Erstellen eines Backups des Block-Volumes bereitzustellen, das einen persistenten Volume Claim bereitstellt, definieren Sie zunächst ein VolumeSnapshotClass-Objekt, das den Typ des zu erstellenden Block-Volume-Backups angibt. Nachdem Sie das Objekt VolumeSnapshotClass erstellt haben, definieren Sie ein VolumeSnapshot-Objekt, das das VolumeSnapshotClass verwendet. Mit dem Objekt VolumeSnapshot können Sie den Persistent Volume Claim angeben, der von dem Block-Volume bereitgestellt wird, das Sie sichern möchten.

Hinweis

Wenn Sie einen dynamisch bereitgestellten Volume Snapshot erstellen, erstellt die Kubernetes-Engine ein VolumeSnapshotContent-Objekt. Ändern Sie weder die VolumeSnapshotContent-Objekte, die Kubernetes Engine erstellt, noch erstellen Sie Ihre eigenen VolumeSnapshotContent-Objekte, wenn Sie dynamisch bereitgestellte Volume Snapshots erstellen.

Beispiel: Sie definieren einen Persistent Volume Claim namens sample-pvc in einer Datei namens csi-mypvctobackup.yaml, die von einem Block-Volume bereitgestellt wird:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sample-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "oci-bv"
  resources:
    requests:
      storage: 50Gi

Erstellen Sie den Persistent Volume Claim:

kubectl create -f csi-mypvctobackup.yaml

Sie können den Persistent Volume Claim beim Definieren anderer Objekte, wie Pods, verwenden. Beispiel: Die folgende Poddefinition weist das System an, den Persistent Volume Claim "ample-pvc" als nginx-Volume zu verwenden, das vom Pod beim /sample-Volume gemountet ist.

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: sample-nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sample-volume
  volumes:
  - name: sample-volume
    persistentVolumeClaim:
      claimName: sample-pvc

Nachdem der neue Pod erstellt wurde, ist der Persistent Volume Claim an ein neues Persistent Volume gebunden, das von einem Block-Volume bereitgestellt wird.

Wenn Sie ein Backup des Block-Volumes erstellen möchten, das den Persistent Volume Claim bereitstellt, legen Sie Parameter für das Block-Volume-Backup fest, indem Sie ein VolumeSnapshotClass-Objekt mit dem Namen my-snapclass in einer Datei mit dem Namen csi-mysnapshotclass.yaml definieren:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: my-snapclass
driver: blockvolume.csi.oraclecloud.com
parameters:
  backupType: full
deletionPolicy: Delete

Hierbei gilt:

  • driver: blockvolume.csi.oraclecloud.com gibt das CSI-Volume-Plug-in für das Provisioning von VolumeSnapshot-Objekten an.
  • parameters.backupType: full gibt an, dass ein Block-Volume-Backup alle Änderungen seit der Erstellung des Block-Volumes enthält. Geben Sie incremental an, um ein Backup mit nur den Änderungen seit dem letzten Backup zu erstellen. Beachten Sie, dass es für die Datenwiederherstellung keinen funktionalen Unterschied zwischen inkrementellen Backups und vollständigen Backups gibt. Siehe Volume-Backuptypen.
  • deletionPolicy: Delete gibt an, was mit einem Block-Volume-Backup geschieht, wenn das zugehörige VolumeSnapshot-Objekt gelöscht wird. Geben Sie Retain an, um ein Block-Volume-Backup beizubehalten, wenn das verknüpfte VolumeSnapshot-Objekt gelöscht wird.

Standardmäßig werden dieselben Freiformtags und definierten Tags, die auf das Quellblock-Volume angewendet wurden, auf das Block-Volume-Backup angewendet. Sie können jedoch Parameter verwenden, um zusätzliche Tags auf das Block-Volume-Backup anzuwenden (siehe Block-Volume-Backups taggen).

Erstellen Sie das Objekt VolumeSnapshotClass:

kubectl create -f csi-mysnapshotclass.yaml

Um ein Backup des Block-Volumes zu erstellen, das den Persistent Volume Claim bereitstellt, definieren Sie ein VolumeSnapshot-Objekt als "my-snapshot" in einer Datei namens csi-mysnapshot.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
  namespace: default
spec:
  volumeSnapshotClassName: my-snapclass
  source:
    persistentVolumeClaimName: sample-pvc
Hierbei gilt:
  • volumeSnapshotClassName: my-snapclass gibt my-snapclass als das Objekt VolumeSnapshotClass an, aus dem Parameter abgerufen werden sollen, die beim Erstellen des Block-Volume-Backups verwendet werden sollen. Beachten Sie, dass Sie volumeSnapshotClassName nicht ändern können, nachdem Sie das Objekt VolumeSnapshot erstellt haben (Sie müssen ein neues VolumeSnapshot-Objekt erstellen).
  • persistentVolumeClaimName: sample-pvc gibt sample-pvc als Persistent Volume Claim basierend auf dem Block-Volume an, für das Sie ein Block-Volume-Backup erstellen möchten. Beachten Sie, dass Sie die Quelle nicht ändern können, nachdem Sie das Objekt VolumeSnapshot erstellt haben (Sie müssen ein neues VolumeSnapshot-Objekt erstellen).

Erstellen Sie das Objekt VolumeSnapshot:

kubectl create -f csi-mysnapshot.yaml

Das Objekt VolumeSnapshot wird von einem neuen Block-Volume-Backup erstellt und bereitgestellt. Mit dem Volume Snapshot können Sie ein neues persistentes Volume bereitstellen (siehe Mit einem Volume Snapshot ein neues Volume bereitstellen).

Statisch bereitgestellte Volume Snapshots erstellen

Um einen Volume Snapshot aus einem vorhandenen Block-Volume-Backup statisch bereitzustellen, erstellen Sie zunächst das Block-Volume-Backup (siehe Manuelles Backup für ein Block-Volume erstellen).

Nachdem Sie das Block-Volume-Backup erstellt haben, definieren Sie ein VolumeSnapshotContent-Objekt, und geben Sie Details (einschließlich OCID) des vorhandenen Block-Volume-Backups an. Sie können dann ein VolumeSnapshot-Objekt definieren und das VolumeSnapshotContent-Objekt angeben, das Details zum vorhandenen Block-Volume-Backup bereitstellt.

Beispiel: Sie definieren das Objekt VolumeSnapshotContent als my-static-snapshot-content in einer Datei namens csi-mystaticsnapshotcontent.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: my-static-snapshot-content
spec:
  deletionPolicy: Retain
  driver: blockvolume.csi.oraclecloud.com
  source:
    snapshotHandle: ocid1.volumebackup.oc1.iad.aaaaaa______xbd
  volumeSnapshotRef:
    name: my-static-snapshot
    namespace: default
Hierbei gilt:
  • deletionPolicy: Retain gibt an, was mit einem Block-Volume-Backup geschieht, wenn das zugehörige VolumeSnapshot-Objekt gelöscht wird. Geben Sie Delete an, um ein Block-Volume-Backup zu löschen, wenn das zugehörige VolumeSnapshot-Objekt gelöscht wird.
  • driver: blockvolume.csi.oraclecloud.com gibt an, dass das CSI-Volume-Plug-in VolumeSnapshot-Objekte durch Provisioning bereitstellen soll.
  • snapshotHandle: ocid1.volumebackup.oc1.iad.aaaaaa______xbd gibt die OCID des vorhandenen Block-Volume-Backups an.
  • volumeSnapshotRef.name: my-static-snapshot gibt den Namen des entsprechenden VolumeSnapshot-Objekts an, das aus dem vorhandenen Block-Volume-Backup bereitgestellt werden soll. Dieses Feld ist erforderlich. Beachten Sie, dass das Objekt VolumeSnapshot nicht vorhanden sein muss, wenn Sie das Objekt VolumeSnapshotContent erstellen.
  • namespace: default gibt den Namespace an, der das entsprechende VolumeSnapshot-Objekt enthält, das aus dem vorhandenen Block-Volume-Backup bereitgestellt werden soll. Dieses Feld ist erforderlich.

Erstellen Sie das Objekt VolumeSnapshotContent:

kubectl create -f csi-mystaticsnapshotcontent.yaml

Sie definieren das statisch bereitgestellte Objekt VolumeSnapshot als my-static-snapshot in einer Datei namens csi-mystaticsnapshot.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-static-snapshot
spec:
  source:
    volumeSnapshotContentName: my-static-snapshot-content

wobei VolumeSnapshotContentName: my-static-snapshot-content den Namen des zuvor erstellten VolumeSnapshotContent-Objekts angibt. Beachten Sie, dass Sie die Quelle nicht ändern können, nachdem Sie das Objekt VolumeSnapshot erstellt haben (Sie müssen ein neues VolumeSnapshot-Objekt erstellen).

Erstellen Sie das Objekt VolumeSnapshot:

kubectl create -f csi-mystaticsnapshot.yaml

Das Objekt VolumeSnapshot wird von dem Block-Volume-Backup erstellt und bereitgestellt, das im Objekt VolumeSnapshotContent angegeben ist. Mit dem Volume Snapshot können Sie ein neues persistentes Volume bereitstellen (siehe Mit einem Volume Snapshot ein neues Volume bereitstellen).

Mit einem Volume Snapshot ein neues Volume bereitstellen

Nachdem Sie einen dynamisch bereitgestellten oder statisch bereitgestellten Volume Snapshot erstellt haben, können Sie den Volume Snapshot als Datenquelle für einen Persistent Volume Claim angeben, um ein neues Persistent Volume bereitzustellen.

Beispiel: Sie definieren einen Persistent Volume Claim namens pvc-fromsnapshot in einer Datei namens csi-mypvcfromsnapshot.yaml, die von einem Volume Snapshot namens test-snapshot bereitgestellt wird:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-fromsnapshot
  namespace: default
spec:
  storageClassName: oci-bv
  dataSource:
    name: test-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Hierbei gilt:

  • datasource.name: test-snapshot gibt test-snapshot als Namen des VolumeSnapshot-Objekts an, das als Datenquelle für das persistente Volume verwendet werden soll.
  • datasource.apiGroup: snapshot.storage.k8s.io gibt die Version der zu verwendenden Kubernetes-Snapshot-Speicher-API an.

Erstellen Sie den Persistent Volume Claim:

kubectl create -f csi-mypvcfromsnapshot.yaml

Wenn der Persistent Volume Claim zum Provisioning eines anderen Objekts (z.B. eines Pods) verwendet wird, wird ein persistentes Volume erstellt, und das angegebene Objekt VolumeSnapshot wird zum Auffüllen des zugrunde liegenden Block-Volumes verwendet. Beispiel: Sie können einen neuen Pod aus der folgenden Poddefinition erstellen, die das System anweist, den PVC-fromsnapshot als nginx-Volume zu verwenden, das vom Pod bei /data gemountet ist.

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-restore
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: pvc-fromsnapshot

Nachdem der neue Pod erstellt wurde, ist der Persistent Volume Claim an ein neues Persistent Volume gebunden, das von einem neuen Block-Volume bereitgestellt wird, das vom Objekt VolumeSnapshot aufgefüllt wird.

Block-Volume-Backups taggen

Wenn Sie mit dem CSI-Volume-Plug-in einen dynamisch bereitgestellten Volume Snapshot erstellen, werden dieselben Freiformtags und definierten Tags, die auf das Quellblock-Volume angewendet wurden, auch auf das Block-Volume-Backup angewendet.

Um zusätzliche Freiformtags auf das neue Block-Volume-Backup anzuwenden, fügen Sie den folgenden Parameter in den Parameterabschnitt der Manifestdatei VolumeSnapshotClass ein:

oci.oraclecloud.com/freeform-tags: '{"<first-tag-key>":","<first-tag-value>","<second-tag-key>":"<second-tag-value>"...}'

Um zusätzliche definierte Tags auf das neue Block-Volume-Backup anzuwenden, nehmen Sie den folgenden Parameter in den Parameterabschnitt der Manifestdatei VolumeSnapshotClass auf:

oci.oraclecloud.com/defined-tags: '{"<tag-namespace>": {"<first-tag-key>":","<first-tag-value>","<second-tag-key>":"<second-tag-value>"...}}'

Beispiel:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: my-snapclass
driver: blockvolume.csi.oraclecloud.com
parameters:
  backupType: full
  oci.oraclecloud.com/freeform-tags: '{"<first-tag-key>":","<first-tag-value>","<second-tag-key>":"<second-tag-value>"...}'
deletionPolicy: Delete

PVC durch Klonen eines vorhandenen Block-Volumes mit dem CSI-Volume-Plug-in erstellen

Ein Kubernetes-Klon ist ein exaktes Duplikat eines vorhandenen persistenten Volumes auf einem Speichersystem. Sie können ein vorhandenes persistentes Volume klonen, um einen neuen Persistent Volume Claim bereitzustellen. Das neue persistente Volume enthält eine Kopie der Daten aus dem persistenten Quell-Volume, ist jedoch unabhängig vom persistenten Quell-Volume. Mit Volume-Klonen können Sie Konfigurationsänderungen schnell testen, ohne dass sich dies auf eine Produktionsumgebung auswirkt. Weitere Informationen zu Kubernetes-Klonen finden Sie unter CSI-Volume-Klonen in der Kubernetes-Dokumentation.

Im Block-Volume-Service können Sie ein Block-Volume klonen, um ein neues Block-Volume zu erstellen, das vorab mit Daten aus dem Quellblock-Volume aufgefüllt wird. Weitere Informationen zum Klonen von Block-Volumes im Block Volume Service finden Sie unter Block-Volumes klonen.

Wenn Sie das CSI-Volume-Plug-in verwenden, um Cluster mit Block-Volumes im Block-Volume-Service zu verbinden, können Sie ein neues PVC mit einem neuen Block-Volume bereitstellen, das aus einem vorhandenen Block-Volume geklont wurde, das ein anderes vorhandenes PVC bereitstellt. Um anzugeben, dass das CSI-Volume-Plug-in das vorhandene Block-Volume für das neue PVC klonen soll, geben Sie das vorhandene PVC als Datenquelle für das neue PVC an.

Das neue PVC kann auf die gleiche Weise wie jedes andere PVC verwendet werden und ist vollständig getrennt von dem vorhandenen PVC, das als Datenquelle angegeben ist. Ebenso sind das neue Block-Volume und das vorhandene Block-Volume, aus dem es geklont wird, völlig separate Ressourcen. Sie können unabhängig voneinander aktualisiert, geklont, Snapshot erstellt und gelöscht werden.

Sobald das Quellblock-Volume geklont und ein neues Block-Volume erstellt wurde (in der Regel innerhalb weniger Sekunden), hat das neue Block-Volume den Status "Verfügbar". Alle in diesem Moment im Quellblock-Volume vorhandenen Daten werden auf das neue Block-Volume kopiert (keine nachfolgenden Änderungen werden kopiert). Die Daten werden jedoch im Hintergrund kopiert, was je nach Größe des Block-Volumes bis zu dreißig Minuten dauern kann (Beispiel: Das Kopieren eines Block-Volumes mit 1 TB kann bis zu fünfzehn Minuten dauern). Um Fehler oder Datenbeschädigungen zu vermeiden, hat das neue PVC den Status "Ausstehend", bis alle Daten kopiert wurden. Wenn alle Daten kopiert wurden, ist das neue PVC an das vom neuen Block-Volume bereitgestellte PV gebunden, und das neue PVC hat den Status "Verfügbar".

Vor dem Provisioning eines neuen Persistent Volume Claims müssen mehrere Voraussetzungen erfüllt sein, indem das Block-Volume geklont wird, das bereits einen vorhandenen Persistent Volume Claim bereitstellt. Siehe Voraussetzungen für das Klonen eines vorhandenen Block-Volumes zum Provisioning eines neuen PVCs.

Beachten Sie Folgendes, wenn Sie ein Block-Volume klonen, um ein neues PVC bereitzustellen:

  • Das CSI-Volume-Plug-in erstellt das neue Block-Volume in derselben Availability-Domain, Region und demselben Mandanten wie das Quellblock-Volume.
  • Das vom CSI-Volume-Plug-in erstellte neue Block-Volume kann selbst geklont werden, sobald es den Status "Verfügbar" aufweist.
  • Topologieanforderungen in einer Volume-Erstellungsanforderung werden ignoriert. Beispiel: Wenn das CSI-Volume-Plug-in ein Block-Volume für einen Pod klont, der einen persistenten Volume Claim verwendet, wird das neue Block-Volume in derselben Availability-Domain wie der Worker-Knoten erstellt, auf dem der Pod ausgeführt wird.
  • Sie können das CSI-Volume-Plug-in nicht zum Klonen von Block-Volumes verwenden, die mit dem Volume-Plug-in FlexVolume erstellt wurden.
  • Sie können den Quell-PVC nicht löschen, während das Klonen ausgeführt wird. Ebenso können Sie ein Quellblock-Volume nicht löschen, während Daten in ein Block-Volume kopiert werden, das von ihm geklont wurde.
  • Namespace-übergreifendes Klonen wird nicht unterstützt. Das neue PVC und das Quell-PVC müssen sich beide im selben Namespace befinden.
  • Sie müssen keine Speicherklasse für den neuen PVC explizit angeben. Wenn Sie explizit eine Speicherklasse für das neue PVC angeben, kann sich die angegebene Speicherklasse von der für das Quell-PVC angegebenen Speicherklasse unterscheiden. Wenn Sie keine Speicherklasse für den neuen PVC angeben, wird die Standardspeicherklasse verwendet.

Voraussetzungen für das Klonen eines vorhandenen Block-Volumes zum Provisioning eines neuen PVCs

So stellen Sie einen neuen Persistent Volume Claim bereit, indem Sie das Block-Volume klonen, das bereits einen vorhandenen Persistent Volume Claim bereitstellt:

  • Auf den Control-Plane-Knoten des Clusters muss Kubernetes Version 1.25 oder höher ausgeführt werden.
  • Die Worker-Knoten des Clusters müssen x86-basierte oder ARM-basierte Prozessor-Compute-Ausprägungen verwenden.
  • Auf den Worker-Knoten des Clusters muss Oracle Linux 7, Oracle Linux 8 oder Ubuntu ausgeführt werden.
  • Das vorhandene PVC, das Sie als Datenquelle für das neue PVC angeben, muss:
    • Sie sind bereits an eine PV gebunden, die von einem Block-Volume bereitgestellt wird.
    • Sie haben den Status "Verfügbar".
  • Das neue Block-Volume muss dieselbe Größe haben oder größer als das Quellblock-Volume sein, von dem es geklont wird. Wenn Sie einen Speicherwert für den neuen PVC angeben, der größer als das Quellblock-Volume ist, wird die Größe des neuen Block-Volumes entsprechend festgelegt. Sie können keinen Speicherwert für den neuen PVC angeben, der kleiner als das zu klonende Block-Volume oder kleiner als der Speicherwert des Quell-PVC ist.
  • Der für das neue Block-Volume angegebene Dateisystemtyp muss mit dem Dateisystemtyp des Quellblock-Volumes identisch sein, aus dem es geklont wird (siehe Dateisystemtypen für Block-Volumes angeben).

Vorhandenes Block-Volume klonen, um ein neues PVC bereitzustellen

Um einen neuen Persistent Volume Claim durch Klonen des Block-Volumes bereitzustellen, das bereits einen vorhandenen Persistent Volume Claim bereitstellt, geben Sie den vorhandenen Persistent Volume Claim als dataSource des neuen Persistent Volume Claims an.

Beispiel: Sie definieren einen persistenten Volume Claim namens my-clone-pvc in einer Datei namens csi-myclonepvc.yaml. Der Persistent Volume Claim "my-clone-pvc" wird von einem Block-Volume bereitgestellt, das durch Klonen des Block-Volumes erstellt wird, das den Persistent Volume-Claim "my-source-pvc" bereitstellt:

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

Erstellen Sie den Persistent Volume Claim:

kubectl create -f csi-myclonepvc.yaml

Sie können den Persistent Volume Claim beim Definieren anderer Objekte, wie Pods, verwenden. Beispiel: Die folgende Poddefinition weist das System an, den Persistent Volume Claim "my-clone-pvc" als nginx-Volume zu verwenden, das vom Pod bei /sample-volume gemountet ist.

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: sample-nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sample-volume
  volumes:
  - name: sample-volume
    persistentVolumeClaim:
      claimName: my-clone-pvc

Nachdem der neue Pod erstellt wurde, ist der Persistent Volume Claim "my-clone-pvc" an ein neues Persistent Volume gebunden, das von einem Block-Volume bereitgestellt wird, das aus dem Block-Volume geklont wurde, das den Persistent Volume Claim "my-source-pvc" bereitstellt.

Geklonte Block-Volumes taggen

Wenn Sie mit dem CSI-Volume-Plug-in ein persistentes Volume durch Klonen eines Block-Volumes bereitstellen, das einen anderen persistenten Volume-Claim bereitstellt, werden dieselben Freiformtags und definierten Tags, die auf das Quellblock-Volume angewendet wurden, auch auf das neue Block-Volume angewendet. Das CSI-Volume-Plug-in wendet keine zusätzlichen Tags auf das neue Block-Volume an.

PVC aus einem vorhandenen Block-Volume oder Backup mit dem Volume-Plug-in FlexVolume erstellen

Sie können einen PVC aus einem vorhandenen Block-Volume oder einem Block-Volume-Backup zur Verwendung durch das Volume-Plug-in FlexVolume erstellen. Beispiel: Der Clusteradministrator hat ein Block-Volume-Backup erstellt, das Sie beim Provisioning eines neuen Persistent Volume Claims verwenden können. Ein solches Block-Volume-Backup kann Daten enthalten, die von anderen Objekten wie Pods verwendet werden können.

Sie definieren einen PVC in einer Datei namens flex-pvcfrombackup.yaml. Mit dem Annotationselement volume.beta.kubernetes.io/oci-volume-source geben Sie die Quelle des Block-Volumes an, die beim Provisioning eines neuen Persistent Volume Claims mit dem FlexVolume-Plug-in verwendet werden soll. Sie können die OCID eines Block-Volumes oder eines Block-Volume-Backups als Wert der Annotation angeben. In diesem Beispiel geben Sie die OCID des vom Clusteradministrator erstellten Block-Volume-Backups an. Beispiel:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myvolume
  annotations:
    volume.beta.kubernetes.io/oci-volume-source: ocid1.volumebackup.oc1.iad.abuw...
spec:
  selector:
    matchLabels:
      topology.kubernetes.io/zone: US-ASHBURN-AD-1
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Beachten Sie, dass die Datei flex-pvcfrombackup.yaml das Element matchLabels enthält, das nur mit dem FlexVolume-Volume-Plug-in verwendet werden darf.

Geben Sie den folgenden Befehl ein, um den PVC aus der flex-pvcfrombackup.yaml-Datei zu erstellen:

kubectl create -f flex-pvcfrombackup.yaml

Die Ausgabe des obigen Befehls bestätigt die Erstellung des PVC:

persistentvolumeclaim "myvolume" created

Prüfen Sie, ob der PVC erstellt wurde und an ein neues, aus dem Volume-Backup erstelltes Persistent Volume gebunden ist, indem Sie Folgendes eingeben:

kubectl get pvc

Die Ausgabe des obigen Befehls zeigt den aktuellen Status des PVC an:

			
NAME           STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS   AGE
myvolume       Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci            4m

Sie können das neue Persistent Volume, das aus dem Volume-Backup erstellt wurde, beim Definieren anderer Objekte, wie Pods, verwenden. Beispiel: Die folgende Poddefinition weist das System an, den myvolume-PVC als nginx-Volume zu verwenden, das vom Pod bei /data gemountet ist.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: myvolume

Nach Erstellen des neuen Pods können Sie prüfen, ob er ausgeführt wird und den neuen Persistent Volume Claim verwendet, indem Sie Folgendes eingeben:

kubectl describe pod nginx
Hinweis

Im Beispiel FlexVolume in diesem Thema fordert der PVC-Speicher in einer Availability-Domain in der Region Ashburn mit dem Label topology.kubernetes.io/zone an. Weitere Informationen zur Verwendung dieses Labels (und zur Angabe der gekürzten Versionen von Availability-Domainnamen) finden Sie unter topology.kubernetes.io/zone.

Data At Rest und Data In Transit mit dem Block Volume Service verschlüsseln

Der Oracle Cloud Infrastructure Block Volume Service verschlüsselt immer alle Block-Volumes und Volume-Backups im Ruhezustand mit dem Advanced Encryption Standard-(AES-)Algorithmus und 256-Bit-Verschlüsselung. Standardmäßig werden alle Volumes und ihre Backups mit den von Oracle bereitgestellten Verschlüsselungsschlüsseln verschlüsselt. Jedes Mal, wenn ein Volume aus einem Backup geklont oder wiederhergestellt wird, wird dem Volume ein neuer eindeutiger Verschlüsselungsschlüssel zugewiesen.

Sie können alle Volumes und ihre Backups mit den Schlüsseln verschlüsseln, deren Eigentümer Sie sind, und die Sie mit dem Vault-Service verwalten. Weitere Informationen finden Sie unter Key Management. Wenn Sie kein Volume für die Verwendung des Vault-Service konfigurieren oder später die Zuweisung eines Schlüssels zu dem Volume aufheben, verwendet der Block Volume-Service stattdessen den von Oracle bereitgestellten Verschlüsselungsschlüssel. Das gilt sowohl für die Verschlüsselung im Ruhezustand als auch für die paravirtualisierte Verschlüsselung während der Übertragung.

Sämtliche Daten werden beim Verschieben zwischen der Instanz und dem Block-Volume über ein internes und besonders sicheres Netzwerk übertragen. Wenn Daten bei der Übertragung zwischen der Instanz und dem Block-Volume aufgrund spezieller Complianceanforderungen verschlüsselt werden müssen, bietet der Block Volume Service die Option zur Aktivierung der Verschlüsselung während der Übertragung für paravirtualisierte Volume-Anhänge auf VM-Instanzen (virtuellen Maschine). Einige Bare-Metal-Ausprägungen unterstützen die Verschlüsselung während der Übertragung für die über iSCSI angehängten Block-Volumes der Instanz.

Weitere Informationen zur Block-Volume-Verschlüsselung und zur Unterstützung der Verschlüsselung während der Übertragung finden Sie unter Block-Volume-Verschlüsselung.

Wenn Kubernetes-PVCs vom Block Volume-Service unterstützt werden, wählen Sie, wie Block-Volumes verschlüsselt werden, indem Sie Folgendes angeben:

  • Der zu verwendende Masterverschlüsselungsschlüssel, indem die Eigenschaft kms-key-id in der Definition der Kubernetes-Speicherklasse festgelegt wird. Sie können die OCID eines Masterverschlüsselungsschlüssels im Vault-Service angeben.
  • Wie das Block-Volume an die Compute-Instanz angehängt wird, indem Sie die Eigenschaft attachment-type in der Definition der Kubernetes-Speicherklasse auf iscsi oder paravirtualized setzen.
  • Ob die Verschlüsselung während der Übertragung für jeden Knotenpool in einem Cluster aktiviert ist, indem die Eigenschaft isPvEncryptionInTransitEnabled des Knotenpools festgelegt wird (mit der CLI, der API oder der Option Verschlüsselung während der Übertragung verwenden: des Knotenpools in der Konsole).

Die Interaktion der von Ihnen angegebenen Einstellungen bestimmt, wie Block-Volumes verschlüsselt werden, wie in der Tabelle dargestellt:

Eigenschaft isPvEncryptionInTransitEnabled des Knotenpools festgelegt auf: Speicherungseigenschaft class kms-key-id festgelegt auf: Eigenschaft attachment-type der Speicherklasse festgelegt auf Werden Daten im Rest verschlüsselt? Werden Daten während der Übertragung verschlüsselt? Hinweise
true OCID eines Schlüssels in Vault paravirtualized Ja (vom Benutzer verwalteter Schlüssel) Ja (vom Benutzer verwalteter Schlüssel)
true OCID eines Schlüssels in Vault iscsi Fehler Fehler Die PV kann nicht bereitgestellt werden, da die Eigenschaft attachment-type auf paravirtualized gesetzt werden muss, wenn isPvEncryptionInTransitEnabled auf True gesetzt ist.
true nicht festgelegt paravirtualized Ja (von Oracle verwalteter Schlüssel) Ja (von Oracle verwalteter Schlüssel)
true nicht festgelegt iscsi Fehler Fehler Die PV kann nicht bereitgestellt werden, da die Eigenschaft attachment-type auf paravirtualized gesetzt werden muss, wenn isPvEncryptionInTransitEnabled auf True gesetzt ist.
false OCID eines Schlüssels in Vault paravirtualized Ja (vom Benutzer verwalteter Schlüssel) Nein
false OCID eines Schlüssels in Vault iscsi Ja (vom Benutzer verwalteter Schlüssel) Nein
false nicht festgelegt paravirtualized Ja (von Oracle verwalteter Schlüssel) Nein
false nicht festgelegt iscsi Ja (von Oracle verwalteter Schlüssel) Nein

Bevor Sie ein Cluster erstellen können, für das Sie den Masterverschlüsselungsschlüssel selbst verwalten möchten, müssen Sie folgende Schritte ausführen:

Weitere Informationen zur Schlüsselrotation im Vault-Service finden Sie unter Vault-Schlüssel rotieren.

Beispiel: Konfigurieren einer Speicherklasse, um die Verschlüsselung im Ruhezustand und während der Übertragung mit dem von Oracle verwalteten Standardschlüssel zu aktivieren

Um einen PVC auf einem Block-Volume mit einem von Oracle verwalteten Masterverschlüsselungsschlüssel bereitzustellen, um Daten im Ruhezustand (und optional während der Übertragung) zu verschlüsseln, definieren Sie eine Speicherklasse, und legen Sie Folgendes fest:

  • provisioner: bis blockvolume.csi.oraclecloud.com
  • attachment-type bis paravirtualized

Beispiel:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bv-encrypted-storage-class
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  attachment-type: "paravirtualized"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

Anschließend können Sie einen PVC erstellen, der von der erstellten Speicherklasse bereitgestellt wird.

Nachdem Sie die Speicherklasse definiert und das PVC erstellt haben, setzen Sie die Eigenschaft isPvEncryptionInTransitEnabled jedes Knotenpools auf true (mit der CLI, der API oder der Option Verschlüsselung bei Übertragung verwenden: des Knotenpools in der Konsole). Beachten Sie, dass die Verschlüsselung von Daten während der Übertragung nur in einigen Situationen unterstützt wird (siehe Data At Rest und Data In Transit mit dem Block Volume Service verschlüsseln).

Beispiel: Konfigurieren einer Speicherklasse zur Aktivierung der Verschlüsselung im Ruhezustand und während der Übertragung mit einem von Ihnen verwalteten Schlüssel

Um einen PVC auf einem Block-Volume mit einem von Ihnen verwalteten Masterverschlüsselungsschlüssel bereitzustellen, um Daten im Ruhezustand (und optional während der Übertragung) zu verschlüsseln, müssen Sie:

Nachdem Sie einen geeigneten Masterverschlüsselungsschlüssel und eine geeignete Masterverschlüsselungs-Policy erstellt haben, definieren Sie eine Speicherklasse, und legen Sie Folgendes fest:

  • provisioner: bis blockvolume.csi.oraclecloud.com
  • attachment-type bis paravirtualized
  • kms-key-id zur OCID des Masterverschlüsselungsschlüssels im Vault-Service, mit dem Sie Daten verschlüsseln möchten

Beispiel:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bv-user-encrypted-storage-class
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  attachment-type: "paravirtualized"
  kms-key-id: "ocid1.key.oc1.iad.anntl______usjh"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

Anschließend können Sie einen PVC erstellen, der von der erstellten Speicherklasse bereitgestellt wird.

Nachdem Sie die Speicherklasse definiert und das PVC erstellt haben, setzen Sie die Eigenschaft isPvEncryptionInTransitEnabled jedes Knotenpools auf true (mit der CLI, der API oder der Option Verschlüsselung bei Übertragung verwenden: des Knotenpools in der Konsole). Beachten Sie, dass die Verschlüsselung von Daten während der Übertragung nur in einigen Situationen unterstützt wird (siehe Data At Rest und Data In Transit mit dem Block Volume Service verschlüsseln).

Block Volume erweitern

Wenn ein PVC mit dem CSI-Volume-Plug-in (provisioner: blockvolume.csi.oraclecloud.com) erstellt wird, können Sie die Volume-Größe online erweitern. Dadurch können Sie Anwendungen zunächst mit einer bestimmten Speichermenge bereitstellen und anschließend den verfügbaren Speicher ohne Ausfallzeiten erhöhen.

Wenn Sie Erhöhungen von Speicheranforderungen unterstützen möchten, legen Sie allowVolumeExpansion: true in der Definition der Speicherklasse fest, die Sie für den PVC angeben. Beispiel:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: my-bv
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  attachment-type: "paravirtualized"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

Die Standardspeicherklasse oci-bv für das CSI-Volume-Plug-in hat standardmäßig allowVolumeExpansion: true.

Um die Größe eines Volumes zu erweitern, bearbeiten Sie das PVC-Manifest, aktualisieren Sie die Volume-Größe, und wenden Sie das Manifest an. Wenn der Datenträger das nächste Mal neu gescannt wird, damit das Betriebssystem die erweiterte Volume-Größe identifizieren kann (was einige Minuten dauern kann), wird der erhöhte Speicher automatisch für Pods mit dem PVC verfügbar. Die Pods müssen nicht neu gestartet werden.

Geben Sie den folgenden Befehl ein, um zu bestätigen, dass PVC an ein neu vergrößertes Block-Volume gebunden wurde:

kubectl get pvc <pvc_name> -o yaml

Beachten Sie Folgendes:

  • Die Volume-Erweiterung wird in Clustern unterstützt, auf denen Kubernetes 1.19 oder höher ausgeführt wird.
  • Die Standardspeicherklasse oci-bv für das CSI-Volume-Plug-in wird mit allowVolumeExpansion: true in Clustern konfiguriert, auf denen Kubernetes 1.19 oder höher ausgeführt wird. Definitionen von oci-bv-Speicherklassen in vorhandenen Clustern, auf denen Kubernetes 1.19 oder höher ausgeführt wird, werden automatisch bearbeitet und setzen allowVolumeExpansion: true.
  • Sie können die Größe eines Block-Volumes nicht reduzieren. Sie können nur einen größeren Wert als die aktuelle Größe des Block-Volumes angeben. Wenn Sie ein PVC-Manifest aktualisieren, um weniger Speicher als zuvor angefordert anzufordern, verläuft die Speicheranforderung nicht erfolgreich.
  • Weitere Informationen zum Erhöhen der Block-Volume-Größen im Block-Volume Service finden Sie unter Volumes skalieren. Beachten Sie insbesondere die Empfehlung, ein Backup zu erstellen, bevor Sie die Größe eines Block-Volumes ändern.

Beispiel: Konfigurieren einer Speicherklasse zur Aktivierung der Block-Volume-Erweiterung

Bearbeiten Sie das Manifest eines PVC, das von der Speicherklasse oci-bv bereitgestellt wird, und fügen Sie eine Speicheranforderung hinzu. Beispiel: Sie können storage: 100Gi anfänglich so einstellen, dass 100 GB Speicher für das PVC in einer Datei namens csi-bvs-PVC-exp.yaml angefordert werden:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: my-pvc
spec:
 storageClassName: oci-bv
 resources:
  requests:
    storage: 100Gi
 volumeName: pvc-bv1

Geben Sie den folgenden Befehl ein, um den PVC aus der csi-bvs-PVC-exp.yaml-Datei zu erstellen:

kubectl apply -f csi-bvs-pvc-exp.yaml

Anschließend können Sie feststellen, dass Sie die Menge an Speicher für das PVC erhöhen müssen. Beispiel: Sie können das Manifest ändern und storage: 200Gi festlegen:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: my-pvc
spec:
 storageClassName: oci-bv
 resources:
  requests:
    storage: 200Gi
 volumeName: pvc-bv1

Nachdem Sie das Manifest angewendet haben, wird das PV, das das PVC bereitstellt, auf 200 GB erhöht. Das Manifestupdate löst den Block-Volume-Service aus, um die Größe des vorhandenen Block-Volumes auf 200 GB zu erhöhen. Wenn die Festplatte das nächste Mal neu gescannt wird (was einige Minuten dauern kann), wird der erhöhte Speicher automatisch für Pods mit dem PVC verfügbar.

Block-Volume-Performance angeben

Block-Volumes im Block-Volume-Service können entsprechend den erwarteten Workload-I/O-Anforderungen für verschiedene Performanceebenen konfiguriert werden. Die Block-Volume-Performance wird in Volume-Performanceeinheiten (Volume Performance Units, VPUs) ausgedrückt. Es stehen eine Reihe von Leistungsstufen zur Verfügung, darunter:

  • Niedrigere Kosten (0 VPUs)
  • Ausgeglichen (10 VPUs)
  • Höhere Performance (20 VPUs)
  • Äußerst hohe Performance (zwischen 30 VPUs und 120 VPUs)

Standardmäßig werden Block-Volumes für die Performanceebene Ausgeglichen (10 VPUs) konfiguriert. Weitere Informationen zu den verschiedenen Block-Volume-Performanceebenen finden Sie unter Block-Volume-Performanceebenen.

Wenn Sie einen PVC mit dem CSI-Volume-Plug-in (provisioner: blockvolume.csi.oraclecloud.com) definieren, können Sie in der Speicherklassendefinition eine andere Block-Volume-Performanceebene angeben, die für die erwartete Workload geeignet ist.

Beachten Sie, dass Sie die Performanceebene eines Block-Volumes, das PVC unterstützt, nachträglich nicht ändern können. Stattdessen müssen Sie eine neue Speicherklasse definieren, die Performanceebene nach Bedarf festlegen und ein neues PVC erstellen, das von dieser neuen Speicherklasse bereitgestellt wird.

Erstellen von PVCs mit niedrigeren Kosten (0 VPUs), ausgeglichenem (10 VPUs) und höherer Performance (20 VPUs)

Um einen PVC zu erstellen, der von einem Block-Volume mit einer Performanceebene Niedrigere Kosten, Ausgeglichen oder Höhere Performance unterstützt wird, legen Sie vpusPerGB in der Speicherklassendefinition wie folgt fest:

  • für eine Performanceebene Niedrigere Kosten, legen Sie vpusPerGB: "0" fest
  • Legen Sie für eine ausgeglichene Performanceebene vpusPerGB: "10" fest
  • für eine Performanceebene Höhere Performance legen Sie vpusPerGB: "20" fest

Beispiel:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: oci-high
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  vpusPerGB: "20"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

Der Wert von vpusPerGB muss "0", "10" oder "20" sein. Andere Werte werden nicht unterstützt.

Erstellen Sie ein Manifest für ein PVC, das von der Speicherklasse oci-high bereitgestellt wird, und fügen Sie eine Speicheranforderung hinzu. Beispiel: In einer Datei mit dem Namen csi-bvs-pvc-perf.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: oci-pvc-high
spec:
  storageClassName: oci-high
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Geben Sie den folgenden Befehl ein, um den PVC aus der csi-bvs-PVC-perf.yaml-Datei zu erstellen:

kubectl apply -f csi-bvs-pvc-perf.yaml

Nachdem Sie den PVC erstellt haben, können Sie ihn beim Erstellen anderer Objekte, wie Pods, verwenden. Beispiel: Sie können einen neuen Pod aus der folgenden Poddefinition erstellen, die das System anweist, den oci-pvc-high-PVC zu verwenden:

apiVersion: v1
kind: Pod
metadata:
  name: pod-high
spec:
  containers:
    - name: app
      image: busybox:latest
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: oci-pvc-high

Wenn Sie den Pod erstellen, wird im Block-Volume-Service ein neues Block-Volume erstellt, um das PVC zu unterstützen. Das neue Block-Volume weist die Performanceebene auf, die Sie in der Speicherklassendefinition oci-high angegeben haben.

PVCs mit extrem hoher Leistung (30 bis 120 VPUs) erstellen

Um einen PVC zu erstellen, der von einem Block-Volume mit einer Äußerst hohen Performance-Ebene unterstützt wird, müssen Sie eine Reihe von Schritten ausführen. Die Schritte werden in diesem Abschnitt ausführlich beschrieben. Zusammenfassend müssen Sie jedoch Folgendes tun:

  • Erstellen Sie einen Knotenpool mit Worker-Knoten einer unterstützten Ausprägung.
  • Wenn Sie ein Block-Volume als iSCSI-Anhang an Compute-Instanzen anhängen, installieren und aktivieren Sie das Block-Volume-Management-Plug-in auf den Instanzen, auf denen die Worker-Knoten gehostet werden.
  • Erstellen Sie eine Speicherklassendefinition, und legen Sie vpusPerGB in der Speicherklassendefinition auf einen Wert zwischen 30 und 120 fest.
  • Erstellen Sie ein PVC, das von der Speicherklasse bereitgestellt wird, und stellen Sie eine Speicheranforderung bereit.

Nachdem Sie einen geeigneten PVC erstellt haben, können Sie einen Pod definieren, der ein Block-Volume mit Äußerst hoher Performance verwendet, und den Pod auf einem Knoten planen, der Block-Volumes mit Äußerst hoher Performance unterstützt.

Um Äußerst hohe Performancemerkmale anzubieten, müssen Äußerst leistungsstarke Block-Volumes mit einem Multipath-fähigen Anhang an Compute-Instanzen angehängt werden, die Worker-Knoten hosten. Allerdings wird nur das erste Block-Volume mit Äußerst hoher Performance, das an eine Instanz angehängt ist, mit einem Multipath-fähigen Anhang angehängt. Daher weist nur das erste Äußerst hohe Performance-Block-Volume, das an eine Instanz angehängt ist, die Eigenschaften Äußerst hohe Performance auf.

Wenn Sie mehr als ein Block-Volume mit Äußerst hoher Performance in einem Cluster verwenden möchten, erstellen Sie die gleiche Anzahl von Knoten, die Äußerst hohe Performance-Block-Volumes unterstützen, wie Äußerst hohe Performance-Block-Volumes.

So erstellen Sie einen PVC, der von einem Block-Volume mit einer Äußerst hohen Performance-Ebene unterstützt wird:

  1. Befolgen Sie die Anweisungen zum Erstellen eines Knotenpools (siehe Verwalteten Knotenpool erstellen), und geben Sie Folgendes an:
    1. Geben Sie eine Bare-Metal-(BM-) oder Virtual-Machine-(VM-)Ausprägung an, die sowohl von der Kubernetes-Engine unterstützt wird als auch die Ebene Äußerst hohe Performance unterstützt.

      Beachten Sie, dass Äußerst leistungsstarke Block-Volumes Ausprägungen erfordern, die Multipath-fähige Anhänge unterstützen. Wenn Sie das Block-Volume als paravirtualisierten Anhang an die Compute-Instanzen anhängen möchten, die Worker-Knoten im Knotenpool hosten, verwenden Sie VM.Standard.E4. Die flexible Ausprägung ist die einzige unterstützte Ausprägung.

      Siehe:

    2. Geben Sie ein Label an, das allen Worker-Knoten im Knotenpool hinzugefügt werden soll, um anzugeben, dass die Worker-Knoten die Ebene Äußerst hohe Performance unterstützen. Beispiel: uhp: supported
  2. Wenn Sie ein Äußerst leistungsstarkes Block-Volume als iSCSI-Anhang an die Compute-Instanzen anhängen möchten, die Worker-Knoten im Knotenpool hosten, installieren und aktivieren Sie das Block-Volume-Management-Plug-in auf den Instanzen.

    Es gibt verschiedene Möglichkeiten, das Block Volume Management-Plug-in zu installieren und zu aktivieren, wie die Konsole oder die CLI. Alternativ können Sie das Block Volume Management-Plug-in installieren und aktivieren, indem Sie ein benutzerdefiniertes cloud-init-Skript wie das Folgende angeben:

    #!/bin/bash
    curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
    bash /var/run/oke-init.sh
    
    echo "Installing oci cli package"
    
    sudo yum install -y python36-oci-cli
    echo "Completed oci cli package"
    
    instance_id=$(curl -H "Authorization: Bearer Oracle" -L http://169.254.169.254/opc/v2/instance/id)
    
    echo "Instance Id : $instance_id"
    
    echo "Updating compute instance agent config."
    
    oci compute instance update --instance-id $instance_id --force --agent-config '{
        "is-agent-disabled": false,
        "plugins-config": [
            {"name": "Block Volume Management", "desiredState": "ENABLED" }
        ]
    }' --auth instance_principal
    
    echo "Update completed for instance agent config."
    

    Beachten Sie Folgendes, wenn Sie das Plug-in zur Block-Volume-Verwaltung installieren und aktivieren:

    • Das Block-Volume-Management-Plug-in muss eine Verbindung zu Oracle-Services herstellen können, entweder weil die Compute-Instanz über eine öffentliche IP-Adresse verfügt oder weil das VCN über ein Servicegateway verfügt.
    • Berechtigungen müssen konfiguriert werden, damit das Block-Volume-Management-Plug-in die iSCSI-Setupergebnisse für Multipath-fähige iSCSI-Anhänge melden kann.

    Weitere Informationen:

  3. Erstellen Sie eine Speicherklassendefinition für Block-Volumes mit einer Performanceebene Äußerst hohe Performance, und legen Sie in der Speicherklassendefinition vpusPerGB auf einen Wert zwischen 30 und 120 fest.

    Beispiel:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: oci-uhp-sc
    provisioner: blockvolume.csi.oraclecloud.com
    parameters:
      vpusPerGB: "30"
      attachment-type: "iscsi"
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
  4. Erstellen Sie wie folgt einen PVC, der von der gerade erstellten Speicherklasse bereitgestellt wird, und fügen Sie eine Speicheranforderung hinzu:

    1. Erstellen Sie ein Manifest für den PVC.

      Beispiel: In einer Datei mit dem Namen csi-bvs-pvc-uhp.yaml:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: uhp-claim
      spec:
        storageClassName: "oci-uhp-sc"
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 50Gi
    2. Erstellen Sie den PVC aus der Manifestdatei.

      Beispiel: Geben Sie Folgendes ein:

      kubectl apply -f csi-bvs-pvc-uhp.yaml

Nachdem Sie den PVC erstellt haben, können Sie ihn beim Erstellen anderer Objekte, wie Pods, verwenden. Beispiel: Sie können einen neuen Pod aus der folgenden Poddefinition erstellen:

apiVersion: v1
kind: Pod
metadata:
  name: pod-uhp
  labels:
    uhp-pod: "true"
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: uhp-pod
            operator: In
            values:
            - "true"
        topologyKey: kubernetes.io/hostname
  containers:
    - name: app
      image: iad.ocir.io/odx-oke/oke-public/busybox:latest
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: uhp-claim
  nodeSelector:
    uhp: supported

In diesem Beispiel haben Sie Folgendes angegeben:

  • Ein Label für den Pod, das angibt, dass ein Block-Volume mit Äußerst hoher Performance verwendet wird. In diesem Beispiel ist uhp-pod: "true"
  • Eine Anti-Affinitätsregel, die das Podlabel verwendet, um sicherzustellen, dass nur ein Pod mit der Block-Volume-Ausführung Äußerst hohe Performance auf einem beliebigen Worker-Knoten ausgeführt wird.
  • Ein Knotenselektor, sodass der Pod nur auf Worker-Knoten mit einem bestimmten Label ausgeführt wird (abgeleitet vom Knotenpoollabel). In diesem Beispiel ist uhp: supported
  • Ein PVC, das von einem Block-Volume mit Äußerst hoher Performance unterstützt wird. In diesem Beispiel ist claimName: uhp-claim

Wenn Sie einen Pod basierend auf der Definition erstellen, wird der Pod auf einem Worker-Knoten ausgeführt, der auf einer Instanz gehostet wird und eine Ausprägung aufweist, die für die Performanceebene Äußerst hohe Performance geeignet ist. Im Block-Volume-Service wird ein neues Block-Volume erstellt, um das PVC zu unterstützen. Das neue Block-Volume weist die Performanceebene Äußerst hohe Performance auf, die Sie in der Speicherklassendefinition angegeben haben.

Dateisystemtypen für Block-Volumes angeben

Block-Volumes im Block-Volume-Service können für verschiedene Dateisystemtypen konfiguriert werden. Das am besten geeignete Dateisystem hängt (unter anderem) von der erwarteten Dateigröße und der Anzahl der zu verarbeitenden Dateien ab. Es stehen verschiedene Dateisystemtypen zur Verfügung, darunter:

  • ext3: Der Dateisystemtyp ext3 umfasst Journaling-Funktionen zur Verbesserung der Zuverlässigkeit und Verfügbarkeit. Konsistenzprüfungen nach einem Stromausfall oder einem unkontrollierten Herunterfahren des Systems sind nicht erforderlich.
  • ext4: Neben den ext3-Features unterstützt der Dateisystemtyp ext4 Extents (zusammenhängende physische Blöcke), Vorabzuweisung, verzögerte Zuweisung, schnellere Dateisystemprüfung, robusteres Journaling und andere Verbesserungen.
  • XFS: Das XFS-Dateisystem ist ein leistungsstarker Journaling-Dateisystemtyp, der eine hohe Skalierbarkeit für I/O-Threads, Dateisystembandbreite, Datei- und Dateisystemgröße bietet, selbst wenn das Dateisystem viele Speichergeräte umfasst.

Die Dateisysteme ext3 und ext4 werden im Allgemeinen als besser geeignet für Anwendungen betrachtet, die einen einzelnen Lese-/Schreib-Thread und kleine Dateien verwenden. Während das XFS-Dateisystem im Allgemeinen als besser geeignet für Anwendungen mit mehreren Lese-/Schreib-Threads und größeren Dateien angesehen wird.

Wenn ein PVC mit dem CSI-Volume-Plug-in (provisioner: blockvolume.csi.oraclecloud.com) erstellt wird, können Sie einen Dateisystemtyp für das Block-Volume angeben, der für die erwartete Workload geeignet ist.

Hinweis

Block-Volumes sind standardmäßig mit einem ext4-Dateisystem konfiguriert. Wenn ein ext4-Dateisystem für die erwartete Workload geeignet ist, müssen Sie den Dateisystemtyp nicht explizit in der Speicherklassendefinition angeben, wie im Rest dieses Themas beschrieben.

Standardmäßig werden Block-Volumes mit einem ext4-Dateisystem konfiguriert. Wenn das Dateisystem ext4 nicht das am besten geeignete Dateisystem für die erwartete Workload ist, können Sie in der Definition der Speicherklasse einen alternativen Dateisystemtyp angeben.

Um einen PVC zu erstellen, der von einem Block-Volume mit einem ext3- oder XFS-Dateisystem unterstützt wird, legen Sie den Parameter fstype in der Definition der benutzerdefinierten Speicherklasse wie folgt fest:

  • Legen Sie für ext3 csi.storage.k8s.io/fstype: ext3 fest
  • für XFS setzen Sie csi.storage.k8s.io/fstype: xfs

Beispiel: So erstellen Sie einen PVC, der von einem Block-Volume mit einem ext3-Dateisystem gesichert wird:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: oci-bv-ext3
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  csi.storage.k8s.io/fstype: ext3
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForConsumer

Erstellen Sie ein Manifest für ein PVC, das von der Speicherklasse oci-bv-ext3 bereitgestellt wird, und fügen Sie eine Speicheranforderung hinzu. Beispiel: In einer Datei mit dem Namen csi-bvs-pvc-fstype.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: oci-bv-claim-ext3
spec:
  storageClassName: oci-bv-ext3
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Geben Sie den folgenden Befehl ein, um den PVC aus der csi-bvs-PVC-fstype.yaml-Datei zu erstellen:

kubectl apply -f csi-bvs-pvc-fstype.yaml

Nachdem Sie den PVC erstellt haben, können Sie ihn beim Erstellen anderer Objekte, wie Pods, verwenden. Beispiel: Sie können einen neuen Pod aus der folgenden Poddefinition erstellen, die das System anweist, den PVC "oci-bv-claim-ext3" als nginx-Volume zu verwenden, das vom Pod bei /data gemountet ist.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: oci-bv-claim-ext3

Nach Erstellen des neuen Pods können Sie prüfen, ob der PVC an ein neues Persistent Volume gebunden wurde, indem Sie Folgendes eingeben:

kubectl get pvc

Die Ausgabe des obigen Befehls bestätigt, dass der PVC gebunden wurde:

			
NAME                    STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS        AGE
oci-bv-claim-ext3       Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci-bv-ext3         4m

Sie können prüfen, ob der Pod den neuen Persistent Volume Claim verwendet, indem Sie Folgendes eingeben:

kubectl describe pod nginx

Beachten Sie, dass Sie das Dateisystem eines Block-Volumes, das PVC unterstützt, nachträglich nicht ändern können. Stattdessen müssen Sie eine neue Speicherklasse definieren, das Dateisystem nach Bedarf einstellen und ein neues PVC erstellen, das von dieser neuen Speicherklasse bereitgestellt wird.

Raw-Block-Volumes angeben

Wenn Sie das CSI-Volume-Plug-in (provisioner: blockvolume.csi.oraclecloud.com ) verwenden, um Cluster mit Block-Volumes im Block-Volume-Service zu verbinden, können Sie ein PVC an ein PV binden, das von einem Block-Volume bereitgestellt wird, das als Raw-Block-Volume konfiguriert ist. Wenn ein Block-Volume als Raw-Block-Volume und nicht als gemountetes Dateisystem konfiguriert wurde, wird ein von diesem Block-Volume bereitgestelltes PV als Block-Device für die Container angezeigt, die in einem Cluster ausgeführt werden. Dadurch können Anwendungen, die im Container ausgeführt werden, als Block-Device auf das angehängte Block-Volume zugreifen, ohne dass der Performance-Overhead durch den Zugriff auf das Device über ein Dateisystem verursacht wird. Dieser Overhead kann besonders für leistungsabhängige Anwendungen (wie Datenbanken) von Bedeutung sein, die vom direkten Zugriff auf Block-Devices profitieren.

Um das Block-Volume zu konfigurieren, das ein PVC als Raw-Block-Volume unterstützt, geben Sie volumeMode: Block im PVC-Manifest an. Wenn keine Angabe gemacht wird, wird volumeMode: Filesystem angenommen, und Block-Volumes werden standardmäßig mit einem ext4-Dateisystem konfiguriert.

Beispiel: Erstellen Sie ein Manifest für ein PVC, das von der Speicherklasse oci-bv bereitgestellt wird, nehmen Sie eine Speicheranforderung auf, und geben Sie volumeMode: Block im Manifest an. Beispiel: In einer Datei mit dem Namen csi-bvs-pvc-raw.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-raw-block-volume
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
  storageClassName: oci-bv
  volumeMode: Block

Geben Sie den folgenden Befehl ein, um den PVC aus der csi-bvs-PVC-raw.yaml-Datei zu erstellen:

kubectl apply -f csi-bvs-pvc-raw.yaml

Nachdem Sie den PVC erstellt haben, können Sie ihn beim Erstellen anderer Objekte, wie Pods, verwenden. Beispiel: Sie können einen neuen Pod aus der folgenden Poddefinition erstellen, der das System anweist, PVC-Raw-Block-Volume als Speicherdatenträger für den Raw-Volume-Testcontainer zu verwenden, auf den der Container unter /dev/block zugreifen kann:

apiVersion: v1
kind: Pod
metadata:
  name: raw-volume-test-pod
spec:
  containers:
  - name: raw-volume-test
    image: centos
    command: ["/bin/sh"]
    volumeDevices:
    - name: raw-volume
      devicePath: /dev/block
  volumes:
  - name: raw-volume
    persistentVolumeClaim:
      claimName: pvc-raw-block-volume

Nach Erstellen des neuen Pods können Sie prüfen, ob der PVC an ein neues Persistent Volume gebunden wurde, indem Sie Folgendes eingeben:

kubectl get pvc

Die Ausgabe des obigen Befehls bestätigt, dass der PVC gebunden wurde:

			
NAME                    STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS        AGE
pvc-raw-block-volume    Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci-bv              4m

Sie können prüfen, ob der Pod den neuen Persistent Volume Claim verwendet, indem Sie Folgendes eingeben:

kubectl describe pod raw-volume-test-pod

Beachten Sie, dass Sie später nicht ändern können, ob das Block-Volume, das ein PVC unterstützt, als Raw-Block-Volume oder als gemountetes Dateisystem konfiguriert ist. Stattdessen müssen Sie ein neues PVC erstellen und volumeMode: entsprechend im PVC-Manifest festlegen.

Hinweis

Beachten Sie, dass Raw-Block-Volumes für Block-Volumes mit extrem hoher Performance nicht unterstützt werden.

Raw Block Volume accessModes auf ReadWriteOnce oder ReadWriteMany setzen

Wenn ein Raw-Block-Volume zu einem bestimmten Zeitpunkt exklusiv von einem einzelnen Pod gemountet werden soll (z.B. wenn der gleichzeitige Zugriff auf dasselbe Volume durch mehrere Pods zu Datenbeschädigung oder Inkonsistenzen führen kann), setzen Sie accessModes im PVC-Manifest als ReadWriteOnce. Der ReadWriteOnce-Modus ist der gängigste und Standardzugriffsmodus.

Wenn mehrere Pods gleichzeitig auf ein Raw-Block-Volume zugreifen sollen (z.B. wenn mehrere auf verschiedenen Knoten ausgeführte Pods gleichzeitigen Zugriff auf denselben Shared Storage benötigen), setzen Sie accessModes im PVC-Manifest auf ReadWriteMany. Beachten Sie, dass Sie dafür verantwortlich sind, geeignete Zugriffskontrollen und Berechtigungen einzurichten, um die Datenintegrität sicherzustellen, wenn Sie ReadWriteMany als Zugriffsmodus angeben.

Beachten Sie Folgendes:

  • Sie können den Zugriffsmodus eines vorhandenen PVCs nicht von ReadWriteOnce in ReadWriteMany aktualisieren. Ebenso können Sie den Zugriffsmodus eines vorhandenen PVCs nicht von ReadWriteMany in ReadWriteOnce aktualisieren.
  • Sie können ReadWriteMany nur als Zugriffsmodus für PVCs angeben, die von Raw-Block-Volumes gesichert werden.