Dispositivo de almacenamiento de Azure Operator Nexus
Azure Operator Nexus se basa en construcciones básicas como servidores de proceso, dispositivos de almacenamiento y dispositivos del tejido de red. Los dispositivos de almacenamiento de Azure Operator Nexus representan dispositivos de almacenamiento persistentes en el bastidor.
Cada dispositivo de almacenamiento contiene varios dispositivos de almacenamiento, que se agregan para proporcionar un solo bloque de almacenamiento. A continuación, dicho bloque de almacenamiento se divide en varios volúmenes, que se presentan a los servidores de proceso como dispositivos de almacenamiento en bloque. Los servidores de proceso pueden usar estos dispositivos de almacenamiento en bloque como almacenamiento persistente para sus cargas de trabajo. Cada clúster de Azure Operator Nexus se aprovisiona con un solo dispositivo de almacenamiento que se comparte en todas las cargas de trabajo del inquilino.
El dispositivo de almacenamiento de una instancia de Azure Operator Nexus se representa como un recurso de Azure. Los operadores obtienen acceso para ver sus atributos como cualquier otro recurso de Azure.
Clases de almacenamiento de Kubernetes
La pila de Kubernetes de software de Azure Operator Nexus ofrece dos tipos de almacenamiento. Los operadores los seleccionan a través del mecanismo StorageClass de Kubernetes.
Importante
Azure Operator Nexus no admite volúmenes efímeros. Nexus recomienda que los mecanismos de almacenamiento de volúmenes persistentes descritos en este documento se usen para todos los volúmenes de cargas de trabajo, ya que proporcionan los niveles más altos de rendimiento y disponibilidad. El dispositivo de almacenamiento proporciona todo el almacenamiento de Azure Operator Nexus. No hay compatibilidad con el almacenamiento proporcionado por discos de máquina sin sistema operativo.
StorageClass: nexus-volume
El mecanismo de almacenamiento predeterminado, nexus-volume, es la opción preferida para la mayoría de los usuarios. Proporciona los niveles más altos de rendimiento y disponibilidad. Sin embargo, los volúmenes no se pueden compartir simultáneamente entre varios nodos de trabajo. Los operadores pueden acceder a estos volúmenes y administrarlos mediante el portal y la API de Azure, a través del recurso de volumen.
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
En situaciones en las que se requiere un sistema de archivos compartido, la clase de almacenamiento nexus-shared está disponible. Esta clase de almacenamiento proporciona una solución de almacenamiento compartido de alta disponibilidad al permitir que varios pods del mismo clúster de Nexus Kubernetes accedan simultáneamente al mismo volumen y lo compartan. La clase de almacenamiento nexus-shared está respaldada por un servicio de almacenamiento NFS de alta disponibilidad. Este servicio de almacenamiento NFS (bloque de almacenamiento limitado actualmente a un tamaño máximo de 1TiB) está disponible por red de servicio en la nube (CSN). El servicio de almacenamiento NFS se implementa automáticamente al crear un recurso de CSN. Cualquier clúster de Nexus Kubernetes conectado a la CSN puede aprovisionar el volumen persistente desde este bloque de almacenamiento compartido. Nexus-shared admite los modos de acceso Read Write Once (RWO) y Read Write Many (RWX). Eso significa que las aplicaciones de carga de trabajo pueden usar cualquiera de estos modos de acceso para acceder al almacenamiento compartido.
Ilustración: volumen compartido de Nexus
Aunque el rendimiento y la disponibilidad de nexus-shared son suficientes para la mayoría de las aplicaciones, se recomienda que las cargas de trabajo con requisitos de E/S intensiva usen la opción nexus-volume para lograr un rendimiento óptimo.
Read Write Once (RWO)
En el modo Read Write Once (RWO), solo un nodo o demandante puede montar el volumen nexus-shared a la vez. El modo de acceso ReadWriteOnce todavía permite que varios pods accedan al volumen cuando los pods se ejecutan en el mismo nodo.
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)
En el modo Read Write Many (RWX), varios nodos o demandantes pueden montar el volumen nexus-shared al mismo tiempo.
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
Ejemplos
Read Write Once (RWO) con la clase de almacenamiento nexus-volume
Este manifiesto de ejemplo crea un objeto StatefulSet con PersistentVolumeClaimTemplate mediante la clase de almacenamiento nexus-volume en modo ReadWriteOnce.
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
Cada pod del objeto StatefulSet tiene una notificación PersistentVolumeClaim creada.
# 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) con la clase de almacenamiento nexus-shared
El manifiesto siguiente crea una implementación con una notificación PersistentVolumeClaim (PVC) mediante la clase de almacenamiento nexus-shared en modo ReadWriteMany. Todos los pods de la implementación comparten la notificación PVC creada y pueden usarla para leer y escribir de forma simultánea.
---
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
...
Después de aplicarse, hay tres réplicas de la implementación que comparten la misma notificación PVC.
# 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>
En el resultado siguiente se puede observar que todos los pods escriben en la misma notificación PVC.
# 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
Límites de tamaño de volumen y administración de capacidad
Las PVC creadas con nexus-volume y nexus-shared tienen tamaños de notificación mínimos y máximos.
Clase de almacenamiento | Tamaño mínimo de PVC | Tamaño máximo de PVC |
---|---|---|
nexus-volume | 1 MiB | 12 TiB |
nexus-shared | Ninguno | 1 TiB |
Importante
Los volúmenes que alcanzan su límite de consumo provocarán errores de falta de espacio en disco en las cargas de trabajo que los consumen. Debe asegurarse de aprovisionar los tamaños de volumen adecuados para los requisitos de carga de trabajo. Debe supervisar tanto en el dispositivo de almacenamiento como en todos los servidores NFS su consumo de almacenamiento porcentual. Puede hacerlo con las métricas documentadas en la lista de métricas disponibles.
- Las PVC de nexus-volume y de nexus-shared tienen su capacidad de almacenamiento solicitada impuesta como un límite de consumo. Un volumen no puede consumir más almacenamiento que la solicitud de la PVC asociada.
- Todos los volúmenes físicos tienen un aprovisionamiento fino. Debe supervisar el consumo total de almacenamiento en su dispositivo de almacenamiento y realizar operaciones de mantenimiento para liberar espacio de almacenamiento si es necesario.
- Se produce un error en una solicitud de aprovisionamiento de PVC de nexus-volume si el tamaño solicitado es inferior al mínimo o superior al tamaño máximo de volumen admitido.
- Los volúmenes nexus-shared tienen lógicamente un aprovisionamiento fino en el servidor NFS de respaldo. Este servidor NFS tiene una capacidad fija de 1 TiB.
- Una PVC de nexus-shared se puede aprovisionar a pesar de solicitar más de 1 TiB de almacenamiento, pero solo se puede consumir 1 TiB.
- Es posible aprovisionar un conjunto de PVC en el que la suma de las solicitudes de capacidad es mayor que 1 TiB. Sin embargo, se aplica el límite de consumo de 1 TiB; es posible que el conjunto de PVC asociadas no consuma más de 1 TiB de almacenamiento.
Estado del dispositivo de almacenamiento
Las siguientes propiedades reflejan el estado operativo de un dispositivo de almacenamiento:
Status
indica el estado como derivado del dispositivo de almacenamiento. El estado puede serAvailable
,Error
oProvisioning
.Provisioning State
proporciona el estado de aprovisionamiento actual del dispositivo de almacenamiento. El estado de aprovisionamiento puede serSucceeded
,Failed
oInProgress
.Capacity
proporciona la capacidad total y usada del dispositivo de almacenamiento.Remote Vendor Management
indica si la administración de proveedores de carácter remoto está habilitada o deshabilitada para el dispositivo de almacenamiento.
Operaciones del dispositivo de almacenamiento
- Enumerar los dispositivos de almacenamiento: enumere los dispositivos de almacenamiento en el grupo de recursos o la suscripción proporcionados.
- Mostrar el dispositivo de almacenamiento: obtenga las propiedades del dispositivo de almacenamiento proporcionado.
- Actualizar el dispositivo de almacenamiento: actualice las propiedades o etiquetas del dispositivo de almacenamiento proporcionado.
- Habilitar/deshabilitar la administración de proveedores de carácter remoto para el dispositivo de almacenamiento: habilite o deshabilite la administración de proveedores de carácter remoto para el dispositivo de almacenamiento proporcionado.
Nota:
Los clientes no pueden crear ni eliminar los dispositivos de almacenamiento directamente. Estos recursos solo se crean como la realización del ciclo de vida del clúster. La implementación bloquea las solicitudes de creación o eliminación de cualquier usuario y solo permite operaciones de creación o eliminación internas o controladas por la aplicación.