Ein Kubernetes-Volume ist ein Verzeichnis mit Daten, auf die Container in einem Kubernetes-Pod zugreifen können. Der Speicherort des Verzeichnisses, das unterstützende Speichermedium und sein Inhalt hängen vom jeweiligen Volume-Typ ab.
Prozesse, die in Containern in einem Pod ausgeführt werden, sehen eine Dateisystemansicht, die aus Folgendem besteht:
Volumes werden im Feld .spec.containers[*].volumeMounts der Pod-Vorlage definiert. Für jeden Pod und jedes Container-Image innerhalb des Pods müssen Sie angeben, welche Volumes gemountet werden und auf welchen Pfaden (die Pfade können für jeden Container unterschiedlich sein).
Es gibt verschiedene Volume-Typen in Kubernetes. Die wichtigsten sind flüchtige Volumes, die lokal auf dem Kubernetes-Knoten gespeichert und beim Neustart eines Pods gelöscht werden, und persistente Kubernetes-Volumes (PV), die Daten auch nach dem Herunterfahren eines Pods behalten.
Kubernetes unterstützt verschiedene Volumes, sodass jeder Pod mehrere Volume-Typen gleichzeitig nutzen kann. Ephemere Volumes sind an die Lebensdauer des Pods gebunden, während persistente Volumes über dessen Lebensdauer hinaus bestehen bleiben. Das bedeutet, dass Kubernetes temporäre Volumes vernichtet, sobald der Pod nicht mehr existiert, während die Daten persistenter Volumes erhalten bleiben.
Kubernetes bietet ein Persistent-Volume-Subsystem mit einer API, die die Speicherbereitstellung und -nutzung abstrahiert. Es arbeitet mit zwei API-Ressourcen: PersistentVolume (PV) und PersistentVolumeClaim (PVC).
Ein PV ist eine Speicherressource im Cluster. Administratoren können PVs manuell bereitstellen, und Kubernetes kann StorageClasses verwenden, um PVs dynamisch bereitzustellen. PVs sind wie Volumes Plug-ins, ihr Lebenszyklus ist jedoch unabhängig von den Pods, die das PV verwenden.
Ein PV fungiert als API-Objekt, das die Details der Speicherimplementierung erfasst, einschließlich iSCSI, NFS und Speichersystemen von Cloud-Anbietern. Es funktioniert ähnlich wie ein Knoten, bietet jedoch Speicherressourcen statt Rechenleistung.
Ein PVC ist eine Speicheranforderung eines Benutzers. Es funktioniert ähnlich wie ein Pod, verbraucht jedoch PV-Ressourcen anstelle von Knotenressourcen. Ein PVC kann bestimmte Speicherressourcen anfordern und Zugriffsmodi wie ReadWriteOnce, ReadWriteMany und ReadOnlyMany angeben.
PVCs ermöglichen Benutzern die Nutzung abstrakter Speicherressourcen. Benutzer benötigen jedoch typischerweise PVs mit unterschiedlichen Eigenschaften für unterschiedliche Probleme. Aus diesem Grund müssen Clusteradministratoren häufig verschiedene PVs anbieten, die sich nicht nur in Größe und Zugriffsmodi unterscheiden. Dies ist möglich, ohne Benutzer über StorageClass-Ressourcen mit Implementierungsdetails zu konfrontieren.
Flüchtige Volumes speichern Daten nicht dauerhaft über Neustarts hinweg. Diese Volumes sind an die Lebensdauer des Pods gebunden, d. h. sie werden zusammen mit dem Pod erstellt und gelöscht. Dadurch können Pods gestoppt und neu gestartet werden, ohne dass dies durch die Verfügbarkeit persistenter Volumes eingeschränkt ist.
Temporäre Volumes sind einfach bereitzustellen und zu verwalten. Sie können sie inline in der Pod-Spezifikation angeben. Temporäre Volumes eignen sich ideal für Anwendungen, die keinen dauerhaften Speicher benötigen, wie z. B. Caching-Dienste.
Ein emptyDir-Volume wird erstellt, wenn Kubernetes einem Knoten einen Pod zuweist. Die Lebensdauer dieses Volumes ist an den Lebenszyklus eines Pods auf diesem bestimmten Knoten gebunden. Ein emptyDir-Volume wird neu erstellt, wenn Container neu gestartet werden oder abstürzen. Die Daten in diesem Volume werden jedoch gelöscht und gehen verloren, wenn der Pod vom Knoten entfernt wird, abstürzt oder ausfällt.
Nach dem Erstellen eines emptyDir-Volumes können Sie den Volumetypnamen als Feld in der Pod-Manifestdatei deklarieren. Er wird im Abschnitt Volume-Eigenschaften mit leeren geschweiften Klammern {} als Wert angezeigt. emptyDir-Volumes eignen sich hauptsächlich zur temporären Datenspeicherung. Sie können sie beispielsweise für temporären Speicherplatz verwenden, z. B. für eine datenträgerbasierte Zusammenführung.
Sie können emptyDir-Volumes auf dem Medium speichern, das dem Knoten zugrunde liegt (z. B. Netzwerkspeicher oder SSD). Alternativ können Sie memory im Feld emptyDir.medium angeben. Kubernetes mountet dann ein RAM-gestütztes Dateisystem (tmpfs). Beachten Sie, dass Kubernetes tmpfs beim Neustart des Knotens löscht.
Ein HostPath-Volume mountet ein Verzeichnis oder eine Datei aus dem Dateisystem des Hostknotens in Ihren Pod.
Wichtige Anwendungsfälle für HostPath-Volumes:
/var/lib/docker-HostPath, um einen Container auszuführen, der Zugriff auf Docker-Interna benötigt./sys-HostPath, um cAdvisor in einem Container auszuführen.HostPath-Volumes bergen zahlreiche Sicherheitsrisiken. Vermeiden Sie deren Verwendung, wann immer möglich. Wenn Sie ein HostPath-Volume verwenden müssen, beschränken Sie es auf das erforderliche Verzeichnis oder die erforderliche Datei und mounten Sie es schreibgeschützt.
Wichtige Sicherheitsrisiken:
Mit einer AdmissionPolicy können Sie den HostPath-Zugriff auf bestimmte Verzeichnisse beschränken. Die Richtlinie ist jedoch nur wirksam, wenn Sie für VolumeMounts die Verwendung schreibgeschützter Mounts fordern.
Eine ConfigMap ermöglicht das Einfügen von Konfigurationsdaten in Pods. In einer ConfigMap gespeicherte Daten können in einem ConfigMap-Volume-Typ referenziert und dann von containerisierten Anwendungen genutzt werden, die in einem Pod ausgeführt werden. Beim Verweisen auf eine ConfigMap müssen Sie den Namen der ConfigMap im Volume angeben. Mit Kubernetes können Sie den Pfad für einen bestimmten Eintrag in der ConfigMap anpassen.
Kubernetes bietet mehrere Speicher-Plugins, die Zugriff auf in einem Kubernetes-Cluster bereitgestellte Speichergeräte ermöglichen. Diese werden mithilfe des StorageClass-Objekts implementiert.
Zu den wichtigsten Plugins, die derzeit von Kubernetes unterstützt werden, gehören GCEPersistentDisk, AWSElasticBlockStore, AzureDisk, Glusterfs, NFS und iSCSI.
Lassen Sie uns zwei bemerkenswerte Speicher-Plugins genauer betrachten.
Network File System (NFS) ist ein Standardprotokoll zum Einbinden von Speichergeräten als lokale Laufwerke. Mit Kubernetes können Sie ein NFS-Volume als lokales Laufwerk in einem Container einbinden. Da Legacy-Code häufig über NFS auf Daten zugreift, ist dieses Plugin sehr nützlich für die Migration von Legacy-Workloads zu Kubernetes.
Es gibt zwei Möglichkeiten, über NFS und Kubernetes auf Daten zuzugreifen:
Das Container Storage Interface (CSI) ist eine Standardschnittstelle, die es Container-Orchestratoren ermöglicht, Speichersysteme für von ihnen verwaltete Container verfügbar zu machen. CSI ermöglicht Speicheranbietern die Erstellung von Plug-ins, die „out of tree“ sind. Das bedeutet, dass sie nicht in das Kubernetes-Code-Repository eingecheckt werden müssen und nicht mit Kubernetes ausgeliefert werden.
Es gibt viele Out-of-Tree-Plugins auf Basis von CSI, die direkt von Speicheranbietern angeboten werden. Mit der Einführung von CSI ist die Unterstützung von Kubernetes durch Speichertechnologien deutlich einfacher geworden.
Das Erstellen eines Volumes und das Zugänglichmachen für einen Pod umfasst zwei Schritte:
spec.volumes der Pod-Vorlage und stellen Sie den Pod dann auf einigen Knoten bereit.spec.containers[].volumeMounts.Diese Schritte gehen Hand in Hand. Wenn Sie ein Volume erstellen, müssen Sie es auch in einen Container einbinden. Sie können ein Volume nicht einbinden, ohne es in der Pod-Vorlage zu deklarieren.
Beispiel, das sowohl die Erstellung als auch die Bereitstellung eines Volumes in einer YAML-Konfiguration einer Pod-Vorlage zeigt:
spec: containers: —name: my-app image: nginx volumeMounts: —name: my-volume mountPath: /app/config volumes: —name: my-volume
In diesem Code:
volumes (unten) erstellt ein Volume mit dem Namen my-volume und hängt es an den Pod an.volumeMounts definiert, wie das Volume gemountet wird, einschließlich des Dateipfads, über den das Volume innerhalb des Containers verfügbar ist.volumeMounts.Um ein Kubernetes-Volume zu erstellen, stellen Sie einen oder mehrere Pods bereit, die das Volume deklarieren. Ein gängiger Weg hierfür ist die Verwendung eines Deployment-Objekts.
Hier ist ein Beispiel für ein Deployment-Manifest, das Folgendes bewirkt:
emptyDir-Volume.apiVersion: apps/v1 kind: Deployment metadata: name: pods-with-volumes spec: replicas: 3 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: —name: my-container image: nginx:1.14.2 volumeMounts: —mountPath: / name: my-volume volumes: —name: my-volume emptyDir: {}
Der Name dieser Bereitstellung ist pods-with-volumes. So wird in der Kubernetes-Umgebung darauf verwiesen.
Wie im vorherigen Abschnitt gesehen, führt dieses Deployment-Objekt die beiden zum Erstellen eines Volumes erforderlichen Aktionen aus:
spec.template.spec.volumes deklariert das Volume.spec.template.spec.containers[].volumeMounts mountet das Volume in die Container.Nehmen wir an, diese YAML-Datei ist unter dem Namen my-deployment.yaml gespeichert. Sie können das Deployment in Ihrem Kubernetes-Cluster mit diesem Befehl erstellen:
kubectl apply -f my-deployment.yaml
Um zu überprüfen, ob die Bereitstellung mit den erwarteten Volumes ordnungsgemäß ausgeführt wird, führen Sie diesen Befehl aus:
kubectl describe pods pods-with-volumes
Wenn alles richtig funktioniert hat, zeigt die Ausgabe für jeden Pod einen Container mit dem Namen my-container und dem angeforderten Einhängepunkt:
Mounts: / from my-volume (rw)
Die Ausgabe zeigt auch das unter jedem Pod laufende Volume:
Volumes: my-volume: Type: EmptyDir (a temporary directory that shares a pod's lifetime)
NetApp Cloud Volumes ONTAP, die führende Speicherverwaltungslösung für Unternehmen, bietet sichere und bewährte Speicherverwaltungsdienste auf AWS, Azure und Google Cloud. Die Kapazität von Cloud Volumes ONTAP ist bis in den Petabyte-Bereich skalierbar und unterstützt verschiedene Anwendungsfälle wie Dateidienste, Datenbanken, DevOps oder andere Unternehmens-Workloads mit einem leistungsstarken Funktionsumfang, darunter Hochverfügbarkeit, Datenschutz, Speichereffizienz, Kubernetes-Integration und mehr.
Insbesondere Cloud Volumes ONTAP unterstützt die Bereitstellungs- und Verwaltungsanforderungen von Kubernetes Persistent Volumes für containerisierte Workloads.