Partilhar via


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

Os aplicativos baseados em contêiner geralmente precisam acessar e persistir dados em um volume de dados externo. Se vários pods precisarem de acesso simultâneo ao mesmo volume de armazenamento, você poderá usar o armazenamento de Blob do Azure para se conectar usando blobfuse ou NFS (Network File System ).

Este artigo mostra-lhe como:

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

  • Habilite o driver CSI de armazenamento de Blob no cluster AKS.

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

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

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

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 de Blob 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 de Blob do Azure.

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

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

Nome Descrição Exemplo Obrigatório Default value
skuName Especifique um tipo de conta de armazenamento do Azure (alias: storageAccountType). Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS Não Standard_LRS
localização Especifique um local do Azure. eastus Não Se estiver vazio, o driver usará o mesmo nome de local do cluster atual.
resourceGroup Especifique um nome de grupo de recursos do Azure. myResourceGroup Não Se estiver vazio, o driver usará o mesmo nome de grupo de recursos do cluster atual.
storageAccount Especifique um nome de conta de armazenamento do Azure. storageAccountName -Não Quando um nome de conta de armazenamento específico não é fornecido, o driver procurará uma conta de armazenamento adequada que corresponda às configurações da conta dentro do mesmo grupo de recursos. Se não conseguir 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á deverá 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 será 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 AKS, adicione o nome do cluster AKS à função de Colaborador no grupo de recursos que hospeda a VNET.
protocolo Especifique a montagem de blobfuse ou a montagem NFSv3. fuse, nfs Não fuse
containerName Especifique o nome do contêiner (diretório) existente. contentor Não Se estiver vazio, o driver cria um novo nome de contêiner, começando com pvc-fuse para blobfuse ou pvc-nfs para NFS v3.
containerNamePrefix Especifique o prefixo do diretório de armazenamento do Azure criado pelo driver. meu Só pode conter letras minúsculas, números, hífenes e o comprimento 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. Não Se estiver vazio, o driver usa o nome de domínio DNS padrão <storage-account>.blob.core.windows.net ou de outra conta soberana de armazenamento em nuvem.
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
storageEndpointSufixo Especifique o sufixo do ponto de extremidade de armazenamento do Azure. core.windows.net Não Se estiver vazio, o driver usará o sufixo de ponto de extremidade de armazenamento padrão de acordo com o ambiente de nuvem.
etiquetas As tags seriam criadas em uma nova conta de armazenamento. Formato da tag: 'foo=aaa,bar=bbb' Não ""
matchTags Corresponder tags quando o driver tenta encontrar uma conta de armazenamento adequada. true,false Não false
--- Os seguintes parâmetros são apenas para blobfuse --- --- ---
ID da subscrição Especifique a ID da assinatura do Azure onde o diretório de armazenamento de blob será criado. Id de subscrição do Azure Não Se não estiver vazio, resourceGroup deve ser fornecido.
storeAccountKey Especifique a chave da conta de armazenamento 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 secreto para armazenar a chave da conta. Não
secretNamespace Especifique o namespace de secret para armazenar a chave da conta. default,kube-system, etc. Não Espaço de nomes em PVC
isHnsEnabled Habilite Hierarchical namespace para a conta de armazenamento do Azure Data Lake. true,false Não false
--- Os seguintes parâmetros são apenas para o protocolo NFS --- --- ---
mountPermissions Especifique as permissões de pasta montada. A predefinição é 0777. Se definido como 0, o driver não será executado chmod após a montagem. 0777 Não

1 Se a conta de armazenamento for criada pelo driver, você só precisará especificar networkEndpointType: privateEndpoint o parâmetro 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 integrada

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

  1. Crie um arquivo nomeado blob-nfs-pvc.yaml e copie no seguinte YAML.

    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
    

Uma vez concluído, o contêiner de armazenamento de Blob será criado. Você pode usar o comando kubectl get para visualizar 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 Blob do Azure no caminho '/mnt/blob'.

  1. Crie um arquivo chamado blob-nfs-pve copie no seguinte YAML. Certifique-se de que o claimName corresponde ao PVC criado na etapa anterior.

    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 seguinte comando para criar um novo arquivo chamado test.txt.

    kubectl exec mypod -- touch /mnt/blob/test.txt
    
  4. Para validar se o disco está montado corretamente, execute o seguinte comando e verifique se você vê o test.txt arquivo 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 adequam aos cenários mais comuns, mas não a todos. Em alguns casos, você pode querer 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 blobfuse.

Classe de armazenamento usando o protocolo NFS

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

  1. Crie um arquivo chamado blob-nfs-sc.yaml, e cole o seguinte manifesto de exemplo:

    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 usando blobfuse e monta um contêiner de armazenamento de Blob. Use-o para atualizar o parâmetro skuName .

  1. Crie um arquivo chamado blobfuse-sc.yaml, e cole o seguinte manifesto de exemplo:

    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 estaticamente um volume

