Usar o driver CSI (Interface de Armazenamento de Contêiner) do Azure Files no Serviço Kubernetes do Azure (AKS)

O driver CSI (Azure Files Container Storage Interface) é um driver compatível com a especificação CSI usado pelo Serviço Kubernetes do Azure (AKS) para gerenciar o ciclo de vida dos compartilhamentos de arquivos do Azure. O CSI é um padrão para expor sistemas arbitrários de armazenamento de blocos e arquivos a cargas de trabalho em contêineres no Kubernetes.

Ao adotar e usar o CSI, o AKS agora pode escrever, implantar e iterar plug-ins para expor sistemas de armazenamento novos ou melhorar os existentes no Kubernetes. Usar drivers CSI no AKS evita ter que tocar no código principal do Kubernetes e esperar por seus ciclos de lançamento.

Para criar um cluster AKS com suporte a drivers CSI, consulte Habilitar drivers CSI no AKS.

Nota

Os drivers na árvore referem-se aos drivers de armazenamento atuais que fazem parte do código principal do Kubernetes versus os novos drivers CSI, que são plug-ins.

Novos recursos do driver CSI do Azure Files

Além dos recursos originais do driver na árvore, o driver CSI do Azure Files dá suporte aos seguintes novos recursos:

  • Network File System (NFS) versão 4.1
  • Ponto final privado
  • Criação de grandes quantidades de compartilhamentos de arquivos em paralelo.

Usar um volume persistente com Arquivos do Azure

Um volume persistente (PV) representa uma parte do armazenamento que é provisionada para uso com pods do Kubernetes. Um PV pode ser usado por um ou vários pods e pode ser provisionado dinamicamente ou estaticamente. Se vários pods precisarem de acesso simultâneo ao mesmo volume de armazenamento, você poderá usar os Arquivos do Azure para se conectar usando o protocolo SMB (Server Message Block) ou NFS. Este artigo mostra como criar dinamicamente um compartilhamento de Arquivos do Azure para uso por vários pods em um cluster AKS. Para provisionamento estático, consulte Criar e usar manualmente um volume com um compartilhamento de Arquivos do Azure.

Com os compartilhamentos do Azure Files, não há limite de quantos podem ser montados em um nó.

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

Criar PVs de Arquivos do Azure dinamicamente usando as classes de armazenamento internas

Uma classe de armazenamento é usada para definir como um compartilhamento de arquivos do Azure é criado. Uma conta de armazenamento é criada automaticamente no grupo de recursos do nó para uso com a classe de armazenamento para armazenar o compartilhamento de arquivos do Azure. Escolha uma das seguintes SKUs de redundância de armazenamento do Azure para skuName:

  • Standard_LRS: Armazenamento padrão com redundância local
  • Standard_GRS: Armazenamento com redundância geográfica padrão
  • Standard_ZRS: Armazenamento padrão com redundância de zona
  • Standard_RAGRS: Armazenamento padrão com redundância geográfica de acesso de leitura
  • Standard_RAGZRS: Armazenamento padrão com redundância de zona geográfica de acesso de leitura
  • Premium_LRS: Armazenamento com redundância local premium
  • Premium_ZRS: Armazenamento com redundância de zona Premium

Nota

O Azure Files dá suporte a compartilhamentos de arquivos do Azure Premium. A capacidade mínima de compartilhamento de arquivos é de 100 GiB. Recomendamos o uso de compartilhamentos de arquivos Premium do Azure em vez de compartilhamentos de arquivos Standard porque os compartilhamentos de arquivos Premium oferecem suporte de disco de baixo desempenho e baixa latência para cargas de trabalho intensivas de E/S.

Quando você usa drivers CSI de armazenamento no AKS, há mais dois internos StorageClasses que usam os drivers de armazenamento CSI do Azure Files. As outras classes de armazenamento CSI são criadas com o cluster ao lado das classes de armazenamento padrão na árvore.

  • azurefile-csi: Usa o Armazenamento Padrão do Azure para criar um compartilhamento de arquivos do Azure.
  • azurefile-csi-premium: Usa o Armazenamento Premium do Azure para criar um compartilhamento de arquivos do Azure.

A política de recuperação em ambas as classes de armazenamento garante que o compartilhamento de arquivos subjacentes do Azure seja excluído quando o respetivo PV for excluído. As classes de armazenamento também configuram os compartilhamentos de arquivos para serem expansíveis, você só precisa editar a declaração de volume persistente (PVC) com o novo tamanho.

