Crie e use um volume com o Armazenamento de Blobs do Azure no AKS (Serviço de Kubernetes do Azure)

Aplicativos baseados em contêiner geralmente precisam acessar e manter dados em um volume de dados externo. Se vários pods precisarem de acesso simultâneo ao mesmo volume de armazenamento, use o Armazenamento de Blobs do Azure para se conectar usando blobfuse ou o NFS (Network File System).

Este artigo mostra como:

  • Trabalhe com um PV (volume persistente) dinâmico instalando o driver da CSI (Interface de Armazenamento de Contêiner) e criando dinamicamente um contêiner do Armazenamento de Blobs do Azure para anexar a um pod.
  • Trabalhe com um PV estático criando um contêiner de Armazenamento de Blobs 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

  • Habilite o driver da CSI do armazenamento de Blobs no cluster do AKS.

  • Para dar suporte a uma conta de armazenamento do Azure DataLake Gen2 ao usar a montagem de blobfuse, você precisará fazer o seguinte:

    • Para criar uma conta do ADLS usando o driver no provisionamento dinâmico, especifique isHnsEnabled: "true" nos parâmetros da classe de armazenamento.
    • Para habilitar o acesso do blobfuse a uma conta do ADLS no provisionamento estático, especifique a opção de montagem --use-adls=true no volume persistente.
    • Se você quiser habilitar uma conta de armazenamento com Namespace Hierárquico, os volumes persistentes existentes deverão ser remontados com a opção de montagem --use-adls=true.
  • Sobre o cache de blobfuse

    • Por padrão, o cache de blobfuse está localizado no diretório /mnt. Se a SKU da VM fornecer um disco temporário, o diretório /mnt será montado no disco temporário. No entanto, se a SKU da VM não fornecer um disco temporário, o diretório /mnt será montado no disco do sistema operacional. Você poderá definir a opção de montagem --tmp-path= para especificar um diretório de cache diferente

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 Blobs do Azure a ser usado 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 de Blobs do Azure.

Parâmetros de classe de armazenamento para volumes persistentes dinâmicos

A tabela a seguir inclui parâmetros que você pode usar para definir uma classe de armazenamento personalizada para sua reivindicação de volume persistente.

Nome Descrição Exemplo Obrigatório Valor padrão
skuName Especifique um tipo de conta de armazenamento em disco do Azure (alias: storageAccountType). Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS Não Standard_LRS
local Especifique uma localização do Azure. eastus No Se estiver vazio, o driver usará o mesmo nome de local do cluster atual.
resourceGroup Especifique o nome do grupo de recursos do Azure. myResourceGroup No Se estiver vazio, o driver usará o mesmo nome de grupo de recursos que o cluster atual.
storageAccount Especifique um nome de armazenamento em disco do Azure. storageAccountName Não Quando um nome de conta de armazenamento específico não for fornecido, o driver procurará uma conta de armazenamento adequada que corresponda às configurações da conta no mesmo grupo de recursos. Se ele não encontrar uma conta de armazenamento correspondente, criará uma nova. No entanto, se um nome de conta de armazenamento for especificado, a conta de armazenamento já deve existir.
networkEndpointType Especifique o tipo de ponto de extremidade de rede para a conta de armazenamento criada pelo driver. Se privateEndpoint for especificado, um ponto de extremidade privado é criado para a conta de armazenamento. Para outros casos, um ponto de extremidade de serviço será criado para o protocolo NFS.1 privateEndpoint Não Para um cluster do AKS, adicione o nome do cluster do AKS à função Colaborador no grupo de recursos que hospeda a VNET.
protocolo Especifique a montagem de blobfuse ou a montagem de NFSv3. fuse, nfs Não fuse
containerName Especifique o nome do contêiner existente (diretório). contêiner No Se estiver vazio, o driver criará um novo nome de contêiner, começando com pvc-fuse blobfuse ou pvc-nfs para NFS v3.
containerNamePrefix Especifique o prefixo do diretório de armazenamento do Azure criado pelo driver. my Só pode conter letras minúsculas, números, hifens e comprimento que deve ter menos de 21 caracteres. Não
Servidor Especifique o nome de domínio da conta de armazenamento do Azure. Nome de domínio DNS da conta de armazenamento existente, por exemplo <storage-account>.privatelink.blob.core.windows.net. No Se estiver vazio, o driver usará o nome de domínio DNS da conta de armazenamento em nuvem soberana ou padrão <storage-account>.blob.core.windows.net.
allowBlobPublicAccess Permitir ou não permitir o acesso público a todos os blobs ou contêineres para a conta de armazenamento criada pelo driver. true,false Não false
storageEndpointSuffix Especifique o sufixo do ponto de extremidade de armazenamento do Azure. core.windows.net No Se estiver vazio, o driver usará o sufixo de ponto de extremidade de armazenamento padrão de acordo com o ambiente de nuvem.
tags Tags seriam criadas na nova conta de armazenamento. Formato da tag: 'foo=aaa,bar=bbb' Não ""
matchTags Corresponder tags quando o driver tentar encontrar uma conta de armazenamento adequada. true,false Não false
--- Os parâmetros a seguir são apenas para blobfuse --- --- ---
subscriptionID Especifique a ID de assinatura do Azure em que o diretório de armazenamento de blobs será criado. ID de assinatura do Azure Não Se não estiver vazio, resourceGroup deverá ser fornecido.
storeAccountKey Especifique a chave da conta de repositório para o segredo do Kubernetes.

