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.
- 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.
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 Speicherklasseoci-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. Dieoci
-Speicherklasse wird vom Volume-Plug-in FlexVolume verwendet.
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:
- 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"}}}'
- 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 ObjektVolumeSnapshotClass
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
- undVolumeSnapshotContent
-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ötigteVolumeSnapshot
- undVolumeSnapshotContent
-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.
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 vonVolumeSnapshot
-Objekten an.parameters.backupType: full
gibt an, dass ein Block-Volume-Backup alle Änderungen seit der Erstellung des Block-Volumes enthält. Geben Sieincremental
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örigeVolumeSnapshot
-Objekt gelöscht wird. Geben SieRetain
an, um ein Block-Volume-Backup beizubehalten, wenn das verknüpfteVolumeSnapshot
-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
volumeSnapshotClassName: my-snapclass
gibtmy-snapclass
als das ObjektVolumeSnapshotClass
an, aus dem Parameter abgerufen werden sollen, die beim Erstellen des Block-Volume-Backups verwendet werden sollen. Beachten Sie, dass SievolumeSnapshotClassName
nicht ändern können, nachdem Sie das ObjektVolumeSnapshot
erstellt haben (Sie müssen ein neuesVolumeSnapshot
-Objekt erstellen).persistentVolumeClaimName: sample-pvc
gibtsample-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 ObjektVolumeSnapshot
erstellt haben (Sie müssen ein neuesVolumeSnapshot
-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
deletionPolicy: Retain
gibt an, was mit einem Block-Volume-Backup geschieht, wenn das zugehörigeVolumeSnapshot
-Objekt gelöscht wird. Geben SieDelete
an, um ein Block-Volume-Backup zu löschen, wenn das zugehörigeVolumeSnapshot
-Objekt gelöscht wird.driver: blockvolume.csi.oraclecloud.com
gibt an, dass das CSI-Volume-Plug-inVolumeSnapshot
-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 entsprechendenVolumeSnapshot
-Objekts an, das aus dem vorhandenen Block-Volume-Backup bereitgestellt werden soll. Dieses Feld ist erforderlich. Beachten Sie, dass das ObjektVolumeSnapshot
nicht vorhanden sein muss, wenn Sie das ObjektVolumeSnapshotContent
erstellen.namespace: default
gibt den Namespace an, der das entsprechendeVolumeSnapshot
-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 desVolumeSnapshot
-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
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 aufiscsi
oderparavirtualized
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:
- Erstellen Sie einen geeigneten Master-Verschlüsselungsschlüssel in Vault (oder rufen Sie die OCID eines solchen Schlüssels ab). Siehe Schlüssel verwalten.
- Erstellen Sie eine Policy, die Zugriff auf den Masterverschlüsselungsschlüssel erteilt. Siehe Policy zum Zugriff auf benutzerverwaltete Verschlüsselungsschlüssel zum Verschlüsseln von Boot-Volumes, Block-Volumes und/oder Dateisystemen erstellen.
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:
bisblockvolume.csi.oraclecloud.com
-
attachment-type
bisparavirtualized
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:
- Erstellen Sie einen geeigneten Master-Verschlüsselungsschlüssel in Vault (oder rufen Sie die OCID eines solchen Schlüssels ab). Siehe Schlüssel verwalten.
- Erstellen Sie eine Policy, die Zugriff auf den Masterverschlüsselungsschlüssel erteilt. Siehe Policy zum Zugriff auf benutzerverwaltete Verschlüsselungsschlüssel zum Verschlüsseln von Boot-Volumes, Block-Volumes und/oder Dateisystemen erstellen.
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:
bisblockvolume.csi.oraclecloud.com
attachment-type
bisparavirtualized
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 mitallowVolumeExpansion: true
in Clustern konfiguriert, auf denen Kubernetes 1.19 oder höher ausgeführt wird. Definitionen vonoci-bv
-Speicherklassen in vorhandenen Clustern, auf denen Kubernetes 1.19 oder höher ausgeführt wird, werden automatisch bearbeitet und setzenallowVolumeExpansion: 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:
- Befolgen Sie die Anweisungen zum Erstellen eines Knotenpools (siehe Verwalteten Knotenpool erstellen), und geben Sie Folgendes an:
- 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:
- Unterstützte Ausprägungen für verwaltete Knoten und virtuelle Knoten für die von der Kubernetes-Engine unterstützten Ausprägungen
- Performancedetails für Instanzausprägungen für die Ausprägungen, die die Ebene Äußerst hohe Performance unterstützen.
- 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
- 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.
- 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:
- Informationen zum Plug-in für Block-Volume-Verwaltung finden Sie unter Plug-in für Block-Volume-Verwaltung aktivieren.
- Informationen zum Schreiben benutzerdefinierter cloud-init-Skripte finden Sie unter Benutzerdefinierte Cloud-init-Initialisierungsskripte zum Einrichten verwalteter Knoten verwenden.
- 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
-
Erstellen Sie wie folgt einen PVC, der von der gerade erstellten Speicherklasse bereitgestellt wird, und fügen Sie eine Speicheranforderung hinzu:
-
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
- 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.
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.
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.
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
inReadWriteMany
aktualisieren. Ebenso können Sie den Zugriffsmodus eines vorhandenen PVCs nicht vonReadWriteMany
inReadWriteOnce
aktualisieren. - Sie können
ReadWriteMany
nur als Zugriffsmodus für PVCs angeben, die von Raw-Block-Volumes gesichert werden.