Para usar essas classes de armazenamento, crie um PVC e seu respetivo pod que faça referência e os utilize. Um PVC é usado para provisionar automaticamente o armazenamento com base em uma classe de armazenamento. Um PVC pode usar uma das classes de armazenamento pré-criadas ou uma classe de armazenamento definida pelo usuário para criar um compartilhamento de arquivos do Azure para a SKU e o tamanho desejados. Quando você cria uma definição de pod, o PVC é especificado para solicitar o armazenamento desejado.

Crie um exemplo de PVC e pod que imprima a data atual em um outfile executando os comandos kubectl apply:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/pvc-azurefile-csi.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/nginx-pod-azurefile.yaml

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

persistentvolumeclaim/pvc-azurefile created
pod/nginx-azurefile created

Depois que o pod estiver no estado de execução, você poderá validar se o compartilhamento de arquivos está montado corretamente executando o seguinte comando e verificando se a saída contém o outfile:

kubectl exec nginx-azurefile -- ls -l /mnt/azurefile

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

total 29
-rwxrwxrwx 1 root root 29348 Aug 31 21:59 outfile

Criar uma classe de armazenamento personalizada

As classes de armazenamento padrão se adequam aos cenários mais comuns, mas não a todos. Para alguns casos, você pode querer ter sua própria classe de armazenamento personalizada com seus próprios parâmetros. Por exemplo, use o manifesto a seguir para configurar o mountOptions compartilhamento de arquivos.

O valor padrão para fileMode e dirMode é 0777 para compartilhamentos de arquivos montados no Kubernetes. Você pode especificar as diferentes opções de montagem no objeto de classe de armazenamento.

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

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: my-azurefile
provisioner: file.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0640
  - file_mode=0640
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict # https://linux.die.net/man/8/mount.cifs
  - nosharesock
parameters:
  skuName: Standard_LRS

Crie a classe de armazenamento executando o comando kubectl apply :

kubectl apply -f azure-file-sc.yaml

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

storageclass.storage.k8s.io/my-azurefile created

O driver CSI de Arquivos do Azure dá suporte à criação de instantâneos de volumes persistentes e compartilhamentos de arquivos subjacentes.

Nota

Este driver suporta apenas a criação de instantâneo, a restauração a partir do instantâneo não é suportada por este driver. Os instantâneos podem ser restaurados a partir do portal do Azure ou da CLI. Para obter mais informações sobre como criar e restaurar um instantâneo, consulte Visão geral de instantâneos de compartilhamento para Arquivos do Azure.

Crie uma classe de instantâneo de volume com o comando kubectl apply :

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshotclass-azurefile.yaml

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

volumesnapshotclass.snapshot.storage.k8s.io/csi-azurefile-vsc created

Crie um instantâneo de volume a partir do PVC que criamos dinamicamente no início deste tutorial, pvc-azurefile.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshot-azurefile.yaml

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

volumesnapshot.snapshot.storage.k8s.io/azurefile-volume-snapshot created

Verifique se o instantâneo foi criado corretamente executando o seguinte comando:

kubectl describe volumesnapshot azurefile-volume-snapshot

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

Name:         azurefile-volume-snapshot
Namespace:    default
Labels:       <none>
Annotations:  API Version:  snapshot.storage.k8s.io/v1beta1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2020-08-27T22:37:41Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  955091
  Self Link:         /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/azurefile-volume-snapshot
  UID:               c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
Spec:
  Source:
    Persistent Volume Claim Name:  pvc-azurefile
  Volume Snapshot Class Name:      csi-azurefile-vsc
Status:
  Bound Volume Snapshot Content Name:  snapcontent-c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
  Ready To Use:                        false
Events:                                <none>

Redimensionar um volume persistente

Pode pedir um volume maior para um PVC. Edite o objeto PVC e especifique um tamanho maior. Esta alteração aciona a expansão do volume subjacente que suporta o PV.

Nota

Um novo PV nunca é criado para satisfazer a reivindicação. Em vez disso, é redimensionado um volume existente.

Atualmente, a redução de volumes persistentes não é suportada.

No AKS, a classe de armazenamento integrada azurefile-csi já suporta expansão, por isso utilize o PVC criado anteriormente com esta classe de armazenamento. O PVC solicitou um compartilhamento de arquivos de 100 GiB. Podemos confirmar isso executando:

kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile

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

Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  100G  128K  100G   1% /mnt/azurefile

Expanda o PVC aumentando o spec.resources.requests.storage campo:

kubectl patch pvc pvc-azurefile --type merge --patch '{"spec": {"resources": {"requests": {"storage": "200Gi"}}}}'

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

persistentvolumeclaim/pvc-azurefile patched

Verifique se o PVC e o sistema de arquivos dentro do pod mostram o novo tamanho:

kubectl get pvc pvc-azurefile
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
pvc-azurefile   Bound    pvc-5e5d9980-da38-492b-8581-17e3cad01770   200Gi      RWX            azurefile-csi   64m

kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile
Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  200G  128K  200G   1% /mnt/azurefile

Usar um volume persistente com armazenamento privado de Arquivos do Azure (ponto de extremidade privado)

Se os recursos dos Arquivos do Azure estiverem protegidos com um ponto de extremidade privado, você deverá criar sua própria classe de armazenamento. Certifique-se de que configurou as definições de DNS para resolver o endereço IP do ponto de extremidade privado para o FQDN da cadeia de ligação. Personalize os seguintes parâmetros:

  • resourceGroup: O grupo de recursos onde a conta de armazenamento é implantada.
  • storageAccount: O nome da conta de armazenamento.
  • server: O FQDN do ponto de extremidade privado da conta de armazenamento.

Crie um arquivo chamado private-azure-file-sc.yamle, em seguida, cole o manifesto de exemplo a seguir no arquivo. Substitua os valores de <resourceGroup> e <storageAccountName>.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: private-azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  resourceGroup: <resourceGroup>
  storageAccount: <storageAccountName>
  server: <storageAccountName>.file.core.windows.net
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict  # https://linux.die.net/man/8/mount.cifs
  - nosharesock  # reduce probability of reconnect race
  - actimeo=30  # reduce latency for metadata-heavy workload

Crie a classe de armazenamento usando o kubectl apply comando:

kubectl apply -f private-azure-file-sc.yaml

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

storageclass.storage.k8s.io/private-azurefile-csi created

Crie um arquivo chamado private-pvc.yamle, em seguida, cole o seguinte manifesto de exemplo no arquivo:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: private-azurefile-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: private-azurefile-csi
  resources:
    requests:
      storage: 100Gi

Crie o PVC usando o comando kubectl apply :

kubectl apply -f private-pvc.yaml

Compartilhamentos de arquivos NFS

Os Arquivos do Azure dão suporte ao protocolo NFS v4.1. O suporte do NFS versão 4.1 para Arquivos do Azure fornece um sistema de arquivos NFS totalmente gerenciado como um serviço criado em uma plataforma de armazenamento resiliente distribuída altamente disponível e durável.

Esta opção é otimizada para cargas de trabalho de acesso aleatório com atualizações de dados in-loco e fornece suporte completo ao sistema de arquivos POSIX. Esta seção mostra como usar compartilhamentos NFS com o driver CSI do Arquivo do Azure em um cluster AKS.

Pré-requisitos

  • A identidade do plano de controle do cluster AKS (ou seja, o nome do cluster AKS) é adicionada à função de Colaborador na VNet e NetworkSecurityGroup.
  • A entidade de serviço ou a identidade de serviço gerenciado (MSI) do cluster AKS devem ser adicionadas à função de Colaborador da conta de armazenamento.

Nota

Você pode usar um ponto de extremidade privado em vez de permitir o acesso à VNet selecionada.

Otimizando as opções de tamanho de leitura e gravação

Esta seção fornece informações sobre como abordar o ajuste de desempenho NFS com o driver CSI dos Arquivos do Azure com as opções rsize e wsize. As opções rsize e wsize definem o tamanho máximo de transferência de uma operação NFS. Se rsize ou wsize não forem especificados na montagem, o cliente e o servidor negociarão o maior tamanho suportado pelos dois. Atualmente, os Arquivos NetApp do Azure e as distribuições Linux modernas oferecem suporte a tamanhos de leitura e gravação tão grandes quanto 1.048.576 Bytes (1 MiB).

