Criar e utilizar um volume com Discos do Azure no Azure Kubernetes Service (AKS)

Um volume persistente representa uma parte do armazenamento provisionado para uso com pods do Kubernetes. Você pode usar um volume persistente com um ou vários pods e provisioná-lo dinamicamente ou estaticamente. Este artigo mostra como criar dinamicamente volumes persistentes com Discos do Azure em um cluster do Serviço Kubernetes do Azure (AKS).

Nota

Um disco do Azure só pode ser montado com o tipo de modo de acesso ReadWriteOnce, que o torna disponível para um nó no AKS. Esse modo de acesso ainda permite que vários pods acessem o volume quando os pods são executados no mesmo nó. Para obter mais informações, consulte Modos de acesso Kubernetes PersistentVolume.

Este artigo mostra-lhe como:

  • Trabalhe com um volume persistente dinâmico (PV) instalando o driver CSI (Container Storage Interface) e criando dinamicamente um ou mais discos gerenciados do Azure para anexar a um pod.
  • Trabalhe com um PV estático criando um ou mais discos gerenciados do Azure ou use um existente e anexe-o a um pod.

Para obter mais informações sobre volumes do Kubernetes, consulte Opções de armazenamento para aplicativos no AKS.

Antes de começar

  • Verifique se você tem a CLI do Azure versão 2.0.59 ou posterior instalada e configurada. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

  • O driver CSI do Azure Disk tem um limite de volume por nó. A contagem de volumes muda com base no tamanho do pool de nós/nós. Execute o comando kubectl get para determinar o número de volumes que podem ser alocados por nó:

    kubectl get CSINode <nodename> -o yaml
    

Provisionar dinamicamente um volume

Esta seção fornece orientação para administradores de cluster que desejam provisionar um ou mais volumes persistentes que incluem detalhes do armazenamento em disco do Azure para uso por uma carga de trabalho. Uma declaração de volume persistente (PVC) usa o objeto de classe de armazenamento para provisionar dinamicamente um contêiner de armazenamento do Azure Disk.

Parâmetros de classe de armazenamento para PersistentVolumes dinâmicos

A tabela a seguir inclui parâmetros que você pode usar para definir uma classe de armazenamento personalizada para seu PersistentVolumeClaim.

Nome Significado Valor disponível Obrigatório Default value
skuName Tipo de conta de armazenamento do Azure Disks (alias: storageAccountType) Standard_LRS, Premium_LRS, StandardSSD_LRS, PremiumV2_LRS, UltraSSD_LRS, Premium_ZRS, StandardSSD_ZRS Não StandardSSD_LRS
fsType Tipo de sistema de arquivos ext4, ext3, ext2, xfs, para btrfs Linux, ntfs para Windows Não ext4 para Linux, ntfs para Windows
Modo de armazenamento em cache Configuração de cache do host do disco de dados do Azure None, ReadOnly, ReadWrite Não ReadOnly
resourceGroup Especificar o grupo de recursos para os Discos do Azure Nome do grupo de recursos existente Não Se estiver vazio, o driver usará o mesmo nome de grupo de recursos do cluster AKS atual
DiskIOPSReadWrite Capacidade de disco UltraSSD ou SSD Premium v2 IOPS (mínimo: 2 IOPS/GiB) 100~160000 Não 500
DiskMBpsReadWrite Capacidade de taxa de transferência de disco UltraSSD ou SSD Premium v2 (mínimo: 0,032/GiB) 1~2000 Não 100
LogicalSectorSize Tamanho do setor lógico em bytes para ultra disco. Os valores suportados são 512 ad 4096. 4096 é o padrão. 512, 4096 Não 4096
etiquetas Tags de disco do Azure Formato da etiqueta: key1=val1,key2=val2 Não ""
diskEncryptionSetID ResourceId do conjunto de criptografia de disco a ser usado para habilitar a criptografia em repouso Formato: /subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} Não ""
diskEncryptionType Tipo de criptografia do conjunto de criptografia de disco. EncryptionAtRestWithCustomerKey(por defeito), EncryptionAtRestWithPlatformAndCustomerKeys Não ""
writeAcceleratorEnabled Acelerador de Escrita em Discos do Azure true, false Não ""
networkAccessPolicy Propriedade NetworkAccessPolicy para impedir a geração do URI SAS para um disco ou um instantâneo AllowAll, DenyAll, AllowPrivate Não AllowAll
diskAccessID ID do recurso do Azure do recurso DiskAccess para usar pontos de extremidade privados em discos Não ``
enableBursting Habilite o bursting sob demanda além do destino de desempenho provisionado do disco. O bursting sob demanda só deve ser aplicado ao disco Premium e quando o tamanho > do disco for de 512 GB. Ultra e disco compartilhado não é suportado. O bursting está desativado por padrão. true, false Não false
UserAgent Agente de usuário usado para atribuição de uso do cliente Não Useragent gerado formatado driverName/driverVersion compiler/version (OS-ARCH)
ID da subscrição Especifique a ID da assinatura do Azure onde os Discos do Azure são criados. Id de subscrição do Azure Não Se não estiver vazio, resourceGroup deve ser fornecido.
--- Os seguintes parâmetros são apenas para v2 --- --- ---
maxAções O número total de montagens de disco compartilhadas permitidas para o disco. Definir o valor como 2 ou mais habilita réplicas de anexo. Os valores suportados dependem do tamanho do disco. Consulte Partilhar um disco gerido do Azure para obter valores suportados. Não 1
maxMountReplicaCount O número de anexos de réplicas a serem mantidos. Esse valor deve estar no intervalo [0..(maxShares - 1)] Não Se accessMode for ReadWriteMany, o padrão é 0. Caso contrário, o padrão é maxShares - 1

