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.
- Para criar uma conta ADLS usando o driver no provisionamento dinâmico, especifique
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
- Por padrão, o cache blobfuse está localizado no
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.
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
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'.
Crie um arquivo chamado
blob-nfs-pv
e 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
Crie o pod com o comando kubectl apply :
kubectl apply -f blob-nfs-pv.yaml
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
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 .
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
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 .
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.
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.
Crie um arquivo nomeado
pv-blob-nfs.yaml
e copie no seguinte YAML. EmstorageClass
, atualizarresourceGroup
,storageAccount
econtainerName
.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.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
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
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.
Crie um arquivo chamado
nginx-pod-blob.yaml
e 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
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
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
- Para saber como usar o driver CSI para o armazenamento de Blob do Azure, consulte Usar o armazenamento de Blob do Azure com o driver CSI.
- Para obter as práticas recomendadas associadas, consulte Práticas recomendadas para armazenamento e backups no AKS.
Azure Kubernetes Service