Dispositivo de armazenamento Azure Operator Nexus
O Azure Operator Nexus baseia-se em construções básicas, como servidores de computação, dispositivos de armazenamento e dispositivos de malha de rede. Os dispositivos de armazenamento do Azure Operator Nexus representam dispositivos de armazenamento persistentes no rack.
Cada dispositivo de armazenamento contém vários dispositivos de armazenamento, que são agregados para fornecer um único pool de armazenamento. Esse pool de armazenamento é então dividido em vários volumes, que são apresentados aos servidores de computação como dispositivos de armazenamento em bloco. Os servidores de computação podem usar esses dispositivos de armazenamento em bloco como armazenamento persistente para suas cargas de trabalho. Cada cluster do Azure Operator Nexus é provisionado com um único dispositivo de armazenamento que é compartilhado em todas as cargas de trabalho do locatário.
O dispositivo de armazenamento em uma instância do Azure Operator Nexus é representado como um recurso do Azure. Os operadores obtêm acesso para exibir seus atributos como qualquer outro recurso do Azure.
Classes de armazenamento do Kubernetes
A pilha Kubernetes do software Azure Operator Nexus oferece dois tipos de armazenamento. Os operadores selecionam-nos através do mecanismo Kubernetes StorageClass.
Importante
O Azure Operator Nexus não dá suporte a volumes efêmeros. A Nexus recomenda que os mecanismos de armazenamento de volume persistente descritos neste documento sejam usados para todos os volumes de carga de trabalho, pois eles fornecem os mais altos níveis de desempenho e disponibilidade. Todo o armazenamento no Azure Operator Nexus é fornecido pelo dispositivo de armazenamento. Não há suporte para armazenamento fornecido por discos de máquinas baremetal.
StorageClass: nexus-volume
O mecanismo de armazenamento padrão, nexus-volume, é a escolha preferida para a maioria dos usuários. Ele fornece os mais altos níveis de desempenho e disponibilidade. No entanto, os volumes não podem ser compartilhados simultaneamente entre vários nós de trabalho. Os operadores podem acessar e gerenciar esses volumes usando a API e o portal do Azure, por meio do recurso de volume.
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-compartilhado
Em situações em que um sistema de arquivos compartilhado é necessário, a classe de armazenamento nexus-shared está disponível. Essa classe de armazenamento fornece uma solução de armazenamento compartilhado altamente disponível, permitindo que vários pods no mesmo cluster Nexus Kubernetes acessem e compartilhem simultaneamente o mesmo volume. A classe de armazenamento compartilhado nexus é apoiada por um serviço de armazenamento NFS altamente disponível. Este serviço de armazenamento NFS (pool de armazenamento atualmente limitado a um tamanho máximo de 1 TiB) está disponível por Rede de Serviço de Nuvem (CSN). O serviço de armazenamento NFS é implantado automaticamente na criação de um recurso CSN. Qualquer cluster Nexus Kubernetes conectado à CSN pode provisionar volumes persistentes desse pool de armazenamento compartilhado. O Nexus-shared suporta os modos de acesso Read Write Once (RWO) e Read Write Many (RWX). Isso significa que os aplicativos de carga de trabalho podem usar qualquer um desses modos de acesso para acessar o armazenamento compartilhado.
Figura: Volume compartilhado do Nexus
Embora o desempenho e a disponibilidade do nexus-shared sejam suficientes para a maioria dos aplicativos, recomendamos que cargas de trabalho com requisitos pesados de E/S usem a opção nexus-volume para obter um desempenho ideal.
Ler uma vez (RWO)
No modo Read Write Once (RWO), apenas um nó ou reclamante pode montar o volume compartilhado pelo nexus de cada vez. O modo de acesso ReadWriteOnce ainda permite que vários pods acessem o volume quando os pods estão sendo executados no mesmo nó.
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
Ler Escrever Muitos (RWX)
No modo Read Write Many (RWX), vários nós ou requerentes podem montar o volume compartilhado pelo nexo ao mesmo tempo.
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
Exemplos
Read Write Once (RWO) com classe de armazenamento nexus-volume
Este manifesto de exemplo cria um StatefulSet com PersistentVolumeClaimTemplate usando a classe de armazenamento nexus-volume no 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 do StatefulSet tem um PersistentVolumeClaim criado.
# 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) com classe de armazenamento compartilhado nexus
O manifesto abaixo cria uma implantação com um PVC (PersistentVolumeClaim) usando a classe de armazenamento compartilhado nexus no modo ReadWriteMany. O PVC criado é compartilhado por todos os pods da implantação e pode ser usado para ler e escrever por todos eles simultaneamente.
---
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
...
Uma vez aplicada, há três réplicas da implantação compartilhando o mesmo 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>
Pode-se observar a partir da saída abaixo que todos os pods estão gravando no mesmo 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
Limites de tamanho de volume e gerenciamento de capacidade
Os PVCs criados usando o nexus-volume e o nexus-shared têm tamanhos mínimos e máximos de declaração.
Classe de armazenamento | Tamanho mínimo do PVC | Tamanho máximo do PVC |
---|---|---|
nexo-volume | 1 MiB | 12 TiB |
nexus-compartilhado | Nenhuma | 1 TiB |
Importante
Os volumes que atingem seu limite de consumo causarão erros de falta de espaço em disco nas cargas de trabalho que os consomem. Você deve certificar-se de provisionar tamanhos de volume adequados para seus requisitos de carga de trabalho. Você deve monitorar o dispositivo de armazenamento e todos os servidores NFS quanto ao consumo percentual de armazenamento. Você pode fazer isso usando as métricas documentadas na lista de métricas disponíveis.
- Tanto os PVCs nexus-volume quanto os nexus-shared têm sua capacidade de armazenamento solicitada imposta como limite de consumo. Um volume não pode consumir mais armazenamento do que a solicitação de PVC associada.
- Todos os volumes físicos são provisionados de forma fina. Você deve monitorar o consumo total de armazenamento em seu dispositivo de armazenamento e executar operações de manutenção para liberar espaço de armazenamento, se necessário.
- Uma solicitação de provisionamento de PVC de volume nexo falhará se o tamanho solicitado for menor que o tamanho mínimo ou maior que o tamanho máximo de volume suportado.
- Os volumes compartilhados pelo Nexus são logicamente provisionados no servidor NFS de backup. Este servidor NFS tem uma capacidade fixa de 1 TiB.
- Um PVC compartilhado por nexo pode ser provisionado apesar de solicitar mais de 1 TiB de armazenamento, no entanto, apenas 1 TiB pode ser consumido.
- É possível provisionar um conjunto de PVCs onde a soma das solicitações de capacidade é maior que 1 TiB. No entanto, aplica-se o limite de consumo de 1 TiB; o conjunto de PVs associados não pode consumir mais de 1 TiB de armazenamento.
Estado do dispositivo de armazenamento
As propriedades a seguir refletem o estado operacional de um dispositivo de armazenamento:
Status
indica o estado como derivado do dispositivo de armazenamento. O estado pode serAvailable
,Error
ouProvisioning
.Provisioning State
Fornece o estado de provisionamento atual do dispositivo de armazenamento. O estado de provisionamento pode serSucceeded
,Failed
ouInProgress
.Capacity
fornece a capacidade total e utilizada do dispositivo de armazenamento.Remote Vendor Management
Indica se o gerenciamento remoto do fornecedor está habilitado ou desabilitado para o dispositivo de armazenamento.
Operações do dispositivo de armazenamento
- Listar dispositivos de armazenamento: liste os dispositivos de armazenamento no grupo de recursos ou assinatura fornecidos.
- Mostrar dispositivo de armazenamento: obtenha as propriedades do dispositivo de armazenamento fornecido.
- Update Storage Appliance: atualize as propriedades ou tags do dispositivo de armazenamento fornecido.
- Ativar/desativar o gerenciamento remoto de fornecedores para o Storage Appliance: habilite ou desabilite o gerenciamento remoto do fornecedor para o dispositivo de armazenamento fornecido.
Nota
Os clientes não podem criar ou excluir dispositivos de armazenamento diretamente. Esses recursos são criados apenas como a realização do ciclo de vida do cluster. A implementação bloqueia a criação ou exclusão de solicitações de qualquer usuário e permite apenas operações de criação ou exclusão internas/orientadas a aplicativos.