Esta seção fornece orientação para administradores de cluster que desejam criar um ou mais volumes persistentes que incluam detalhes do armazenamento de Blob para uso 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 Default value
volumeHandle Especifique um valor que o driver pode usar para identificar exclusivamente o contêiner de blob de armazenamento no cluster. Uma maneira recomendada de produzir um valor exclusivo é combinar o nome da conta de armazenamento globalmente exclusivo e o nome do contêiner: {account-name}_{container-name}.
Nota: O #caractere , / é reservado para uso interno e não pode ser usado em uma alça de volume.
Sim
volumeAttributes.resourceGroup Especifique o nome do grupo de recursos do Azure. myResourceGroup Não Se estiver vazio, o driver usará o mesmo nome de grupo de recursos do cluster atual.
volumeAttributes.storageAccount Especifique um nome de conta de armazenamento do Azure existente. storageAccountName Sim
volumeAttributes.containerName Especifique o nome do contêiner existente. contentor Sim
volumeAttributes.protocol Especifique a montagem de blobfuse ou a montagem NFS v3. fuse, nfs Não fuse
--- Os seguintes parâmetros 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). Não
volumeAttributes.secretNamespace Especifique o namespace de secret para armazenar a chave da conta. default Não Espaço de nomes em pvc
nodeStageSecretRef.name Especifique o nome secreto que armazena um dos seguintes:
azurestorageaccountkey
azurestorageaccountsastoken
msisecret
azurestoragespnclientsecret.
Não Nome secreto existente do Kubernetes
nodeStageSecretRef.namespace Especifique o namespace de secret. Espaço de nomes do Kubernetes Sim
--- Os seguintes parâmetros são apenas para o protocolo NFS --- --- ---
volumeAttributes.mountPermissions Especifique as permissões de pasta montada. 0777 Não
--- Os parâmetros a seguir são apenas para a configuração de VNet NFS: --- --- ---
vnetResourceGroup Especifique o grupo de recursos VNet que hospeda a rede virtual. myResourceGroup Não Se estiver vazio, o driver usará o vnetResourceGroup valor especificado no arquivo de configuração da nuvem do Azure.
vnetName Especifique o nome da rede virtual. aksVNet Não Se estiver vazio, o driver usará o vnetName valor especificado no arquivo de configuração da nuvem do Azure.
Nome da sub-rede Especifique o nome da sub-rede existente do nó do agente. aksSubnet Não Se estiver vazio, o driver usará o valor no arquivo de configuração de subnetName nuvem do Azure.
--- Os seguintes parâmetros 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 Não Key
volumeAttributes.AzureStorageIdentityClientID Especifique o ID do cliente de identidade. Não
volumeAttributes.AzureStorageIdentityResourceID Especifique o ID do recurso de identidade. Não
volumeAttributes.MSIEndpoint Especifique o ponto de extremidade MSI. Não
volumeAttributes.AzureStorageSPNClientID Especifique a ID do Cliente do Nome da Entidade de Serviço (SPN) do Azure. Não
volumeAttributes.AzureStorageSPNTenantID Especifique a ID do Locatário do SPN do Azure. Não
volumeAttributes.AzureStorageAADEndpoint Especifique o ponto de extremidade do Microsoft Entra. Não
--- Os seguintes parâmetros são apenas para o recurso: blobfuse ler chave de conta ou token SAS do cofre de chaves --- --- ---
volumeAttributes.keyVaultURL Especifique o nome DNS do Azure Key Vault. {nome do cofre}.vault.azure.net Não
volumeAttributes.keyVaultSecretName Especifique o nome secreto do Cofre da Chave do Azure. Nome secreto existente do Cofre da Chave do Azure. Não
volumeAttributes.keyVaultSecretVersion Versão secreta do Azure Key Vault. Versão existente Não Se estiver vazio, o driver usa a versão atual.

Criar um contêiner de armazenamento de Blob

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

Para este 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 --query nodeResourceGroup parâmetro query. O exemplo a seguir obtém o grupo de recursos de nó para o cluster 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 em Gerenciar armazenamento de blob para autorizar o acesso e, em seguida, crie o contêiner.

Volume de montagem

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

A montagem do armazenamento de Blob usando o protocolo NFS v3 não é autenticada usando uma chave de conta. Seu cluster AKS precisa residir na mesma rede virtual ou emparelhada que 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 Mount Blob Storage by using the Network File System (NFS) 3.0 protocol.

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

  1. Crie um arquivo nomeado pv-blob-nfs.yaml e copie no seguinte YAML. Em storageClass, atualizar resourceGroup, storageAccounte containerName.

    Nota

    volumeHandle value deve ser um volumeID exclusivo para cada contêiner de blob de armazenamento idêntico no cluster. O caractere # 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
    

    Nota

    Embora o atributo de capacidade da API do Kubernetes seja obrigatório, esse valor não é usado pelo driver CSI de armazenamento de Blob do Azure porque você pode gravar dados de forma flexível até atingir o limite de capacidade da sua conta de armazenamento. O valor do atributo é usado apenas para correspondência de capacity tamanho entre PersistentVolumes e PersistentVolumeClaims. Recomendamos o uso de 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 fazendo referência ao arquivo YAML criado anteriormente:

    kubectl create -f pv-blob-nfs.yaml
    
  3. Crie um pvc-blob-nfs.yaml arquivo 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 fazendo 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 chamada pvc-blob criada anteriormente para montar o armazenamento de Blob do /mnt/blob Azure no caminho.

  1. Crie um arquivo chamado nginx-pod-blob.yamle copie no seguinte YAML. Certifique-se de que o claimName corresponde ao PVC criado na etapa anterior ao criar um volume persistente para 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 fazendo 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 Blob 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óximos passos