Compartilhar via


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êineres do Azure para usar o disco NVMe local como armazenamento de back-end para suas cargas de trabalho do Kubernetes. O NVMe foi projetado para transferência de dados de alta velocidade entre armazenamento e CPU, fornecendo alta IOPS e taxa de transferência.

Importante

Este artigo se aplica ao Armazenamento de Contêineres do Azure (versão 2.x.x),que atualmente dá suporte apenas ao disco NVMe local para backup do armazenamento. Para obter detalhes sobre versões anteriores, consulte a documentação do Armazenamento de Contêineres do Azure (versão 1.x.x).

O que é NVMe local?

Quando seu aplicativo precisa de latência de armazenamento de sub milissegundos e alta taxa de transferência, você pode usar discos NVMe locais 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ê parar/desalocar sua VM. Discos NVMe locais são oferecidos em famílias de VM do Azure selecionadas, como VMs com otimização de armazenamento .

Por padrão, o Armazenamento de Contêineres do Azure cria volumes efêmeros genéricos ao usar discos NVMe locais. Para casos de uso que exigem declarações de volume persistentes, você pode adicionar a anotação em seu modelo de declaração localdisk.csi.acstor.io/accept-ephemeral-storage: "true" de volume persistente.

Striping de dados

Para maximizar o desempenho, o Armazenamento de Contêiner do Azure distribui automaticamente os dados em todos os discos NVMe locais disponíveis por VM. O striping é uma técnica na qual os dados são divididos em pedaços pequenos e gravados uniformemente em vários discos simultaneamente, o que aumenta a taxa de transferência e melhora o desempenho geral de E/S. Esse comportamento é habilitado por padrão e não pode ser desabilitado.

Como o desempenho é agregado entre esses dispositivos em striping, tamanhos maiores de VM que expõem mais unidades NVMe podem desbloquear IOPS e largura de banda substancialmente maiores. Selecionar uma família de VMs de maior porte permite que suas tarefas se beneficiem da taxa de transferência agregada extra sem configuração adicional.

Por exemplo, a série Lsv3 é dimensionada de uma única unidade NVMe de 1,92 TB em Standard_L8s_v3 (cerca de 400.000 IOPS e 2.000 MB/s) até 10 unidades NVMe em Standard_L80s_v3 (cerca de 3,8 milhões de IOPS e 20.000 MB/s).

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.77.0 ou posterior) da CLI do Azure. Consulte Como instalar a CLI do Azure. Evite o Azure Cloud Shell porque az upgrade não está disponível no Cloud Shell. Execute os comandos neste artigo com privilégios administrativos.

  • Examine as instruções de instalação e verifique se o Armazenamento de Contêineres do Azure está instalado corretamente.

  • Você precisa do cliente de linha de comando do Kubernetes. kubectl Você pode instalá-lo localmente executando o az aks install-cli comando.

  • 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

Os discos NVMe locais só estão disponíveis em determinados tipos de VMs, por exemplo, VMs com otimização de armazenamento ou VMs aceleradas por GPU. Se você planeja usar a capacidade de NVMe local, escolha um desses tamanhos 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 mostrada aqui.

az aks nodepool list --resource-group <resource group> --cluster-name <cluster name> --query "[].{PoolName:name, VmSize:vmSize}" -o table

A saída a seguir é um exemplo.

PoolName    VmSize
----------  ---------------
nodepool1   standard_l8s_v3

Observação

No Armazenamento de Contêineres do Azure (versão 2.x.x), agora você pode usar clusters com menos de três nós.

Criar e anexar volumes efêmeros genéricos

Se você ainda não fez isso, instale o Armazenamento de Contêineres do Azure.

Siga estas etapas para criar e anexar um volume efêmero genérico usando o Armazenamento de Contêineres do Azure.

1. Criar uma classe de armazenamento

Ao contrário das versões anteriores que exigiam a criação de um recurso de pool de armazenamento personalizado, o Armazenamento de Contêineres do Azure (versão 2.x.x) usa classes de armazenamento padrão do Kubernetes.

Siga estas etapas para criar uma classe de armazenamento usando NVMe local.

  1. Use seu editor de texto favorito para criar um arquivo de manifesto YAML, como code storageclass.yaml.

  2. Cole o seguinte código e salve o arquivo.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: local
    provisioner: localdisk.csi.acstor.io
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    
  3. Aplique o arquivo de manifesto YAML para criar o pool de armazenamento.

    kubectl apply -f storageclass.yaml
    

2. Verificar a classe de armazenamento

Execute o seguinte comando para verificar se a classe de armazenamento foi criada:

kubectl get storageclass local

Você deve ver uma saída semelhante a:

NAME    PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local   localdisk.csi.acstor.io    Delete          WaitForFirstConsumer   true                   10s

3. Implantar um pod com volume efêmero genérico

Crie um pod usando Fio (Testador de E/S Flexível) para comparação e simulação de carga de trabalho que usa um volume efêmero genérico.

  1. Use seu editor de texto favorito para criar um arquivo de manifesto YAML, como code fiopod.yaml.

  2. Cole o seguinte código e salve o arquivo.

    kind: Pod
    apiVersion: v1
    metadata:
      name: fiopod
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: fio
          image: mayadata/fio
          args: ["sleep", "1000000"]
          volumeMounts:
            - mountPath: "/volume"
              name: ephemeralvolume
      volumes:
        - name: ephemeralvolume
          ephemeral:
            volumeClaimTemplate:
              spec:
                volumeMode: Filesystem
                accessModes: ["ReadWriteOnce"]
                storageClassName: local
                resources:
                  requests:
                    storage: 10Gi
    
  3. Aplique o arquivo de manifesto YAML para implantar o pod.

    kubectl apply -f fiopod.yaml
    

