Usar o Armazenamento de Contêineres do Azure com NVMe local
O Armazenamento de Contêineres do Azure é um serviço de gerenciamento de volume, implantação e orquestração 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 o NVMe local como armazenamento de back-end para suas cargas de trabalho do Kubernetes. No final, você terá um pod que está usando o NVMe local como armazenamento.
O que é um disco efêmero?
Quando seu aplicativo precisar de uma latência de armazenamento de submilissegundos e não precisar de durabilidade de dados, você poderá usar o disco efêmero com o Armazenamento de Contêineres do Azure para atender aos seus requisitos de desempenho. Efêmero significa que os discos são implantados na VM (máquina virtual) local que hospeda o cluster do AKS e não são salvos em um serviço de armazenamento do Azure. Os dados serão perdidos nesses discos se você interromper/desalocar sua VM.
Há dois tipos de disco efêmero disponíveis: NVMe local e SSD temporário. O NVMe foi criado para proporcionar transferência de dados de alta velocidade entre o armazenamento e a CPU. Escolha NVMe quando seu aplicativo precisar de IOPS ou taxa de transferência maior do que o SSD temporário ou exigir mais espaço de armazenamento. Lembre-se de que o Armazenamento de Contêineres do Azure dá suporte apenas à replicação de dados síncrona para NVMe local.
Devido à natureza efêmera desses discos, o Armazenamento de Contêineres do Azure dá suporte ao uso de volumes efêmeros genéricos por padrão ao usar um disco efêmero. No entanto, determinados casos de uso podem chamar volumes persistentes mesmo se os dados não forem 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 der suporte à replicação no nível do aplicativo para durabilidade. Nesses casos, você pode atualizar a instalação do Armazenamento de Contêineres do Azure e adicionar a anotação acstor.azure.com/accept-ephemeral-storage=true
na definição de declaração de volume persistente para dar suporte à criação de volumes persistentes de pools de armazenamento de disco efêmero.
Pré-requisitos
Se você não tiver uma assinatura 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á estará 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, confira 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 você puder instalá-lo localmente executando o comandoaz aks install-cli
.Se você ainda não instalou o Armazenamento de Contêiner do Azure, siga as instruções descritas em Usar o Armazenamento de Contêiner do Azure com o Serviço de Kubernetes do Azure.
Verifique se a região de destino tem suporte nas regiões do Armazenamento de Contêineres do Azure.
Escolher um tipo de VM que dê suporte ao NVMe local
O Disco NVMe local só está disponível em alguns tipos de VMs, por exemplo, SKUs de VM otimizadas para armazenamento ou SKUs de VM aceleradas por GPU. Se você pretende usar a capacidade de NVMe local, escolha um desses SKUs de VM.
Execute o comando a seguir para obter o tipo de VM usado com o pool de nós. Substitua <resource group>
e <cluster name>
pelos 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
Veja a seguir um exemplo de saída.
PoolName VmSize
---------- ---------------
nodepool1 standard_l8s_v3
Recomendamos que cada VM tenha no mínimo quatro CPUs virtuais (vCPUs) e 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. Criar um pool de armazenamento
Primeiro, crie um pool de armazenamento, que é um agrupamento lógico de armazenamento para o cluster do Kubernetes, definindo-o em um arquivo de manifesto YAML.
Se você habilitou o Armazenamento de Contêiner do Azure usando os comandos az aks create
ou 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 já houver um pool de armazenamento disponível que queira usar, pule esta seção e prossiga para Exibir as classes de armazenamento disponíveis.
Siga essas etapas para criar um pool de armazenamento usando o NVMe local.
Use seu editor de texto favorito para criar um arquivo de manifesto YAML, como
code acstor-storagepool.yaml
.Cole o seguinte código 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
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 for concluída, você verá uma mensagem semelhante à seguinte:
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 for criado, o Armazenamento de Contêineres do Azure criará uma classe de armazenamento em seu nome, usando a convenção de nomenclatura acstor-<storage-pool-name>
.
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ê deve 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. Ela é uma classe de armazenamento interna necessária para que o Armazenamento de Contêineres do Azure funcione.
3. Implantar um pod com um volume efêmero genérico
Crie um pod usando o Fio (testador de E/S flexível) para parâmetro de comparação e simulação de carga de trabalho, a fim de usar 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 seguinte código 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
Será exibida uma saída semelhante à seguinte:
pod/fiopod created
Verifique se o pod está em execução e se a declaração de volume efêmero foi vinculada a ele:
kubectl describe pod fiopod kubectl describe pvc fiopod-ephemeralvolume
Verifique o teste 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 o NVMe local como armazenamento e pode usá-lo para suas cargas de trabalho do Kubernetes.
Criar e anexar volumes persistentes
Para criar um volume persistente de um pool de armazenamento de disco efêmero, você precisa incluir uma anotação em suas PVCs (declarações de volume persistente) como uma proteção para garantir que você pretende usar volumes persistentes mesmo quando os dados são efêmeros. Além disso, você precisa habilitar o sinalizador --ephemeral-disk-volume-type
com o valor PersistentVolumeWithAnnotation
em seu cluster antes de criar suas declarações de volume persistentes.
Siga estas etapas para criar e anexar um volume persistente.
1. Atualizar a instalação do Armazenamento de Contêineres do Azure
Execute o comando a seguir para atualizar a instalação do Armazenamento de Contêineres do Azure para permitir a criação de volumes persistentes de pools de armazenamento de disco efêmero.
az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage ephemeralDisk --storage-pool-option NVMe --ephemeral-disk-volume-type PersistentVolumeWithAnnotation
2. Criar um pool de armazenamento
Crie um pool de armazenamento, que é um agrupamento lógico de armazenamento para o cluster do Kubernetes, definindo-o em um arquivo de manifesto YAML.
Se você habilitou o Armazenamento de Contêiner do Azure usando os comandos az aks create
ou 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 já houver um pool de armazenamento disponível que queira usar, pule esta seção e prossiga para Exibir as classes de armazenamento disponíveis.
Siga essas etapas para criar um pool de armazenamento usando o NVMe local.
Use seu editor de texto favorito para criar um arquivo de manifesto YAML, como
code acstor-storagepool.yaml
.Cole o seguinte código 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
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 for concluída, você verá uma mensagem semelhante à seguinte:
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 for criado, o Armazenamento de Contêineres do Azure criará uma classe de armazenamento em seu nome, usando a convenção de nomenclatura acstor-<storage-pool-name>
.
3. 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ê deve 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. Ela é uma classe de armazenamento interna necessária para que o Armazenamento de Contêineres do Azure funcione.
4. Criar uma declaração de volume persistente
A PVC (declaração de volume persistente) é usada para provisionar o armazenamento automaticamente com base em uma classe de armazenamento. Siga essas 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 seguinte código e salve o arquivo. O valor
name
do PVC pode ser o que você 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
Você deve ver uma saída semelhante a:
persistentvolumeclaim/ephemeralpvc created
Você pode verificar o status do PVC executando o seguinte comando:
kubectl describe pvc ephemeralpvc
Depois que o PVC for criado, ele estará pronto para uso por um pod.
5. Implantar um pod e anexar um volume persistente
Crie um pod usando FIO (Testador de E/S Flexível) para simulação de carga de trabalho e parâmetro de comparação e especifique um caminho de montagem para o volume persistente. Para claimName, use o valor do nome usado 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 seguinte código 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
Será exibida uma saída semelhante à seguinte:
pod/fiopod created
Verifique se o pod está em execução e se a declaração de volume persistente foi associada com êxito ao pod:
kubectl describe pod fiopod kubectl describe pvc ephemeralpvc
Verifique o teste 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 o NVMe local e que pode ser usado para suas cargas de trabalho do Kubernetes.
Gerenciar volumes e pools de armazenamento
Nesta seção, você aprenderá a verificar a capacidade disponível do disco efêmero para apenas um nó, 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ó. Ao configurar o tamanho dos volumes efêmeros, o tamanho deve ser menor do que a capacidade disponível do disco efêmero do nó único.
Execute o comando a seguir 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.
Expandir um pool de armazenamento
Você pode expandir pools de armazenamento com suporte do NVMe local para escalar verticalmente rapidamente e sem tempo de inatividade. Atualmente, não há suporte para redução de pools de armazenamento.
Como um pool de armazenamento apoiado pelo Disco Efêmero usa recursos de armazenamento local nas VMs (nós de cluster) do AKS, a expansão do pool de armazenamento requer a adição de outro nó ao cluster. Siga essas instruções para expandir o pool de armazenamento.
Execute o comando a seguir para adicionar um nó ao cluster do AKS. Substitua
<cluster-name>
,<nodepool name>
e<resource-group-name>
por valores próprios. 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 você quiser excluir um pool de armazenamento, execute o comando a seguir. Substitua <storage-pool-name>
pelo nome do pool de armazenamento.
kubectl delete sp -n acstor <storage-pool-name>
Otimizar o desempenho ao usar o 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. Sua seleção afetará o número de vCPUs que os componentes do Armazenamento de Contêiner do Azure consomem nos nós em que ela está instalada. Standard é a configuração padrão, caso você não atualize a camada de desempenho.
Essas três camadas oferecem um intervalo diferente de IOPS. A tabela a seguir contém diretrizes sobre o que se pode esperar com cada uma dessas camadas. Usamos a FIO, uma ferramenta de parâmetro de comparação popular, para alcançar esses números com a seguinte configuração:
- AKS: SKU do nó – Standard_L16s_v3;
- FIO: tamanho do bloco – 4KB; Profundidade da fila – 32; Numjobs – número de núcleos atribuídos a componentes de armazenamento de contêiner; Padrão de acesso – aleatório; Tamanho do conjunto de trabalho – 32G
Camada | Número de vCPUs | IOPS de leitura de 100% | IOPS de gravação de 100% |
---|---|---|---|
Basic |
12,5% do total de núcleos de VM | Até 120.000 | Até 90.000 |
Standard (padrão) |
25% do total de núcleos de VM | Até 220.000 | Até 180.000 |
Premium |
50% do total de núcleos de VM | Até 550.000 | Até 360.000 |
Observação
O consumo de RAM e de hugepages permanecerá consistente em todas as camadas: 1 GiB de RAM e 2 GiB de hugepages.
Depois de identificar a camada de desempenho que se alinha melhor às suas necessidades, você pode executar o comando a seguir para atualizar a camada de desempenho da instalação do Armazenamento de Contêineres do Azure. Substitua <performance tier>
por Básico, Standard 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>