Observação:
false significa que o driver usa a identidade kubelet para obter a chave da conta.
true,false Não true
secretName Especifique o nome do segredo para armazenar a chave da conta. No
secretNamespace Especifique o namespace do segredo para armazenar a chave da conta. default,kube-system, etc. No namespace Pvc
isHnsEnabled Habilite Hierarchical namespace para a conta de armazenamento do Azure Data Lake. true,false Não false
--- Os parâmetros a seguir são apenas para o protocolo NFS --- --- ---
mountPermissions Especifique permissões de pasta montadas. O padrão é 0777. Se definido como 0, o driver não executará chmod após a montagem. 0777 Não

1 Se a conta de armazenamento for criada pelo driver, você só precisará especificar o parâmetro networkEndpointType: privateEndpoint na classe de armazenamento. O driver CSI cria o ponto de extremidade privado junto com a conta. Se você trouxer sua própria conta de armazenamento, precisará criar o ponto de extremidade privado para a conta de armazenamento.

Criar uma declaração de volume persistente usando a classe de armazenamento interna

Uma declaração de volume persistente (PVC) usa o objeto de classe de armazenamento para provisionar dinamicamente um contêiner de armazenamento de Blobs do Azure. O YAML a seguir pode ser usado para criar uma declaração de volume persistente de 5 GB de tamanho com acesso do tipo ReadWriteMany. Para obter mais informações sobre os modos de acesso, veja a documentação sobre Volume persistente de Kubernetes.

  1. Crie um arquivo chamado blob-nfs-pvc.yaml e copie no YAML a seguir.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azure-blob-storage
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: azureblob-nfs-premium
      resources:
        requests:
          storage: 5Gi
    
  2. Crie a declaração de volume persistente com o comando kubectl create:

    kubectl create -f blob-nfs-pvc.yaml
    

Depois de concluído, o contêiner de armazenamento de Blobs será criado. Use o comando kubectl get para exibir o status do PVC:

kubectl get pvc azure-blob-storage

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

NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                AGE
azure-blob-storage   Bound    pvc-b88e36c5-c518-4d38-a5ee-337a7dda0a68   5Gi        RWX            azureblob-nfs-premium       92m

Usar a declaração de volume persistente

