Azure Operator Nexus-Speicherappliance
Azure Operator Nexus basiert auf grundlegenden Konstrukten wie Computeservern, Speicherappliances und Netzwerk-Fabric-Geräten. Azure Operator Nexus-Speicherappliances stellen persistente Speicherappliances auf dem Rack dar.
Jede Speicherappliance enthält mehrere Speichergeräte, die aggregiert werden, um einen einzelnen Speicherpool bereitzustellen. Dieser Speicherpool wird dann in mehrere Volumes geschnitzt, die den Computeservern als Blockspeichergeräte angezeigt werden. Die Computeserver können diese Blockspeichergeräte als beständigen Speicher für ihre Workloads verwenden. Jeder Azure Operator Nexus-Cluster wird mit einer einzigen Speicherappliance bereitgestellt, die für alle Mandantenworkloads freigegeben ist.
Die Speicherappliance in einer Azure Operator Nexus-Instanz wird als Azure-Ressource dargestellt. Operatoren können die Attribute wie bei jeder anderen Azure-Ressource einsehen.
Kubernetes-Speicherklassen
Der Software-Kubernetes-Stack von Azure Operator Nexus bietet zwei Arten von Speicher. Operatoren wählen sie über den Kubernetes StorageClass-Mechanismus aus.
Wichtig
Azure Operator Nexus unterstützt keine kurzlebigen Volumes. Nexus empfiehlt, dass die in diesem Dokument beschriebenen Speichermechanismen für persistente Volumes für alle Workloadvolumes verwendet werden, da diese die höchsten Leistungs- und Verfügbarkeitsstufen bieten. Der gesamte Speicher in Azure Operator Nexus wird von der Speicher-Appliance bereitgestellt. Es gibt keine Unterstützung für Speicher, der von Bare-Metal-Computerdatenträgern bereitgestellt wird.
StorageClass: Nexus-Volume
Der Standardspeichermechanismus – Nexus-Volume – ist die bevorzugte Wahl für die meisten benutzenden Personen. Sie bietet ein Höchstmaß an Leistung und Verfügbarkeit. Volumes können jedoch nicht gleichzeitig für mehrere Arbeitsknoten freigegeben werden. Operatoren können über die Volumeressource über die Azure-API und das Portal auf diese Volumes zugreifen und diese verwalten.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: testPvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 107Mi
storageClassName: nexus-volume
volumeMode: Block
volumeName: testVolume
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 107Mi
phase: Bound
StorageClass: nexus-shared
In Situationen, in denen ein freigegebenes Dateisystem erforderlich ist, ist die nexus-shared-Speicherklasse verfügbar. Diese Speicherklasse bietet eine freigegebene Speicherlösung mit Hochverfügbarkeit, indem mehrere Pods im selben Nexus-Kubernetes-Cluster gleichzeitig auf dasselbe Volume zugreifen und dieses nutzen können. Die nexus-shared-Speicherklasse verwendet einen NFS-Speicherdienst mit Hochverfügbarkeit. Dieser NFS-Speicherdienst (Speicherpool ist derzeit auf eine maximale Größe von 1 TiB beschränkt) ist pro CSN (Cloud Service Network) verfügbar. Der NFS-Speicherdienst wird automatisch beim Erstellen einer CSN-Ressource bereitgestellt. Jeder Nexus-Kubernetes-Cluster, der an das CSN angefügt ist, kann persistente Volumes aus diesem freigegebenen Speicherpool bereitstellen. Nexus-shared unterstützt die beiden Zugriffsmodi „Read Write Once (RWO)“ und „Read Write Many (RWX)“. Das bedeutet, dass Workloadanwendungen einen dieser beiden Zugriffsmodi für den Zugriff auf den freigegebenen Speicher nutzen können.
Abbildung: Nexus Shared Volume
Obwohl die Leistung und Verfügbarkeit von nexus-shared für die meisten Anwendungen ausreichend sind, empfehlen wir, dass Workloads mit hohen E/A-Anforderungen die Option nexus-volume verwenden, um eine optimale Leistung zu erzielen.
Read Write Once (RWO)
Im RWO-Modus (Read Write Once) kann jeweils nur ein Knoten oder Anforderer das nexus-shared-Volume einbinden. Im ReadWriteOnce-Zugriffsmodus können immer noch mehrere Pods auf das Volume zugreifen, wenn die Pods auf demselben Knoten ausgeführt werden.
apiVersion: v1
items:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: nexus-shared
volumeMode: Filesystem
volumeName: TestVolume
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
phase: Bound
Read Write Many (RWX)
Im RWX-Modus (Read Write Many) können mehrere Knoten oder Anforderer das nexus-shared-Volume gleichzeitig einbinden.
apiVersion: v1
items:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: nexus-shared
volumeMode: Filesystem
volumeName: TestVolume
status:
accessModes:
- ReadWriteMany
capacity:
storage: 5Gi
phase: Bound
Beispiele
Read Write Once (RWO) mit der Speicherklasse „nexus-volume“
Mit diesem Beispielmanifest wird ein StatefulSet mit PersistentVolumeClaimTemplate unter Verwendung der nexus-volume-Speicherklasse im ReadWriteOnce-Modus erstellt.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: test-sts-rwo
labels:
app: test-sts-rwo
spec:
serviceName: test-sts-rwo-svc
replicas: 3
selector:
matchLabels:
app: test-sts-rwo
template:
metadata:
labels:
app: test-sts-rwo
spec:
containers:
- name: busybox
command:
- "/bin/sh"
- "-c"
- while true; do echo "$(date) -- $(hostname)" >> /mnt/hostname.txt; sleep 1; done
image: busybox
volumeMounts:
- name: test-volume-rwo
mountPath: /mnt/
volumeClaimTemplates:
- metadata:
name: test-volume-rwo
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
storageClassName: nexus-volume
Für jeden Pod des StatefulSets wird ein PersistentVolumeClaim erstellt.
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-volume-rwo-test-sts-rwo-0 Bound pvc-e41fec47-cc43-4cd5-8547-5a4457cbdced 10Gi RWO nexus-volume 8m17s
test-volume-rwo-test-sts-rwo-1 Bound pvc-1589dc79-59d2-4a1d-8043-b6a883b7881d 10Gi RWO nexus-volume 7m58s
test-volume-rwo-test-sts-rwo-2 Bound pvc-82e3beac-fe67-4676-9c61-e982022d443f 10Gi RWO nexus-volume 12s
# kubectl get pods -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-sts-rwo-0 1/1 Running 0 8m31s 10.245.231.74 nexus-cluster-6a8c4018-agentpool2-md-vhhv6 <none> <none>
test-sts-rwo-1 1/1 Running 0 8m12s 10.245.126.73 nexus-cluster-6a8c4018-agentpool1-md-27nw4 <none> <none>
test-sts-rwo-2 1/1 Running 0 26s 10.245.183.9 nexus-cluster-6a8c4018-agentpool1-md-4jprt <none> <none>
# kubectl exec test-sts-rwo-0 -- cat /mnt/hostname.txt
Thu Nov 9 21:57:25 UTC 2023 -- test-sts-rwo-0
Thu Nov 9 21:57:26 UTC 2023 -- test-sts-rwo-0
Thu Nov 9 21:57:27 UTC 2023 -- test-sts-rwo-0
# kubectl exec test-sts-rwo-1 -- cat /mnt/hostname.txt
Thu Nov 9 21:57:19 UTC 2023 -- test-sts-rwo-1
Thu Nov 9 21:57:20 UTC 2023 -- test-sts-rwo-1
Thu Nov 9 21:57:21 UTC 2023 -- test-sts-rwo-1
# kubectl exec test-sts-rwo-s -- cat /mnt/hostname.txt
Thu Nov 9 21:58:32 UTC 2023 -- test-sts-rwo-2
Thu Nov 9 21:58:33 UTC 2023 -- test-sts-rwo-2
Thu Nov 9 21:58:34 UTC 2023 -- test-sts-rwo-2
Read Write Many (RWX) mit „nexus-shared“-Speicherklasse
Das folgende Manifest erstellt eine Bereitstellung mit PersistentVolumeClaim (PVC) unter Verwendung der Speicherklasse nexus-volume im ReadWriteMany-Modus. Der erstellte PVC wird von allen Pods der Bereitstellung gemeinsam genutzt und kann von allen gleichzeitig zum Lesen und Schreiben verwendet werden.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-volume-rwx
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 3Gi
storageClassName: nexus-shared
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test-deploy-rwx
name: test-deploy-rwx
spec:
replicas: 3
selector:
matchLabels:
app: test-deploy-rwx
template:
metadata:
labels:
app: test-deploy-rwx
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: kubernetes.azure.com/agentpool
operator: Exists
values: []
topologyKey: "kubernetes.io/hostname"
containers:
- name: busybox
command:
- "/bin/sh"
- "-c"
- while true; do echo "$(date) -- $(hostname)" >> /mnt/hostname.txt; sleep 1; done
image: busybox
volumeMounts:
- name: test-volume-rwx
mountPath: /mnt/
volumes:
- name: test-volume-rwx
persistentVolumeClaim:
claimName: test-volume-rwx
...
Nach der Anwendung gibt es drei Replikate der Bereitstellung, die sich denselben PVC gemeinsam verwenden.
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-volume-rwx Bound pvc-32f0717e-6b63-4d64-a458-5be4ffe21d37 3Gi RWX nexus-shared 6s
# kubectl get pods -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-deploy-rwx-fdb8f49c-86pv4 1/1 Running 0 18s 10.245.224.140 nexus-cluster-6a8c4018-agentpool1-md-s2dh7 <none> <none>
test-deploy-rwx-fdb8f49c-9zsjf 1/1 Running 0 18s 10.245.126.74 nexus-cluster-6a8c4018-agentpool1-md-27nw4 <none> <none>
test-deploy-rwx-fdb8f49c-wdgw7 1/1 Running 0 18s 10.245.231.75 nexus-cluster-6a8c4018-agentpool2-md-vhhv6 <none> <none>
Aus der nachstehenden Ausgabe ist ersichtlich, dass alle Pods in denselben PVC schreiben.
# kubectl exec test-deploy-rwx-fdb8f49c-86pv4 -- cat /mnt/hostname.txt
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-9zsjf
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-wdgw7
Thu Nov 9 21:51:42 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
# kubectl exec test-deploy-rwx-fdb8f49c-9zsjf -- cat /mnt/hostname.txt
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-9zsjf
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-wdgw7
Thu Nov 9 21:51:42 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
# kubectl exec test-deploy-rwx-fdb8f49c-wdgw7 -- cat /mnt/hostname.txt
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-9zsjf
Thu Nov 9 21:51:41 UTC 2023 -- test-deploy-rwx-fdb8f49c-wdgw7
Thu Nov 9 21:51:42 UTC 2023 -- test-deploy-rwx-fdb8f49c-86pv4
Volumengrößenbeschränkungen und Kapazitätsverwaltung
Für alle PVCs, die mit „nexus-volume“ und „nexus-shared“ erstellt wurden, gilt eine minimale und maximale Anspruchsgröße.
Speicherklasse | Minimale PVC-Größe | Maximale PVC-Größe |
---|---|---|
nexus-volume | 1 MiB | 12 TiB |
nexus-shared | Keine | 1 TiB |
Wichtig
Volumes, die ihr Verbrauchslimit erreichen, führen zum Fehler „Nicht genügend Speicherplatz“ für die Workloads, die sie verbrauchen. Sie müssen sicherstellen, dass Sie geeignete Volumengrößen für Ihre Workloadanforderungen bereitstellen. Sie müssen sowohl die Speicherappliance als auch alle NFS-Server auf ihren prozentualen Speicherverbrauch überwachen. Dazu können Sie die Metriken verwenden, die in der Liste der verfügbaren Metriken dokumentiert sind.
- Sowohl für nexus-volume- als auch für nexus-shared-PVCs wird die angeforderte Speicherkapazität als Verbrauchsgrenzwert erzwungen. Ein Volume kann nicht mehr Speicher verbrauchen als die zugeordnete PVC-Anforderung.
- Alle physischen Volumes verfügen über eine schlanke Speicherzuweisung. Sie müssen den gesamten Speicherverbrauch auf Ihrer Speicherappliance überwachen und bei Bedarf Wartungsvorgänge durchführen, um Speicherplatz freizugeben.
- Eine Bereitstellungsanforderung für einen nexus-volume-PVC führt zu einem Fehler, wenn die angeforderte Größe niedriger als die minimale oder höher als die maximale unterstützte Volumengröße ist.
- nexus-shared-Volumes werden auf dem zugrunde liegenden NFS-Server logisch mit einer schlanken Speicherzuweisung bereitgestellt. Dieser NFS-Server verfügt über eine feste Kapazität von 1 TiB.
- Ein nexus-shared-PVC kann auch dann bereitgestellt werden, wenn mehr als 1 TiB Speicher angefordert wird, er kann aber nur 1 TiB verbrauchen.
- Es ist möglich, mehrere PVCs bereitzustellen, bei denen die Summe der Kapazitätsanforderungen größer als 1 TiB ist. Der Verbrauchsgrenzwert von 1 TiB gilt jedoch trotzdem. Die zugeordneten PVs dürfen nicht mehr als 1 TiB Speicher verbrauchen.
Status der Speicherappliance
Die folgenden Eigenschaften spiegeln den Betriebszustand einer Speicherappliance wider:
Status
gibt den Zustand an, der von der Speicherappliance abgeleitet wurde. Der Zustand kannAvailable
,Error
oderProvisioning
sein.Provisioning State
gibt den aktuellen Bereitstellungsstatus der Speicherappliance. Der Bereitstellungsstatus kannSucceeded
,Failed
oderInProgress
sein.Capacity
stellt die gesamte und verwendete Kapazität der Speicherappliance bereit.Remote Vendor Management
gibt an, ob die Remoteanbieterverwaltung für die Speicherappliance aktiviert oder deaktiviert ist.
Speicherappliancevorgänge
- Auflisten von Speicherappliances: Auflisten von Speicherappliances in der bereitgestellten Ressourcengruppe oder dem bereitgestellten Abonnement.
- Speicherappliance anzeigen: Abrufen von Eigenschaften der bereitgestellten Speicherappliance.
- Speicherappliance aktualisieren: Aktualisieren von Eigenschaften oder Tags der bereitgestellten Speicherappliance.
- Aktivieren/Deaktivieren der Remoteanbieterverwaltung für die Speicheranwendungappliance: Aktivieren oder deaktivieren Sie die Remoteanbieterverwaltung für die bereitgestellte Speicherappliance.
Hinweis
Die Kundschaft kann keine Speicherappliances direkt erstellen oder löschen. Diese Ressourcen werden nur als Realisierung des Clusterlebenszyklus erstellt. Die Implementierung blockiert Anforderungen zur Erstellung oder Löschung von benutzenden Personen und erlaubt nur interne/anwendungsgesteuerte Erstellungs- oder Löschvorgänge.