Container Storage Interface (CSI) ist eine standardisierte Schnittstelle für Container-Orchestrierungssysteme wie Kubernetes, die eine nahtlose Integration mit verschiedenen Speichersystemen ermöglicht. CSI abstrahiert die Komplexität der Speicherverwaltung und ermöglicht es Speicheranbietern, ihre Lösungen ohne Änderungen am Kubernetes-Kern zu integrieren, was die Flexibilität und Wartbarkeit des Kubernetes-Ökosystems erheblich verbessert.
Ein CSI-Plugin in Kubernetes besteht aus mehreren Komponenten:
Diese Komponenten werden typischerweise als Container in einem Kubernetes-Cluster bereitgestellt.
CSI erweitert das bestehende Storage-System in Kubernetes:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-example-sc
provisioner: example.csi.k8s.io
parameters:
type: ssd
fsType: ext4
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: trueapiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: csi-example-scapiVersion: v1
kind: Pod
metadata:
name: csi-demo-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- mountPath: /data
name: csi-volume
volumes:
- name: csi-volume
persistentVolumeClaim:
claimName: csi-pvc-exampleKubernetes unterstützt eine Vielzahl von CSI-Plugins, darunter:
Ein CSI-Plugin wird typischerweise mit den folgenden Komponenten bereitgestellt:
Beispiel für ein einfaches CSIDriver-Objekt:
apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
name: example.csi.k8s.io
spec:
attachRequired: true
podInfoOnMount: true
volumeLifecycleModes:
- Persistent
- EphemeralBei Problemen mit CSI-Volumes sollten folgende Bereiche überprüft werden:
In diesem Beispiel wird eine Kubernetes-Umgebung dargestellt, in der
eine StorageClass für das dynamische Volumen-Provisioning
definiert ist. Es wird gezeigt, wie ein PersistentVolume
(PV) und ein PersistentVolumeClaim (PVC) erstellt werden,
um Speicherressourcen zuzuweisen. Ein Pod verwendet diesen Claim, um
einen Speicherbereich an einen Mount-Punkt innerhalb des Containers zu
binden.
Die StorageClass my-local-storage definiert, wie ein
PersistentVolume (PV) bereitgestellt wird. Es wird angegeben, dass kein
automatischer Provisioner für die Bereitstellung des Volumes genutzt
wird (provisioner: kubernetes.io/no-provisioner). Das
Volume wird erst gebunden
(volumeBindingMode: WaitForFirstConsumer), wenn ein Pod,
der es anfordert, tatsächlich instanziiert wird. Die Möglichkeit zur
Erweiterung des Volumes wird durch
allowVolumeExpansion: true gegeben.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: my-local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: truemy-persistent-volume definiert ein PV mit 1 Gi
Speicherplatz. Die Zugriffsmöglichkeit ist auf
ReadWriteOnce gesetzt, was bedeutet, dass das Volume auf
genau einem Node im Read-Write-Modus gemountet werden kann. Durch
hostPath wird ein lokaler Pfad
(/var/tmp/my-data) auf dem Node als Speicherort für das
Volume festgelegt. Die
persistentVolumeReclaimPolicy: Recycle besagt, dass Daten
auf dem Volume beim Löschen des PV nicht dauerhaft gelöscht, sondern für
neue Claims zur Verfügung stehen.
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-persistent-volume
spec:
storageClassName: my-local-storage
persistentVolumeReclaimPolicy: Recycle
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /var/tmp/my-dataDas PVC my-pvc fordert Speicher von der
my-local-storage StorageClass an, mit der
Zugriffsmöglichkeit ReadWriteOnce und einer Größe von 100
Mi. Dieses PVC wird dann verwendet, um Speicheranforderungen für Pods zu
erfüllen.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
storageClassName: my-local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100MiDer Pod my-pv-pod startet einen Container mit dem Image
busybox und führt einen Befehl aus, der eine Nachricht in
eine Datei (/output/erfolg.txt) innerhalb des gemounteten
Volumes schreibt. Der volumeMounts-Abschnitt verbindet das
durch my-pvc definierte PVC mit dem Pfad
/output im Container. Der Pod verwendet Never
als restartPolicy, was bedeutet, dass der Container nicht
automatisch neu gestartet wird, wenn er beendet wird.
apiVersion: v1
kind: Pod
metadata:
name: my-pv-pod
spec:
restartPolicy: Never
containers:
- name: my-busybox
image: busybox
command: ["sh", "-c", "echo Hallo, dies ist ein Persistent Volume Claim Test >> /output/erfolg.txt"]
volumeMounts:
- mountPath: /output
name: my-volume-mount
volumes:
- name: my-volume-mount
persistentVolumeClaim:
claimName: my-pvc