4. Verificar a implantação e executar parâmetros de comparação

Verifique se o pod está em execução:

kubectl get pod fiopod

Você deve ver o pod no estado Running. Uma vez em execução, você pode executar um teste de benchmark do Fio:

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

Criar e anexar volumes persistentes com anotação de armazenamento efêmero

Embora volumes efêmeros genéricos sejam recomendados para armazenamento efêmero, o Armazenamento de Contêineres do Azure também dá suporte a volumes persistentes com armazenamento efêmero quando necessário para compatibilidade com cargas de trabalho existentes.

Observação

O Armazenamento de Contêineres do Azure (versão 2.x.x) usa a nova anotação localdisk.csi.acstor.io/accept-ephemeral-storage: "true" em vez da anterior acstor.azure.com/accept-ephemeral-storage: "true".

1. Criar uma classe de armazenamento (se ainda não tiver sido criada)

Se você ainda não fez isso, instale o Armazenamento de Contêineres do Azure.

Se você não criou uma classe de armazenamento que usa o NVMe local na seção anterior, crie uma agora:

  1. Use seu editor de texto favorito para criar um arquivo de manifesto YAML, como code storageclass.yaml.

  2. Cole o seguinte código e salve o arquivo.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: local
    provisioner: localdisk.csi.acstor.io
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    
  3. Aplique o arquivo de manifesto YAML para criar o pool de armazenamento.

    kubectl apply -f storageclass.yaml
    

2. Implantar um conjunto com estado com volumes persistentes

Se você precisar usar persistent volume claims que não estão vinculados ao ciclo de vida do pod, deve adicionar a localdisk.csi.acstor.io/accept-ephemeral-storage: "true" annotation. Os dados no volume são locais para o nó e são perdidos se o nó for excluído ou se o pod for movido para outro nó.

Aqui está um exemplo de conjunto com estado usando volumes persistentes com a anotação de armazenamento efêmero:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-lcd-lvm-annotation
  labels:
    app: busybox
spec:
  podManagementPolicy: Parallel
  serviceName: statefulset-lcd
  replicas: 10
  template:
    metadata:
      labels:
        app: busybox
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: statefulset-lcd
          image: mcr.microsoft.com/azurelinux/busybox:1.36
          command:
            - "/bin/sh"
            - "-c"
            - set -euo pipefail; trap exit TERM; while true; do date -u +"%Y-%m-%dT%H:%M:%SZ" >> /mnt/lcd/outfile; sleep 1; done
          volumeMounts:
            - name: persistent-storage
              mountPath: /mnt/lcd
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: busybox
  volumeClaimTemplates:
    - metadata:
        name: persistent-storage
        annotations:
          localdisk.csi.acstor.io/accept-ephemeral-storage: "true"
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: local
        resources:
          requests:
            storage: 10Gi

Salve e aplique este YAML para criar o StatefulSet com volumes persistentes.

kubectl apply -f statefulset-pvc.yaml

Gerenciar o armazenamento

Nesta seção, você aprenderá a verificar a capacidade do disco efêmero do nó, expandir a capacidade de armazenamento e excluir recursos de armazenamento.

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.

Verifique se existe um StorageClass para localdisk.csi.acstor.io . Execute o comando a seguir para verificar a capacidade disponível do disco temporário para cada nó.

kubectl get csistoragecapacities.storage.k8s.io -n kube-system -o custom-columns=NAME:.metadata.name,STORAGE_CLASS:.storageClassName,CAPACITY:.capacity,NODE:.nodeTopology.matchLabels."topology\.localdisk\.csi\.acstor\.io/node"

Você deverá ver uma saída semelhante ao seguinte exemplo:

NAME          STORAGE_CLASS   CAPACITY    NODE
csisc-2pkx4   local           1373172Mi   aks-storagepool-31410930-vmss000001
csisc-gnmm9   local           1373172Mi   aks-storagepool-31410930-vmss000000

Se encontrar uma saída de capacidade vazia, confirme a existência de um StorageClass para localdisk.csi.acstor.io. O recurso csistoragecapacities.storage.k8s.io só é gerado após a existência de um StorageClass para localdisk.csi.acstor.io .

Expandir a capacidade de armazenamento

Como o armazenamento em disco efêmero usa recursos locais nos nós de cluster do AKS, a expansão da capacidade de armazenamento requer a adição de nós ao cluster.

Para adicionar um nó ao seu cluster, execute o seguinte comando. Substitua <cluster-name>, <nodepool-name>, <resource-group>e <new-count> com seus valores.

az aks nodepool scale --cluster-name <cluster-name> --name <nodepool-name> --resource-group <resource-group> --node-count <new-count>

Excluir recursos de armazenamento

Para limpar os recursos de armazenamento, primeiro você deve excluir todos os PersistentVolumeClaims e/ou PersistentVolumes. Excluir a StorageClass do Armazenamento de Contêineres do Azure não remove automaticamente seus PersistentVolumes/PersistentVolumeClaims existentes.

Para excluir uma classe de armazenamento chamada local, execute o seguinte comando:

kubectl delete storageclass local

Confira também