Criar e usar um volume com Discos do Azure no AKS (Serviço de Kubernetes do Azure)

Um volume persistente representa uma parte do armazenamento que foi provisionada para uso com pods do Kubernetes. Você pode usar um volume persistente com um ou muitos pods e ele pode ser provisionado dinamicamente ou estaticamente. Este artigo mostra como criar dinamicamente volumes persistentes com o Azure Disks em um cluster do Serviço de Kubernetes do Azure (AKS).

Observação

Um disco do Azure só pode ser montado com o modo de aceso do tipo ReadWriteOnce, que o torna disponível para apenas um único nó no AKS. Este 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, confira Modos de acesso ao PersistentVolume do Kubernetes.

Este artigo mostra como:

  • Trabalhe com um volume persistente (PV) dinâmico instalando o driver da Interface de Armazenamento de Contêiner (CSI) 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 o Kubernetes, veja Opções de armazenamento para aplicativos no AKS.

Antes de começar

  • Certifique-se de possuir a CLI do Azure versão 2.0.59 ou posterior instalada e configurada. Execute az --version para encontrar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.

  • O driver CSI do Disco do Azure tem um limite de volume por nó. A contagem de volumes é alterada com base no tamanho do nó/pool de 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 um volume dinamicamente

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

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 customizada para seu PersistentVolumeClaim.

Nome Significado Valor disponível Obrigatório Valor padrão
skuName Tipo de conta de armazenamento para Discos do Azure (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 e btrfs para Linux, ntfs para Windows Não ext4 para Linux, ntfs para Windows
cachingMode Configuração do Cache do Host do Azure Data Disk None, ReadOnly, ReadWrite Não ReadOnly
resourceGroup Especifique o grupo de recursos para os Discos do Azure. Nome do grupo de recursos existente Não Se estiver vazio, o driver usa o mesmo nome de grupo de recursos que o cluster do AKS atual está usando.
DiskIOPSReadWrite Disco UltraSSD ou Premium SSD v2 Capacidade IOPS (mínimo: 2 IOPS/GiB) 100~160000 Não 500
DiskMBpsReadWrite Disco UltraSSD ou Premium SSD v2 Capacidade de taxa de transferência (mínimo: 0,032/GiB) 1~2000 Não 100
LogicalSectorSize Tamanho do setor lógico em bytes para disco ultra. Os valores compatíveis são 512 e 4096. O padrão é 4096. 512, 4096 Não 4096
marcas Marcas do Disco do Azure Formato de marca: 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 padrão),EncryptionAtRestWithPlatformAndCustomerKeys Não ""
writeAcceleratorEnabled Acelerador de Gravação nos Discos do Azure true, false Não ""
networkAccessPolicy Propriedade NetworkAccessPolicy para impedir que a geração de URI de 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 deve ser aplicado somente em disco Premium e quando o tamanho do disco > for 512 GB. Não há suporte para disco Ultra e compartilhado. O bursting está desabilitado 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)
subscriptionID Especificar a ID da assinatura do Azure em que os Discos do Azure são criados. ID de assinatura do Azure Não Se não estiver vazio, resourceGroup deverá ser fornecido.
--- Os parâmetros a seguir são apenas para a v2 --- --- ---
maxShares O número total de montagens de disco compartilhado permitidas para o disco. Definir o valor como 2 ou mais habilita réplicas de anexo. Os valores com suporte dependem do tamanho do disco. Confira Compartilhar um disco gerenciado do Azure para obter os valores com suporte. Não 1
maxMountReplicaCount O número de anexos de réplicas a serem mantidos. Esse valor deve estar no intervalo [0..(maxShares - 1)] No Se accessMode for ReadWriteMany, o padrão será 0. Caso contrário, o padrão será maxShares - 1

Classes de armazenamento internas

Uma classe de armazenamento é usada para definir como uma unidade de armazenamento é criada dinamicamente com um volume persistente. Para obter mais informações sobre classes de armazenamento Kubernetes, confira Classes de Armazenamento Kubernetes.

Cada cluster do AKS inclui quatro classes de armazenamento criadas previamente, com duas delas configuradas para funcionar com os discos do Azure:

  1. A classe de armazenamento padrão provisiona um disco SSD padrão do Azure.
    • O armazenamento padrão tem o suporte de SSDs padrão e fornece armazenamento econômico e desempenho confiável.
  2. A classe de armazenamento managed-csi-premium provisiona um disco Premium do Azure.
    • Apoiados por disco de baixa latência e alto desempenho baseado em SSD. 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 managed-csi, que é suportada pelo armazenamento SSD Standard com redundância local (LRS).

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 comando kubectl edit sc ou criar sua própria classe de armazenamento personalizada. Por exemplo, para usar um disco de tamanho 4 TiB, você precisa criar uma classe de armazenamento que defina cachingmode: None, pois o cache de disco não tem suporte em discos 4 TIB ou maiores. Para obter mais informações sobre classes de armazenamento e como criar a sua, consulte Opções de armazenamento para aplicativos no AKS.