O YAML a seguir cria um pod que usa a declaração de volume persistente azure-blob-storage para montar o armazenamento de blobs do Azure no caminho `/mnt/blob'.

  1. Crie um arquivo chamado blob-nfs-pv e copie no YAML a seguir. Certifique-se de que claimName corresponda ao PVC criado na última etapa.

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

    kubectl apply -f blob-nfs-pv.yaml
    
  3. Depois que o pod estiver no estado de execução,execute o comando a seguir para criar um arquivo chamado test.txt.

    kubectl exec mypod -- touch /mnt/blob/test.txt
    
  4. Para validar que o disco está montado corretamente execute o seguinte comando e verifique se está vendo o arquivo test.txt na saída:

    kubectl exec mypod -- ls /mnt/blob
    

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

    test.txt
    

Criar uma classe de armazenamento personalizada

As classes de armazenamento padrão se adaptam aos cenários mais comuns, mas não a todos. Em alguns casos, talvez você queira ter sua própria classe de armazenamento personalizada com seus próprios parâmetros. Nesta seção, fornecemos dois exemplos. O primeiro usa o protocolo NFS e o segundo usa o Blobfuse.

Classe de armazenamento usando o protocolo NFS

Neste exemplo, o manifesto a seguir configura a montagem de um contêiner de armazenamento de Blobs usando o protocolo NFS. Use-o para adicionar o parâmetro de marcas.

  1. Crie um arquivo chamado blob-nfs-sc.yaml e cole de acordo com o manifesto de exemplo a seguir.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azureblob-nfs-premium
    provisioner: blob.csi.azure.com
    parameters:
      protocol: nfs
      tags: environment=Development
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    mountOptions:
      - nconnect=4
    
  2. Crie a classe de armazenamento com o comando kubectl apply:

    kubectl apply -f blob-nfs-sc.yaml
    

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

    storageclass.storage.k8s.io/blob-nfs-premium created
    

Classe de armazenamento usando blobfuse

Neste exemplo, o manifesto a seguir configura o uso de blobfuse e monta um contêiner do Armazenamento de Blobs. Use-o para atualizar o parâmetro skuName.

  1. Crie um arquivo chamado blobfuse-sc.yaml e cole de acordo com o manifesto de exemplo a seguir.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: azureblob-fuse-premium
    provisioner: blob.csi.azure.com
    parameters:
      skuName: Standard_GRS  # available values: Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    mountOptions:
      - -o allow_other
      - --file-cache-timeout-in-seconds=120
      - --use-attr-cache=true
      - --cancel-list-on-mount-seconds=10  # prevent billing charges on mounting
      - -o attr_timeout=120
      - -o entry_timeout=120
      - -o negative_timeout=120
      - --log-level=LOG_WARNING  # LOG_WARNING, LOG_INFO, LOG_DEBUG
      - --cache-size-mb=1000  # Default will be 80% of available memory, eviction will happen beyond that.
    
  2. Crie a classe de armazenamento com o comando kubectl apply:

    kubectl apply -f blobfuse-sc.yaml
    

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

    storageclass.storage.k8s.io/blob-fuse-premium created
    

Provisionar um volume estaticamente

Esta seção fornece diretrizes para administradores de cluster que desejam criar um ou mais volumes persistentes que incluem detalhes do Armazenamento de Blobs do Azure a ser usado por uma carga de trabalho.

Parâmetros de provisionamento estático para volumes persistentes

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

Nome Descrição Exemplo Obrigatório Valor padrão
volumeHandle Especifique um valor que o driver possa usar para identificar exclusivamente o contêiner de blob de armazenamento no cluster. Uma maneira recomendada de produzir um valor exclusivo é combinar o nome globalmente exclusivo da conta de armazenamento e o nome do contêiner: {account-name}_{container-name}.
Observação: os caracteres # e / são reservados para uso interno e não podem ser usados em um identificador de volume.
Sim
volumeAttributes.resourceGroup Especifique o nome do grupo de recursos do Azure. myResourceGroup No Se estiver vazio, o driver usa o mesmo nome de grupo de recursos que o cluster atual está usando.
volumeAttributes.storageAccount Especifique o nome de uma conta de armazenamento do Azure existente. storageAccountName Yes
volumeAttributes.containerName Especifique o nome do contêiner existente. contêiner Sim
volumeAttributes.protocol Especifique a montagem de blobfuse ou a montagem de NFS v3. fuse, nfs Não fuse
--- Os parâmetros a seguir são apenas para blobfuse --- --- ---
volumeAttributes.secretName Nome secreto que armazena o nome e a chave da conta de armazenamento (aplica-se apenas ao SMB). No
volumeAttributes.secretNamespace Especifique o namespace do segredo para armazenar a chave da conta. default No namespace Pvc
nodeStageSecretRef.name Especifique o nome do segredo que armazena um dos seguintes:
azurestorageaccountkey
azurestorageaccountsastoken
msisecret
azurestoragespnclientsecret.
Não Nome do segredo do Kubernetes existente
nodeStageSecretRef.namespace Especifique o namespace do segredo. Namespace do Kubernetes Yes
--- Os parâmetros a seguir são apenas para o protocolo NFS --- --- ---
volumeAttributes.mountPermissions Especifique permissões de pasta montadas. 0777 No
--- Os parâmetros a seguir são apenas para o Configuração de rede virtual do NFS --- --- ---
vnetResourceGroup Especifique o grupo de recursos da VNet que hospeda a rede virtual. myResourceGroup No Se estiver vazio, o driver usará o valor vnetResourceGroup especificado no arquivo de configuração de nuvem do Azure.
vnetName Especifique o nome da rede virtual. aksVNet No Se estiver vazio, o driver usará o valor vnetName especificado no arquivo de configuração de nuvem do Azure.
subnetName Especifique o nome da sub-rede existente do nó do agente. aksSubnet No Se estiver vazio, o driver usará o valor subnetName no arquivo de configuração de nuvem do Azure.
--- Os parâmetros a seguir são apenas para o recurso: blobfuse
Autenticação de identidade gerenciada e Nome da Entidade de Serviço
--- --- ---
volumeAttributes.AzureStorageAuthType Especifique o tipo de autenticação. Key, SAS, MSI, SPN No Key
volumeAttributes.AzureStorageIdentityClientID Especifique a ID do Cliente de Identidade. Não
volumeAttributes.AzureStorageIdentityResourceID Especifique a ID do Recurso de Identidade. No
volumeAttributes.MSIEndpoint Especifique o ponto de extremidade do MSI. No
volumeAttributes.AzureStorageSPNClientID Especifique a ID do cliente SPN (Nome da Entidade de Serviço do Azure). No
volumeAttributes.AzureStorageSPNTenantID Especifique a ID do Locatário do SPN do Azure. No
volumeAttributes.AzureStorageAADEndpoint Especifique o ponto de extremidade do Microsoft Entra. Não
--- Os seguintes parâmetros são apenas para o recurso: blobfuse lê a chave da conta ou o token SAS do cofre de chaves --- --- ---
volumeAttributes.keyVaultURL Especifique o nome DNS do Azure Key Vault. {vault-name}.vault.azure.net No
volumeAttributes.keyVaultSecretName Especifique o nome do segredo do Azure Key Vault. Nome do segredo do Azure Key Vault existente. No
volumeAttributes.keyVaultSecretVersion Versão do segredo do Azure Key Vault. Versão existente No Se estiver vazio, o driver usará a versão atual.

Crie um contêiner de armazenamento de Blob

Ao criar um recurso de armazenamento de Blobs do Azure para uso com o AKS, pode criar o recurso no grupo de recursos nó. Essa abordagem permite que o cluster do AKS acesse e gerencie o recurso de armazenamento de blobs.

Neste artigo, crie o contêiner no grupo de recursos do nó. Primeiro, obtenha o nome do grupo de recursos com o comando az aks show e adicione o parâmetro de consulta --query nodeResourceGroup. O exemplo a seguir recebe o grupo de recursos do nó para o cluster do AKS chamado myAKSCluster no grupo de recursos chamado myResourceGroup:

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

Em seguida, crie um contêiner para armazenar blobs seguindo as etapas no Gerenciamento do armazenamento de blobs para autorizar o acesso e, em seguida, criar o contêiner.

Montar volume

Nesta seção, você monta o volume persistente usando o protocolo NFS ou o Blobfuse.

A montagem do armazenamento de Blobs usando o protocolo NFS v3 não se autentica usando uma chave de conta. Seu cluster do AKS precisa residir na mesma rede virtual ou rede virtual emparelhada como o nó do agente. A única maneira de proteger os dados em sua conta de armazenamento é usando uma rede virtual e outras configurações de segurança de rede. Para obter mais informações sobre como configurar o acesso NFS à sua conta de armazenamento, consulte oArmazenamento de Blobs de Montagem usando o protocolo NFS (Sistema de Arquivos de Rede) 3.0.

O exemplo a seguir demonstra como montar um contêiner de armazenamento de Blobs como um volume persistente usando o protocolo NFS.

  1. Crie um arquivo chamado pv-blob-nfs.yaml e copie no YAML a seguir. EmstorageClass, atualizar resourceGroup, storageAccount e containerName.

    Observação

    O valor volumeHandle deve ser um volumeID exclusivo para cada contêiner de blob de armazenamento idêntico no cluster. Os caracteres # e / são reservados para uso interno e não podem ser usados.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: blob.csi.azure.com
      name: pv-blob
    spec:
      capacity:
        storage: 1Pi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain  # If set as "Delete" container would be removed after pvc deletion
      storageClassName: azureblob-nfs-premium
      mountOptions:
        - nconnect=4
      csi:
        driver: blob.csi.azure.com
        # make sure volumeid is unique for every identical storage blob container in the cluster
        # character `#` and `/` are reserved for internal use and cannot be used in volumehandle
        volumeHandle: account-name_container-name
        volumeAttributes:
          resourceGroup: resourceGroupName
          storageAccount: storageAccountName
          containerName: containerName
          protocol: nfs
    

    Observação

    Embora o atributo capacity da API do Kubernetes seja obrigatório, esse valor não é usado pelo driver da CSI do Armazenamento de Blobs do Azure porque você pode gravar dados de modo flexível até atingir o limite de capacidade de sua conta de armazenamento. O valor do atributo capacity é usado apenas para correspondência de tamanho entre PersistentVolumes e PersistentVolumeClaims. É recomendável usar um valor alto fictício. O pod vê um volume montado com um tamanho fictício de 5 Petabytes.

  2. Execute o seguinte comando para criar o volume persistente usando o comando kubectl create que faz referência ao arquivo YAML criado anteriormente:

    kubectl create -f pv-blob-nfs.yaml
    
  3. Crie um arquivo pvc-blob-nfs.yaml com um PersistentVolumeClaim. Por exemplo:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-blob
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      volumeName: pv-blob
      storageClassName: azureblob-nfs-premium
    
  4. Execute o seguinte comando para criar a declaração de volume persistente usando o comando kubectl create que faz referência ao arquivo YAML criado anteriormente:

    kubectl create -f pvc-blob-nfs.yaml
    