Classes de armazenamento incorporadas

As classes de armazenamento definem como uma unidade de armazenamento é criada dinamicamente com um volume persistente. Para obter mais informações sobre classes de armazenamento do Kubernetes, consulte Classes de armazenamento do Kubernetes.

Cada cluster AKS inclui quatro classes de armazenamento pré-criadas, duas delas configuradas para funcionar com Discos do Azure:

  1. A classe de armazenamento padrão provisiona um disco do Azure SSD padrão.
    • As SSD padrão apoiam o armazenamento padrão e fornecem armazenamento económico e, ao mesmo tempo, proporcionam um desempenho fiável.
  2. A classe de armazenamento managed-csi-premium provisiona um Disco do Azure premium.
    • Discos de alto desempenho e baixa latência baseados em SSD de volta aos discos Premium. Eles são ideais para VMs que executam cargas de trabalho de produção. Ao usar o driver CSI do Disco do Azure no AKS, você também pode usar a classe de armazenamento, que é apoiada managed-csi pelo armazenamento localmente redundante (LRS) SSD padrão.

A redução do tamanho de um PVC não é suportada devido ao risco de perda de dados. Você pode editar uma classe de armazenamento existente usando o kubectl edit sc comando ou pode criar sua própria classe de armazenamento personalizada. Por exemplo, se você quiser usar um disco de tamanho 4 TiB, você deve criar uma classe de armazenamento que define cachingmode: None porque o cache de disco não é suportado para discos de 4 TiB e maiores. Para obter mais informações sobre classes de armazenamento e como criar sua própria classe de armazenamento, consulte Opções de armazenamento para aplicativos no AKS.

Você pode ver as classes de armazenamento pré-criadas usando o kubectl get sc comando. O exemplo a seguir mostra as classes de armazenamento pré-criadas disponíveis em um cluster AKS:

kubectl get sc

A saída do comando é semelhante ao seguinte exemplo:

NAME                PROVISIONER                AGE
default (default)   disk.csi.azure.com         1h
managed-csi         disk.csi.azure.com         1h

Nota

As declarações de volume persistente são especificadas em GiB, mas os discos gerenciados do Azure são cobrados por SKU para um tamanho específico. Essas SKUs variam de 32GiB para discos S4 ou P4 a 32TiB para discos S80 ou P80 (em visualização). A taxa de transferência e o desempenho de IOPS de um disco gerenciado Premium dependem da SKU e do tamanho da instância dos nós no cluster AKS. Para obter mais informações, consulte Preço e desempenho de discos gerenciados.

Criar uma declaração de volume persistente

