Usar o Armazenamento de Contêiner do Azure com NVMe local e replicação de volume
O Armazenamento de Contêineres do Azure é um serviço de gerenciamento, implantação e orquestração de volumes baseado em nuvem criado nativamente para contêineres. Este artigo mostra como configurar o Armazenamento de Contêiner do Azure para usar o Disco Efémero com NVMe local e replicação de volume como armazenamento back-end para suas cargas de trabalho do Kubernetes. No final, você terá um pod que está usando NVMe local como armazenamento. A replicação copia dados entre volumes em nós diferentes e restaura um volume quando uma réplica é perdida, fornecendo resiliência para o Ephemeral Disk.
O que é Ephemeral Disk?
Quando seu aplicativo precisa de latência de armazenamento inferior a milissegundos, você pode usar o Disco Efémero com o Armazenamento de Contêiner do Azure para atender aos seus requisitos de desempenho. Efémero significa que os discos são implantados na máquina virtual (VM) local que hospeda o cluster AKS e não salvos em um serviço de armazenamento do Azure. Os dados serão perdidos nesses discos se você parar/desalocar sua VM.
Existem dois tipos de disco efêmero disponíveis: NVMe local e SSD temporário. NVMe é projetado para transferência de dados de alta velocidade entre armazenamento e CPU. Escolha NVMe quando seu aplicativo precisar de IOPS ou taxa de transferência mais altas do que o SSD temporário ou exigir mais espaço de armazenamento. Lembre-se de que o Armazenamento de Contêiner do Azure só dá suporte à replicação síncrona de dados para NVMe local.
Devido à natureza efêmera desses discos, o Armazenamento de Contêiner do Azure dá suporte ao uso de volumes efêmeros genéricos por padrão ao usar disco efêmero. No entanto, certos casos de uso podem exigir volumes persistentes, mesmo que os dados não sejam duráveis, por exemplo, se você quiser usar arquivos YAML existentes ou modelos de implantação codificados para usar volumes persistentes e sua carga de trabalho oferecer suporte à replicação no nível do aplicativo para durabilidade. Nesses casos, você pode atualizar sua instalação do Armazenamento de Contêiner do Azure e adicionar a anotação acstor.azure.com/accept-ephemeral-storage=true
em sua definição de declaração de volume persistente para dar suporte à criação de volumes persistentes a partir de pools de armazenamento em disco efêmeros.
Pré-requisitos
Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
Este artigo requer a versão mais recente (2.35.0 ou posterior) da CLI do Azure. Consulte Como instalar a CLI do Azure. Se você estiver usando o ambiente Bash no Azure Cloud Shell, a versão mais recente já está instalada. Se você planeja executar os comandos localmente em vez de no Azure Cloud Shell, certifique-se de executá-los com privilégios administrativos. Para obter mais informações, consulte Introdução ao Azure Cloud Shell.
Você precisará do cliente de linha de comando do Kubernetes,
kubectl
. Ele já está instalado se você estiver usando o Azure Cloud Shell ou se puder instalá-lo localmente executando oaz aks install-cli
comando.Se você ainda não instalou o Armazenamento de Contêiner do Azure, siga as instruções em Usar o Armazenamento de Contêiner do Azure com o Serviço Kubernetes do Azure.
Verifique se a sua região de destino tem suporte nas regiões de Armazenamento de Contêiner do Azure.
Escolha um tipo de VM que suporte NVMe local
O disco NVMe local só está disponível em determinados tipos de VMs, por exemplo, SKUs de VM otimizadas para armazenamento ou SKUs de VM aceleradas por GPU. Se você planeja usar NVMe local, escolha uma dessas SKUs de VM.
Execute o comando a seguir para obter o tipo de VM usado com seu pool de nós. Substitua <resource group>
e <cluster name>
com os seus próprios valores. Você não precisa fornecer valores para PoolName
ou VmSize
, portanto, mantenha a consulta como mostrado aqui.
az aks nodepool list --resource-group <resource group> --cluster-name <cluster name> --query "[].{PoolName:name, VmSize:vmSize}" -o table
Segue-se um exemplo de saída.
PoolName VmSize
---------- ---------------
nodepool1 standard_l8s_v3
Recomendamos que cada VM tenha um mínimo de quatro CPUs virtuais (vCPUs) e que cada pool de nós tenha pelo menos três nós.
Criar e anexar volumes efémeros genéricos
Siga estas etapas para criar e anexar um volume efêmero genérico.
1. Crie um pool de armazenamento com replicação de volume
Primeiro, crie um pool de armazenamento, que é um agrupamento lógico de armazenamento para seu cluster Kubernetes, definindo-o em um arquivo de manifesto YAML.
Se você habilitou o Armazenamento de Contêiner do Azure usando az aks create
comandos or az aks update
, talvez já tenha um pool de armazenamento. Use kubectl get sp -n acstor
para obter a lista de pools de armazenamento. Se você já tiver um pool de armazenamento disponível que deseja usar, ignore esta seção e prossiga para Exibir as classes de armazenamento disponíveis.
Siga estas etapas para criar um pool de armazenamento usando NVMe local com replicação. Atualmente, o Armazenamento de Contêiner do Azure dá suporte a configurações de três e cinco réplicas. Se você especificar três réplicas, deverá ter pelo menos três nós no cluster AKS. Se você especificar cinco réplicas, deverá ter pelo menos cinco nós.
Nota
Como os pools de armazenamento em disco efêmero consomem todos os discos NVMe disponíveis, você deve excluir todos os pools de armazenamento NVMe locais existentes antes de criar um novo pool de armazenamento.
Use seu editor de texto favorito para criar um arquivo de manifesto YAML como
code acstor-storagepool.yaml
.Cole o código a seguir e salve o arquivo. O valor do nome do pool de armazenamento pode ser o que você quiser.
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme replicas: 3
Aplique o arquivo de manifesto YAML para criar o pool de armazenamento.
kubectl apply -f acstor-storagepool.yaml
Quando a criação do pool de armazenamento estiver concluída, você verá uma mensagem como:
storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
Você também pode executar esse comando para verificar o status do pool de armazenamento. Substitua
<storage-pool-name>
pelo valor do nome do pool de armazenamento. Para este exemplo, o valor seria ephemeraldisk-nvme.kubectl describe sp <storage-pool-name> -n acstor
Quando o pool de armazenamento é criado, o Armazenamento de Contêiner do Azure criará uma classe de armazenamento em seu nome, usando a convenção acstor-<storage-pool-name>
de nomenclatura .
2. Exibir as classes de armazenamento disponíveis
Quando o pool de armazenamento estiver pronto para uso, você deverá selecionar uma classe de armazenamento para definir como o armazenamento é criado dinamicamente ao criar e implantar volumes.
Execute kubectl get sc
para exibir as classes de armazenamento disponíveis. Você verá uma classe de armazenamento chamada acstor-<storage-pool-name>
.
$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal disk.csi.azure.com Retain WaitForFirstConsumer true 65m
acstor-ephemeraldisk-nvme containerstorage.csi.azure.com Delete WaitForFirstConsumer true 2m27s
Importante
Não use a classe de armazenamento marcada como interna. É uma classe de armazenamento interno necessária para que o Armazenamento de Contêiner do Azure funcione.
3. Implante um pod com um volume efêmero genérico
Crie um pod usando Fio (Flexible I/O Tester) para benchmarking e simulação de carga de trabalho, que usa um volume efêmero genérico.
Use seu editor de texto favorito para criar um arquivo de manifesto YAML como
code acstor-pod.yaml
.Cole o código a seguir e salve o arquivo.
kind: Pod apiVersion: v1 metadata: name: fiopod spec: nodeSelector: acstor.azure.com/io-engine: acstor containers: - name: fio image: nixery.dev/shell/fio args: - sleep - "1000000" volumeMounts: - mountPath: "/volume" name: ephemeralvolume volumes: - name: ephemeralvolume ephemeral: volumeClaimTemplate: metadata: labels: type: my-ephemeral-volume spec: accessModes: [ "ReadWriteOnce" ] storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different resources: requests: storage: 1Gi
Ao alterar o tamanho de armazenamento de seus volumes, verifique se o tamanho é menor do que a capacidade disponível do disco efêmero de um único nó. Consulte Verificar a capacidade do disco efêmero do nó.
Aplique o arquivo de manifesto YAML para implantar o pod.
kubectl apply -f acstor-pod.yaml
Deverá ver um resultado semelhante ao seguinte:
pod/fiopod created
Verifique se o pod está em execução e se a declaração de volume efêmero foi vinculada com êxito ao pod:
kubectl describe pod fiopod kubectl describe pvc fiopod-ephemeralvolume
Verifique o teste de fio para ver seu status atual:
kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
Agora você implantou um pod que está usando NVMe local com replicação de volume e pode usá-lo para suas cargas de trabalho do Kubernetes.
Criar e anexar volumes persistentes
Para criar um volume persistente a partir de um pool de armazenamento em disco efêmero, você deve incluir uma anotação em suas PVCs (declarações de volume persistente) como salvaguarda para garantir que você pretenda usar volumes persistentes mesmo quando os dados são efêmeros. Além disso, você precisa habilitar o --ephemeral-disk-volume-type
sinalizador com o PersistentVolumeWithAnnotation
valor no cluster antes de criar suas declarações de volume persistente.
Siga estas etapas para criar e anexar um volume persistente.
1. Atualize sua instalação do Armazenamento de Contêiner do Azure
Execute o comando a seguir para atualizar sua instalação do Armazenamento de Contêiner do Azure para permitir a criação de volumes persistentes a partir de pools de armazenamento em disco efêmeros.
az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage ephemeralDisk --storage-pool-option NVMe --ephemeral-disk-volume-type PersistentVolumeWithAnnotation
2. Crie um pool de armazenamento com replicação de volume
Siga estas etapas para criar um pool de armazenamento usando NVMe local com replicação. Atualmente, o Armazenamento de Contêiner do Azure dá suporte a configurações de três e cinco réplicas. Se você especificar três réplicas, deverá ter pelo menos três nós no cluster AKS. Se você especificar cinco réplicas, deverá ter pelo menos cinco nós.
Nota
Como os pools de armazenamento em disco efêmero consomem todos os discos NVMe disponíveis, você deve excluir todos os pools de armazenamento NVMe locais existentes antes de criar um novo pool de armazenamento.
Use seu editor de texto favorito para criar um arquivo de manifesto YAML como
code acstor-storagepool.yaml
.Cole o código a seguir e salve o arquivo. O valor do nome do pool de armazenamento pode ser o que você quiser. Defina réplicas como 3 ou 5.
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme replicas: 3
Aplique o arquivo de manifesto YAML para criar o pool de armazenamento.
kubectl apply -f acstor-storagepool.yaml
Quando a criação do pool de armazenamento estiver concluída, você verá uma mensagem como:
storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
Você também pode executar esse comando para verificar o status do pool de armazenamento. Substitua
<storage-pool-name>
pelo valor do nome do pool de armazenamento. Para este exemplo, o valor seria ephemeraldisk-nvme.kubectl describe sp <storage-pool-name> -n acstor
Quando o pool de armazenamento é criado, o Armazenamento de Contêiner do Azure criará uma classe de armazenamento em seu nome, usando a convenção acstor-<storage-pool-name>
de nomenclatura .
3. Exiba as classes de armazenamento disponíveis
Quando o pool de armazenamento estiver pronto para uso, você deverá selecionar uma classe de armazenamento para definir como o armazenamento é criado dinamicamente ao criar e implantar volumes.
Execute kubectl get sc
para exibir as classes de armazenamento disponíveis. Você verá uma classe de armazenamento chamada acstor-<storage-pool-name>
.
$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal disk.csi.azure.com Retain WaitForFirstConsumer true 65m
acstor-ephemeraldisk-nvme containerstorage.csi.azure.com Delete WaitForFirstConsumer true 2m27s
Importante
Não use a classe de armazenamento marcada como interna. É uma classe de armazenamento interno necessária para que o Armazenamento de Contêiner do Azure funcione.
4. Criar uma declaração de volume persistente
Uma declaração de volume persistente (PVC) é usada para provisionar automaticamente o armazenamento com base em uma classe de armazenamento. Siga estas etapas para criar um PVC usando a nova classe de armazenamento.
Use seu editor de texto favorito para criar um arquivo de manifesto YAML como
code acstor-pvc.yaml
.Cole o código a seguir e salve o arquivo. O valor do PVC
name
pode ser o que quiser.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ephemeralpvc annotations: acstor.azure.com/accept-ephemeral-storage: "true" spec: accessModes: - ReadWriteOnce storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different resources: requests: storage: 100Gi
Ao alterar o tamanho de armazenamento de seus volumes, verifique se o tamanho é menor do que a capacidade disponível do disco efêmero de um único nó. Consulte Verificar a capacidade do disco efêmero do nó.
Aplique o arquivo de manifesto YAML para criar o PVC.
kubectl apply -f acstor-pvc.yaml
Deverá ver um resultado semelhante a:
persistentvolumeclaim/ephemeralpvc created
Você pode verificar o status do PVC executando o seguinte comando:
kubectl describe pvc ephemeralpvc
Uma vez criado, o PVC está pronto para ser usado por um pod.
5. Implante um pod e anexe um volume persistente
Crie um pod usando Fio (Flexible I/O Tester) para benchmarking e simulação de carga de trabalho e especifique um caminho de montagem para o volume persistente. Para claimName, use o valor name que você usou ao criar a declaração de volume persistente.
Use seu editor de texto favorito para criar um arquivo de manifesto YAML como
code acstor-pod.yaml
.Cole o código a seguir e salve o arquivo.
kind: Pod apiVersion: v1 metadata: name: fiopod spec: nodeSelector: acstor.azure.com/io-engine: acstor volumes: - name: ephemeralpv persistentVolumeClaim: claimName: ephemeralpvc containers: - name: fio image: nixery.dev/shell/fio args: - sleep - "1000000" volumeMounts: - mountPath: "/volume" name: ephemeralpv
Aplique o arquivo de manifesto YAML para implantar o pod.
kubectl apply -f acstor-pod.yaml
Deverá ver um resultado semelhante ao seguinte:
pod/fiopod created
Verifique se o pod está em execução e se a declaração de volume persistente foi vinculada com êxito ao pod:
kubectl describe pod fiopod kubectl describe pvc ephemeralpvc
Verifique o teste de fio para ver seu status atual:
kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
Agora você implantou um pod que está usando NVMe local com replicação de volume e pode usá-lo para suas cargas de trabalho do Kubernetes.
Gerenciar volumes e pools de armazenamento
Nesta seção, você aprenderá como verificar a capacidade disponível do disco efêmero, como desanexar e reanexar um volume persistente, como expandir ou excluir um pool de armazenamento e como otimizar o desempenho.
Verificar a capacidade do disco efêmero do nó
Um volume efêmero é alocado em um único nó. Quando você configura o tamanho de seus volumes efêmeros, o tamanho deve ser menor do que a capacidade disponível do disco efêmero do nó único.
Execute o seguinte comando para verificar a capacidade disponível do disco efêmero para um único nó.
$ kubectl get diskpool -n acstor
NAME CAPACITY AVAILABLE USED RESERVED READY AGE
ephemeraldisk-nvme-diskpool-jaxwb 75660001280 75031990272 628011008 560902144 True 21h
ephemeraldisk-nvme-diskpool-wzixx 75660001280 75031990272 628011008 560902144 True 21h
ephemeraldisk-nvme-diskpool-xbtlj 75660001280 75031990272 628011008 560902144 True 21h
Neste exemplo, a capacidade disponível de disco efêmero para um único nó é 75031990272
bytes ou 69 GiB.
Desanexar e reanexar um volume persistente
Para desanexar um volume persistente, exclua o pod ao qual o volume persistente está conectado.
kubectl delete pods <pod-name>
Para reanexar um volume persistente, basta fazer referência ao nome da declaração de volume persistente no arquivo de manifesto YAML conforme descrito em Implantar um pod e anexar um volume persistente.
Para verificar a qual volume persistente uma declaração de volume persistente está vinculada, execute:
kubectl get pvc <persistent-volume-claim-name>
Expandir um pool de armazenamento
Você pode expandir pools de armazenamento apoiados por NVMe local para aumentar rapidamente e sem tempo de inatividade. Atualmente, não há suporte para a redução de pools de armazenamento.
Como um pool de armazenamento apoiado pelo Disco Efémero usa recursos de armazenamento local nos nós de cluster (VMs) AKS, a expansão do pool de armazenamento requer a adição de outro nó ao cluster. Siga estas instruções para expandir o pool de armazenamento.
Execute o seguinte comando para adicionar um nó ao cluster AKS. Substitua
<cluster-name>
,<nodepool name>
e<resource-group-name>
pelos seus próprios valores. Para obter o nome do pool de nós, executekubectl get nodes
.az aks nodepool add --cluster-name <cluster name> --name <nodepool name> --resource-group <resource group> --node-vm-size Standard_L8s_v3 --node-count 1 --labels acstor.azure.com/io-engine=acstor
Execute
kubectl get nodes
e você verá que um nó foi adicionado ao cluster.Execute
kubectl get sp -A
e você verá que a capacidade do pool de armazenamento aumentou.
Excluir um pool de armazenamento
Se desejar excluir um pool de armazenamento, execute o seguinte comando. Substitua <storage-pool-name>
pelo nome do pool de armazenamento.
kubectl delete sp -n acstor <storage-pool-name>
Otimize o desempenho ao usar NVMe local
Dependendo dos requisitos de desempenho da sua carga de trabalho, você pode escolher entre três níveis de desempenho diferentes: Básico, Standard e Premium. Essas camadas oferecem uma gama diferente de IOPS, e sua seleção afetará o número de vCPUs que os componentes do Armazenamento de Contêiner do Azure consomem nos nós onde estão instalados. Standard é a configuração padrão se você não atualizar a camada de desempenho.
Replicação de zona única
Nível | Número de vCPUs | IOPS de leitura de 100% | IOPS de gravação de 100% |
---|---|---|---|
Basic |
12,5% do total de núcleos VM | Até 120.000 | Até 45.000 |
Standard (padrão) |
25% do total de núcleos VM | Até 220.000 | Até 90.000 |
Premium |
50% do total de núcleos VM | Até 550.000 | Até 180.000 |
Replicação multizona
Nível | Número de vCPUs | IOPS de leitura de 100% | IOPS de gravação de 100% |
---|---|---|---|
Basic |
12,5% do total de núcleos VM | Até 120.000 | Até 45.000 |
Standard (padrão) |
25% do total de núcleos VM | Até 220.000 | Até 90.000 |
Premium |
50% do total de núcleos VM | Até 550.000 | Até 180.000 |
Nota
O consumo de RAM e páginas enormes permanecerá consistente em todos os níveis: 1 GiB de RAM e 2 GiB de páginas enormes.
Depois de identificar a camada de desempenho que melhor se alinha às suas necessidades, você pode executar o seguinte comando para atualizar a camada de desempenho da sua instalação do Armazenamento de Contêiner do Azure. Substitua <performance tier>
por básico, padrão ou premium.
az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage <storage-pool-type> --ephemeral-disk-nvme-perf-tier <performance-tier>