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.
Nota
Lembre-se de que o driver CSI de Arquivo do Azure só permite a montagem de compartilhamentos de arquivos SMB usando autenticação baseada em chave (NTLM v2) e, portanto, não oferece suporte ao perfil de segurança máxima das configurações de compartilhamento de Arquivos do Azure. Por outro lado, a montagem de compartilhamentos de arquivos NFS não requer autenticação baseada em chave.
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.
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.yaml
e, 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.yaml
e, 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
, minorversion
, sec
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
- Para saber como usar o driver CSI para discos do Azure, consulte Usar discos do Azure com driver CSI.
- 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 mais informações sobre práticas recomendadas de armazenamento, consulte Práticas recomendadas para armazenamento e backups no Serviço Kubernetes do Azure.
Azure Kubernetes Service