Você pode ver as classes de armazenamento pré-criadas por meio do comando kubectl get sc. O exemplo a seguir mostra as classes de armazenamento criadas previamente disponíveis dentro de um cluster do 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

Observação

Declarações de volume persistentes 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 32 GiB para discos S4 ou P4 a 32 TiB para discos S80 ou P80 (na 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 do AKS. Para saber mais, confira Preços e desempenho dos discos gerenciados.

Criar uma declaração de volume persistente

Uma declaração de volume persistente (PVC) é usado para provisionar automaticamente o armazenamento com base em uma classe de armazenamento. Nesse caso, uma PVC pode usar uma das classes de armazenamento pré-criadas para criar um disco gerenciado standard ou premium do Azure.

  1. Crie um arquivo chamado azure-pvc.yaml e copie-o para o manifesto a seguir. A declaração solicita um disco chamado azure-managed-disk que tenha 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
    

Dica

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

  1. Crie a declaração de volume persistente por meio do comando kubectl apply 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 status Pending indica que está pronto para ser usado por um pod.

  1. Verifique o status do pod por meio do comando kubectl describe pvc.

    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 chamado azure-pvc-disk.yaml e copie-o para o manifesto a seguir. O manifesto a seguir 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 comando kubectl apply.

     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 o disco do Azure montado no diretório /mnt/azure. Verifique a configuração do pod por meio do comando kubectl describe.

     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"
    [...]
    

Usar os Discos Ultra do Azure

Para usar o disco ultra do Azure, consulte Usar discos ultra no AKS (Serviço de Kubernetes do Azure).

Uso de marcas do Azure

Para mais informações como usar as marcas do Azure, confira Usar as marcas do Azure no AKS (Serviço de Kubernetes do Azure).

Provisionar um volume estaticamente

Essa secção fornece orientação para administradores de cluster que pretendem criar um ou mais volumes persistentes que incluam detalhes de Discos Azure para utilização 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 Valor padrão
volumeHandle URI do disco do Azure /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} Sim N/D
volumeAttributes.fsType Tipo do sistema de arquivos ext4, ext3, ext2, xfs e btrfs para Linux, ntfs para Windows Não ext4 para Linux, ntfs para Windows
volumeAttributes.partition Número de partição do disco existente (com suporte apenas no Linux) 1, 2, 3 Não Vazio (sem partição)
– Verifique se o formato da partição é semelhante a -part1
volumeAttributes.cachingMode Configuração do cache do host de disco None, ReadOnly, ReadWrite Não ReadOnly

Criar um disco do Azure

Quando você cria um disco do Azure para uso com o AKS, pode criar o recurso de disco no grupo de recursos . Essa abordagem permite que o cluster do 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 AKS (Serviço de Kubernetes do Azure) para seu cluster a função Contributor para o grupo de recursos do disco.

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

    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 comando az disk create. Especifique o nome do grupo de recursos do nó obtido no comando anterior e, em seguida, um nome para o recurso de disco, como myAKSDisk. O exemplo a seguir cria um disco de 20 GiB e gera a ID do disco após a criação. Se você precisar criar um disco para usar com contêineres do Windows Server, adicione o parâmetro --os-type windows para formatar corretamente o disco.

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

    Observação

    Os Discos do Azure são cobrados por SKU de um tamanho específico. Essas SKUs variam de 32GiB para discos S4 ou P4 a 32TiB para discos S80 ou P80 (na versão prévia). 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 do AKS. Confira Preços e desempenho do Managed Disks.

    A ID de recurso de disco é exibida depois que o comando foi concluído com êxito, conforme mostra o seguinte exemplo de saída. Essa ID do disco é usada para montar o disco na próxima seção.

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

Montar o disco como um volume

  1. Crie um arquivo pv-azuredisk.yaml com um PersistentVolume. Atualize volumeHandle com a ID do recurso de disco da etapa anterior. No caso de 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 uma 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 PersistentVolume e PersistentVolumeClaim pode meio do comando kubectl apply 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 o PersistentVolumeClaim foi criado e associado ao PersistentVolume por meio do comando kubectl get pvc.

    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 referenciar a 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 por meio do comando kubectl apply.

    kubectl apply -f azure-disk-pod.yaml
    

Limpar os recursos

Quando terminar os recursos criados neste artigo, você poderá removê-los por meio do comando kubectl delete.

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

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

Próximas etapas