Uma declaração de volume persistente (PVC) provisiona automaticamente o armazenamento com base em uma classe de armazenamento. Nesse caso, um PVC pode usar uma das classes de armazenamento precriadas para criar um disco gerenciado padrão ou premium do Azure.

  1. Crie um arquivo nomeado azure-pvc.yaml e copie no manifesto a seguir. A declaração solicita um disco chamado azure-managed-disk que tem 5 GB de tamanho com acesso ReadWriteOnce . A classe de armazenamento managed-csi é especificada como a classe de armazenamento.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
        name: azure-managed-disk
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: managed-csi
      resources:
        requests:
          storage: 5Gi
    

Gorjeta

Para criar um disco que usa armazenamento premium, use storageClassName: managed-csi-premium em vez de managed-csi.

  1. Crie a declaração de volume persistente usando o kubectl apply comando e especifique seu arquivo azure-pvc.yaml .

    kubectl apply -f azure-pvc.yaml
    

    A saída do comando é semelhante ao seguinte exemplo:

    persistentvolumeclaim/azure-managed-disk created
    

Usar o volume persistente

Depois de criar a declaração de volume persistente, você deve verificar se ela tem um status de Pending. O Pending status indica que ele está pronto para ser usado por um pod.

  1. Verifique o status do PVC usando o kubectl describe pvc comando.

    kubectl describe pvc azure-managed-disk
    

    A saída do comando é semelhante ao seguinte exemplo condensado:

    Name:            azure-managed-disk
    Namespace:       default
    StorageClass:    managed-csi
    Status:          Pending
    [...]
    
  2. Crie um arquivo nomeado azure-pvc-disk.yaml e copie no manifesto a seguir. Esse manifesto cria um pod NGINX básico que usa a declaração de volume persistente chamada azure-managed-disk para montar o disco do Azure no caminho /mnt/azure. Para contêineres do Windows Server, especifique um mountPath usando a convenção de caminho do Windows, como 'D:'.

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - mountPath: "/mnt/azure"
              name: volume
              readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-managed-disk
    
  3. Crie o pod usando o kubectl apply comando.

     kubectl apply -f azure-pvc-disk.yaml
    

    A saída do comando é semelhante ao seguinte exemplo:

    pod/mypod created
    
  4. Agora você tem um pod em execução com seu disco do Azure montado no /mnt/azure diretório. Verifique a configuração do pod usando o kubectl describe comando.

     kubectl describe pod mypod
    

    A saída do comando é semelhante ao seguinte exemplo:

    [...]
    Volumes:
      volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  azure-managed-disk
        ReadOnly:   false
       default-token-smm2n:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-smm2n
        Optional:    false
    [...]
     Events:
      Type    Reason                 Age   From                               Message
      ----    ------                 ----  ----                               -------
      Normal  Scheduled              2m    default-scheduler                  Successfully assigned mypod to aks-nodepool1-79590246-0
      Normal  SuccessfulMountVolume  2m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "default-token-smm2n"
      Normal  SuccessfulMountVolume  1m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242"
    [...]
    

Utilizar os discos ultra do Azure

Para usar o Ultra Disk do Azure, consulte Usar ultradiscos no Serviço Kubernetes do Azure (AKS).

Usando marcas do Azure

Para obter mais informações sobre como usar marcas do Azure, consulte Usar marcas do Azure no Serviço Kubernetes do Azure (AKS).

Provisionar estaticamente um volume

Esta seção fornece orientação para administradores de cluster que desejam criar um ou mais volumes persistentes que incluem detalhes dos Discos do Azure para uso por uma carga de trabalho.

Parâmetros de provisionamento estático para um volume persistente

A tabela a seguir inclui parâmetros que você pode usar para definir um volume persistente.

Nome Significado Valor disponível Obrigatório Default value
volumeHandle URI de disco do Azure /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} Sim N/A
volumeAttributes.fsType Tipo de sistema de ficheiros ext4, ext3, ext2, xfs, para btrfs Linux, ntfs para Windows Não ext4 para Linux, ntfs para Windows
volumeAttributes.partição Número da partição do disco existente (suportado apenas no Linux) 1, 2, 3 Não Vazio (sem partição)
- Certifique-se de que o formato da partição é como -part1
volumeAttributes.cachingMode Configuração do cache do host de disco None, ReadOnly, ReadWrite Não ReadOnly