Usar o volume persistente

O YAML a seguir cria um pod que usa o volume persistente ou a declaração de volume persistente denominada pvc-blob criada anteriormente para montar o Armazenamento de Blobs do Azure no caminho /mnt/blob.

  1. Crie um arquivo chamado nginx-pod-blob.yaml e copie no YAML a seguir. Verifique se o claimName corresponde ao PVC criado na etapa anterior ao criar um volume persistente para o NFS ou Blobfuse.

    kind: Pod
    apiVersion: v1
    metadata:
      name: nginx-blob
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine
          name: nginx-blob
          volumeMounts:
            - name: blob01
              mountPath: "/mnt/blob"
              readOnly: false
      volumes:
        - name: blob01
          persistentVolumeClaim:
            claimName: pvc-blob
    
  2. Execute o seguinte comando para criar o pod e montar o PVC usando o comando kubectl create que faz referência ao arquivo YAML criado anteriormente:

    kubectl create -f nginx-pod-blob.yaml
    
  3. Execute o seguinte comando para criar uma sessão de shell interativa com o pod para verificar o armazenamento de Blobs montado:

    kubectl exec -it nginx-blob -- df -h
    

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

    Filesystem      Size  Used Avail Use% Mounted on
    ...
    blobfuse         14G   41M   13G   1% /mnt/blob
    ...
    

Próximas etapas