O desempenho ideal baseia-se na comunicação eficiente cliente-servidor. Aumentar ou diminuir os valores de tamanho da opção de leitura e gravação de montagem pode melhorar o desempenho do NFS. O tamanho padrão dos pacotes de leitura/gravação transferidos entre cliente e servidor são 8 KB para NFS versão 2 e 32 KB para NFS versão 3 e 4. Esses padrões podem ser muito grandes ou muito pequenos. Reduzir o rsize e o wsize pode melhorar o desempenho do NFS em uma rede congestionada enviando pacotes menores para cada solicitação de resposta e gravação de leitura NFS. No entanto, isso pode aumentar o número de pacotes necessários para enviar dados pela rede, aumentando o tráfego total da rede e a utilização da CPU no cliente e no servidor.

É importante que você realize testes para encontrar um rsize e wsize que sustente a transferência de pacotes eficiente, onde não diminua a taxa de transferência e aumente a latência.

Para obter mais informações sobre como otimizar o rsize e o wsize, consulte Práticas recomendadas de opções de montagem do Linux NFS para arquivos NetApp do Azure.

Por exemplo, para configurar um máximo de rsize e wsize de 256-KiB, configure o mountOptions na classe de armazenamento da seguinte maneira:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30
  - rsize=262144
  - wsize=262144

Criar classe de armazenamento de compartilhamento de arquivos NFS

Crie um arquivo com o nome nfs-sc.yaml e copie o manifesto abaixo. Para obter uma lista de opções suportadas mountOptions, consulte Opções de montagem NFS.

Nota

vers, , minorversionsec são configurados pelo driver CSI do Arquivo do Azure. Não há suporte para a especificação de um valor em seu manifesto para essas propriedades.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30

Depois de editar e salvar o arquivo, crie a classe de armazenamento com o comando kubectl apply :

kubectl apply -f nfs-sc.yaml

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

storageclass.storage.k8s.io/azurefile-csi-nfs created

Criar uma implantação com um compartilhamento de arquivos apoiado por NFS

Você pode implantar um exemplo de conjunto stateful que salva carimbos de data/hora em um arquivo data.txt com o comando kubectl apply :

kubectl apply -f

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-azurefile
  labels:
    app: nginx
spec:
  podManagementPolicy: Parallel  # default is OrderedReady
  serviceName: statefulset-azurefile
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: statefulset-azurefile
          image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
          command:
            - "/bin/bash"
            - "-c"
            - set -euo pipefail; while true; do echo $(date) >> /mnt/azurefile/outfile; sleep 1; done
          volumeMounts:
            - name: persistent-storage
              mountPath: /mnt/azurefile
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  volumeClaimTemplates:
    - metadata:
        name: persistent-storage
      spec:
        storageClassName: azurefile-csi-nfs
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 100Gi

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

statefulset.apps/statefulset-azurefile created

Valide o conteúdo do volume executando o seguinte comando:

kubectl exec -it statefulset-azurefile-0 -- df -h

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

Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda1                                                                                 29G   11G   19G  37% /etc/hosts
accountname.file.core.windows.net:/accountname/pvc-fa72ec43-ae64-42e4-a8a2-556606f5da38  100G     0  100G   0% /mnt/azurefile
...

Nota

Observe que, como o compartilhamento de arquivos NFS está em uma conta Premium, o tamanho mínimo de compartilhamento de arquivos é de 100 GiB. Se você criar um PVC com um tamanho de armazenamento pequeno, poderá encontrar um erro semelhante ao seguinte: falha ao criar compartilhamento de arquivos ... tamanho (5)....

Contentores do Windows

O driver CSI de Arquivos do Azure também dá suporte a nós e contêineres do Windows. Para usar contêineres do Windows, siga o início rápido de contêineres do Windows para adicionar um pool de nós do Windows.

Depois de ter um pool de nós do Windows, use as classes de armazenamento internas como azurefile-csi ou crie uma personalizada. Você pode implantar um exemplo de conjunto stateful baseado no Windows que salva carimbos de data/hora em um arquivo data.txt executando o comando kubectl apply :

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/windows/statefulset.yaml

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

statefulset.apps/busybox-azurefile created

Valide o conteúdo do volume executando o seguinte comando kubectl exec :

kubectl exec -it busybox-azurefile-0 -- cat c:\\mnt\\azurefile\\data.txt # on Linux/MacOS Bash
kubectl exec -it busybox-azurefile-0 -- cat c:\mnt\azurefile\data.txt # on Windows Powershell/CMD

A saída dos comandos é semelhante ao seguinte exemplo:

2020-08-27 22:11:01Z
2020-08-27 22:11:02Z
2020-08-27 22:11:04Z
(...)

Próximos passos