Criar um disco do Azure

Ao criar um disco do Azure para uso com o AKS, você pode criar o recurso de disco no grupo de recursos do nó. Essa abordagem permite que o cluster AKS acesse e gerencie o recurso de disco. Se, em vez disso, você criar o disco em um grupo de recursos separado, deverá conceder à identidade gerenciada do Serviço Kubernetes do Azure (AKS) para seu cluster a Contributor função para o grupo de recursos do disco.

  1. Identifique o nome do grupo de recursos usando o az aks show comando e adicione o --query nodeResourceGroup parâmetro.

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    

    A saída do comando é semelhante ao seguinte exemplo:

    MC_myResourceGroup_myAKSCluster_eastus
    
  2. Crie um disco usando o az disk create comando. Especifique o nome do grupo de recursos do nó e um nome para o recurso de disco, como myAKSDisk. O exemplo a seguir cria um disco de 20GiB e gera a ID do disco depois que ele é criado. Se você precisar criar um disco para uso com contêineres do Windows Server, adicione o --os-type windows parâmetro para formatar corretamente o disco.

    az disk create \
      --resource-group MC_myResourceGroup_myAKSCluster_eastus \
      --name myAKSDisk \
      --size-gb 20 \
      --query id --output tsv
    

    Nota

    Os Discos do Azure são cobrados por SKU para um tamanho específico. Essas SKUs variam de 32GiB para discos S4 ou P4 a 32TiB para discos S80 ou P80 (em visualização). A taxa de transferência e o desempenho de IOPS de um disco gerenciado Premium dependem da SKU e do tamanho da instância dos nós no cluster AKS. Consulte Preços e desempenho de discos gerenciados.

    O ID do recurso de disco é exibido assim que o comando for concluído com êxito, conforme mostrado na saída do exemplo a seguir. Use o ID do disco para montar o disco na próxima seção.

    /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
    

Montar disco como um volume

  1. Crie um arquivo pv-azuredisk.yaml com um PersistentVolume. Atualize volumeHandle com o ID do recurso de disco da etapa anterior. Para contêineres do Windows Server, especifique ntfs para o parâmetro fsType.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: disk.csi.azure.com
      name: pv-azuredisk
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: managed-csi
      csi:
        driver: disk.csi.azure.com
        volumeHandle: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
        volumeAttributes:
          fsType: ext4
    
  2. Crie um arquivo pvc-azuredisk.yaml com um PersistentVolumeClaim que usa o PersistentVolume.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-azuredisk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      volumeName: pv-azuredisk
      storageClassName: managed-csi
    
  3. Crie o PersistentVolume e o PersistentVolumeClaim usando o kubectl apply comando e faça referência aos dois arquivos YAML que você criou.

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. Verifique se seu PersistentVolumeClaim foi criado e vinculado ao PersistentVolume usando o kubectl get pvc comando.

    kubectl get pvc pvc-azuredisk
    

    A saída do comando é semelhante ao seguinte exemplo:

    NAME            STATUS   VOLUME         CAPACITY    ACCESS MODES   STORAGECLASS   AGE
    pvc-azuredisk   Bound    pv-azuredisk   20Gi        RWO                           5s
    
  5. Crie um arquivo azure-disk-pod.yaml para fazer referência a seu PersistentVolumeClaim. Para contêineres do Windows Server, especifique um mountPath usando a convenção de caminho do Windows, como 'D:'.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        name: mypod
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
          - name: azure
            mountPath: /mnt/azure
      volumes:
        - name: azure
          persistentVolumeClaim:
            claimName: pvc-azuredisk
    
  6. Aplique a configuração e monte o volume usando o kubectl apply comando.

    kubectl apply -f azure-disk-pod.yaml
    

Clean up resources (Limpar recursos)

Quando terminar de usar os recursos criados neste artigo, você poderá removê-los usando o kubectl delete comando.

# Remove the pod
kubectl delete -f azure-pvc-disk.yaml

# Remove the persistent volume claim
kubectl delete -f azure-pvc.yaml

Próximos passos