Usar o driver da CSI (Interface de Armazenamento de Contêiner) para Discos do Azure no AKS (Serviço de Kubernetes do Azure)
O driver da CSI (Interface de Armazenamento de Contêiner) para Discos do Azure é um driver em conformidade com a especificação CSI usada pelo AKS (Serviço de Kubernetes do Azure) para gerenciar o ciclo de vida do Disco do Azure.
A CSI é um padrão para expor sistemas de blocos e de armazenamento de arquivos arbitrários a cargas de trabalho em contêineres no Kubernetes. Ao adotar e usar a CSI, o AKS pode escrever, implantar e iterar plug-ins para expor novos sistemas de armazenamento ou aprimorar os existentes no Kubernetes. O uso de drivers CSI no AKS evita ter que tocar no código principal do Kubernetes e aguardar os ciclos de lançamento dele.
Para criar um cluster do AKS com suporte ao driver da CSI, confira Habilitar drivers da CSI no AKS. Este artigo descreve como usar o driver da CSI do Azure Data Box Disk versão 1.
Observação
O driver da CSI do Azure Data Box Disk v2 (versão prévia) melhora a escalabilidade e reduz a latência de failover do pod. Ele usa discos compartilhados para provisionar réplicas de anexo em vários nós de cluster e integra-se ao agendamento de pod para garantir que um nó com uma réplica de anexo seja escolhido no failover do pod. O driver da CSI do Azure Data Box Disk v2 (versão prévia) também fornece a capacidade de ajustar o desempenho. Se você estiver interessado em participar da versão prévia, envie uma solicitação: https://aka.ms/DiskCSIv2Preview. Essa versão prévia é fornecida sem um contrato de nível de serviço, e você pode esperar, ocasionalmente, alterações significativas durante a versão prévia. A versão prévia não é recomendada para cargas de trabalho de produção. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.
Observação
O termo Drivers na árvore refere-se a drivers de armazenamento atuais que fazem parte do código principal do Kubernetes versus os novos drivers da CSI, que são plug-ins.
Recursos do driver da CSI do Azure Data Box Disk
Além dos recursos do driver na árvore, a CSI do Azure Data Box Disk dá suporte aos seguintes recursos:
- Melhorias de desempenho durante a anexação e a desanexação de disco simultâneo
- Os drivers na árvore anexam ou desanexam discos em série, enquanto os drivers da CSI anexam ou desanexam discos em lote. Há uma melhoria significativa quando vários discos são anexados a um nó.
- Há suporte para SSD Premium v1 e v2.
PremiumV2_LRS
suporta apenas o modo de cacheNone
- Suporte de disco para o ZRS (armazenamento com redundância de zona)
- Há suporte para os tipos de disco
Premium_ZRS
,StandardSSD_ZRS
. O disco ZRS pode ser agendado no nó de zona ou que não é de zona, sem a restrição de que o volume de disco deve estar localizado na mesma zona que determinado nó. Para obter mais informações, incluindo quais regiões têm suporte, consulte Armazenamento com redundância de zona para discos gerenciados.
- Há suporte para os tipos de disco
- Instantâneo
- Clone de volume
- Redimensionar o PV do disco sem tempo de inatividade
Observação
Dependendo da SKU da VM que esteja sendo usada, o driver da CSI do Azure Data Box Disk pode ter um limite de volume por nó. Para algumas VMs avançadas (por exemplo, de 16 núcleos), o limite é de 64 volumes por nó. Para identificar o limite segundo o SKU da VM, examine a coluna Máximo de discos de dados de cada SKU de VM oferecida. Para obter uma lista dos SKUs de VM oferecidos e os limites de capacidade detalhados correspondentes, consulte Tamanhos de máquina virtual de uso geral.
Usar volumes persistentes da CSI com Discos do Azure
Um PV (volume persistente) representa um armazenamento provisionado para uso com pods do Kubernetes. Um PV pode ser usado por um ou vários pods e pode ser provisionado estática ou dinamicamente. Este artigo mostra como criar dinamicamente PVs com Discos do Azure para uso por um só pod em um cluster do AKS. Para provisionamento estático, confira Criar um volume estático com Discos do Azure.
Para obter mais informações sobre o Kubernetes, veja Opções de armazenamento para aplicativos no AKS.
Criar dinamicamente PVs de Discos do Azure usando as classes de armazenamento internas
Uma classe de armazenamento é usada para definir como uma unidade de armazenamento é criada dinamicamente com um volume persistente. Para obter mais informações sobre classes de armazenamento Kubernetes, confira Classes de Armazenamento Kubernetes.
Quando você usa o driver da CSI do Azure Data Box Disk no AKS, há mais dois StorageClasses
internos que usam o driver de armazenamento da CSI do Azure Data Box Disk. As outras classes de armazenamento da CSI são criadas com o cluster juntamente com as classes de armazenamento padrão na árvore.
managed-csi
: usa o LRS (armazenamento com redundância local) do Azure SSD Standard para criar um disco gerenciado. A partir do Kubernetes versão 1.29, em clusters do AKS (Serviço de Kubernetes do Azure) implantados em várias zonas de disponibilidade, essa classe de armazenamento utiliza o ZRS (armazenamento com redundância de zona) para Standard SSD do Azure, para criar discos gerenciados.managed-csi-premium
: usa o LRS Premium do Azure para criar um disco gerenciado. A partir do Kubernetes versão 1.29, em clusters do AKS (Serviço de Kubernetes do Azure) implantados em várias zonas de disponibilidade, essa classe de armazenamento utiliza o ZRS (armazenamento com redundância de zona) Premium do Azure, para criar discos gerenciados.
A política de recuperação em ambas as classes de armazenamento garante que os Discos do Azure subjacentes sejam excluídos, quando o respectivo PV for excluído. As classes de armazenamento também configuram o PVs para que sejam expansíveis. Você só precisa editar a PVC (declaração de volume persistente) com o novo tamanho.
Para usar essas classes de armazenamento, crie uma PVC e o respectivo pod que a referencie e utilize. Uma PVC é usada para provisionar automaticamente o armazenamento com base em uma classe de armazenamento. Uma PVC pode usar uma das classes de armazenamento criadas previamente ou uma classe de armazenamento definida pelo usuário para criar um disco gerenciado pelo Azure para o SKU e o tamanho desejados. Quando você cria uma definição de pod, a PVC é especificada para solicitar o armazenamento desejado.
Criar um pod de exemplo e a respectiva PVC executando o comando kubectl apply:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/pvc-azuredisk-csi.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/nginx-pod-azuredisk.yaml
A saída do comando é semelhante ao seguinte exemplo:
persistentvolumeclaim/pvc-azuredisk created
pod/nginx-azuredisk created
Depois que o pod estiver no estado de execução,execute o comando a seguir para criar um arquivo chamado test.txt
.
kubectl exec nginx-azuredisk -- touch /mnt/azuredisk/test.txt
Para validar que o disco está montado corretamente execute o seguinte comando e verifique se você exibe o arquivo test.txt
na saída:
kubectl exec nginx-azuredisk -- ls /mnt/azuredisk
lost+found
outfile
test.txt
Criar uma classe de armazenamento personalizada
As classes de armazenamento padrão são adequadas para os cenários mais comuns. Para alguns casos, talvez você queira ter a própria classe de armazenamento personalizada com os próprios parâmetros. Por exemplo, pode ser que você queira alterar a classe volumeBindingMode
.
Você pode usar uma classe volumeBindingMode: Immediate
que garante que isso ocorra imediatamente depois da criação da PVC. Quando os pools de nós são restritos à topologia, por exemplo, ao usar zonas de disponibilidade, o PVs serão associados ou provisionados sem o conhecimento dos requisitos de agendamento do pod.
Para resolver esse cenário, você pode usar volumeBindingMode: WaitForFirstConsumer
, que atrasa a associação e o provisionamento de um VP até que um pod que usa a PVC seja criado. Assim, o PV está em conformidade e é provisionado na zona de disponibilidade (ou em outra topologia) especificada pelas restrições de agendamento do pod. As classes de armazenamento padrão usam a classe volumeBindingMode: WaitForFirstConsumer
.
Crie um arquivo chamado sc-azuredisk-csi-waitforfirstconsumer.yaml
e cole o manifesto a seguir: A classe de armazenamento é igual à classe de armazenamento managed-csi
, mas com uma classe volumeBindingMode
diferente.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: azuredisk-csi-waitforfirstconsumer
provisioner: disk.csi.azure.com
parameters:
skuname: StandardSSD_LRS
allowVolumeExpansion: true
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
Crie a classe de armazenamento executando o comando kubectl apply e especifique seu arquivo sc-azuredisk-csi-waitforfirstconsumer.yaml
:
kubectl apply -f sc-azuredisk-csi-waitforfirstconsumer.yaml
A saída do comando é semelhante ao seguinte exemplo:
storageclass.storage.k8s.io/azuredisk-csi-waitforfirstconsumer created
Instantâneos de volume
O driver da CSI do Azure Data Box Disk dá suporte à criação de instantâneos de volumes persistentes. Como parte dessa funcionalidade, o driver pode executar instantâneos completos ou incrementais, dependendo do valor definido no parâmetro incremental
(por padrão, é true).
A tabela a seguir fornece detalhes para todos os parâmetros.
Nome | Significado | Valor disponível | Obrigatório | Valor padrão |
---|---|---|---|---|
resourceGroup | Grupo de recursos para armazenar capturas de instantâneo | GRUPO DE RECURSOS EXISTENTE | Não | Se não for especificado, o instantâneo será armazenado no mesmo grupo de recursos que os Discos do Azure de origem |
incremental | Tirar instantâneo completo ou incremental | true , false |
Não | true |
marcas | Marcas dos Discos do Azure | Formato da marca: 'key1=val1,key2=val2' | Não | "" |
userAgent | Agente de usuário usado para atribuição de uso do cliente | Não | Useragent gerado formatado driverName/driverVersion compiler/version (OS-ARCH) |
|
subscriptionID | Especificar a ID da assinatura do Azure em que os Discos do Azure serão criados | ID de assinatura do Azure | Não | Se não estiver vazio, resourceGroup deve ser fornecido, incremental deve ser definido como false |
Criar um instantâneo de volume
Observação
Antes de continuar, verifique se o aplicativo não está gravando dados no disco de origem.
Para obter um exemplo dessa funcionalidade, crie uma classe de instantâneo de volume com o comando kubectl apply:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/storageclass-azuredisk-snapshot.yaml
A saída do comando é semelhante ao seguinte exemplo:
volumesnapshotclass.snapshot.storage.k8s.io/csi-azuredisk-vsc created
Agora, vamos criar um instantâneo de volume da PVC que criamos dinamicamente no início deste tutorial, pvc-azuredisk
.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/azuredisk-volume-snapshot.yaml
A saída do comando é semelhante ao seguinte exemplo:
volumesnapshot.snapshot.storage.k8s.io/azuredisk-volume-snapshot created
Para verificar se o instantâneo foi criado corretamente, execute o seguinte comando:
kubectl describe volumesnapshot azuredisk-volume-snapshot
A saída do comando é semelhante ao seguinte exemplo:
Name: azuredisk-volume-snapshot
Namespace: default
Labels: <none>
Annotations: API Version: snapshot.storage.k8s.io/v1
Kind: VolumeSnapshot
Metadata:
Creation Timestamp: 2020-08-27T05:27:58Z
Finalizers:
snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
Generation: 1
Resource Version: 714582
Self Link: /apis/snapshot.storage.k8s.io/v1/namespaces/default/volumesnapshots/azuredisk-volume-snapshot
UID: dd953ab5-6c24-42d4-ad4a-f33180e0ef87
Spec:
Source:
Persistent Volume Claim Name: pvc-azuredisk
Volume Snapshot Class Name: csi-azuredisk-vsc
Status:
Bound Volume Snapshot Content Name: snapcontent-dd953ab5-6c24-42d4-ad4a-f33180e0ef87
Creation Time: 2020-08-31T05:27:59Z
Ready To Use: true
Restore Size: 10Gi
Events: <none>
Criar uma PVC com base em um instantâneo de volume
Você pode criar uma PVC com base em um instantâneo de volume. Use o instantâneo criado na etapa anterior e crie uma PVC e um pod para consumi-la.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/pvc-azuredisk-snapshot-restored.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/nginx-pod-restored-snapshot.yaml
A saída do comando é semelhante ao seguinte exemplo:
persistentvolumeclaim/pvc-azuredisk-snapshot-restored created
pod/nginx-restored created
Por fim, vamos confirmar se é a mesma PVC criada antes de verificar o conteúdo, executando o seguinte comando:
kubectl exec nginx-restored -- ls /mnt/azuredisk
A saída do comando é semelhante ao seguinte exemplo:
lost+found
outfile
test.txt
Como esperado, ainda podemos ver nosso arquivo test.txt
criado anteriormente.
Clonar volumes
Um volume clonado é definido como uma duplicata de um volume do Kubernetes existente. Para obter mais informações sobre como clonar volumes no Kubernetes, confira a documentação conceitual para clonagem de volume.
O driver da CSI para Discos do Azure dá suporte à clonagem de volume. Para demonstrar, crie um volume clonado do azuredisk-pvc
criado anteriormente e um pod para consumi-lo.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/pvc-azuredisk-cloning.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/nginx-pod-restored-cloning.yaml
A saída do comando é semelhante ao seguinte exemplo:
persistentvolumeclaim/pvc-azuredisk-cloning created
pod/nginx-restored-cloning created
Você pode verificar o conteúdo do volume clonado executando o comando a seguir e confirmando que o arquivo test.txt
foi criado:
kubectl exec nginx-restored-cloning -- ls /mnt/azuredisk
A saída do comando é semelhante ao seguinte exemplo:
lost+found
outfile
test.txt
Redimensionar um volume persistente sem tempo de inatividade
Você pode solicitar um volume maior para uma PVC. Edite o objeto PVC e especifique um tamanho maior. Essa alteração dispara a expansão do volume subjacente que faz o backup do VP.
Observação
Um VP nunca é criado para atender à declaração. Em vez disso, um volume é redimensionado.
No AKS, a classe de armazenamento managed-csi
interna já permite a expansão, portanto, use a PVC criada anteriormente com essa classe de armazenamento. A PVC solicitou um volume persistente de 10 Gi. Você pode confirmar ao executar o seguinte comando:
kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk
A saída do comando é semelhante ao seguinte exemplo:
Filesystem Size Used Avail Use% Mounted on
/dev/sdc 9.8G 42M 9.8G 1% /mnt/azuredisk
Expanda o PVC aumentando o campo spec.resources.requests.storage
ao executar o seguinte comando:
kubectl patch pvc pvc-azuredisk --type merge --patch '{"spec": {"resources": {"requests": {"storage": "15Gi"}}}}'
Observação
Atualmente, não há suporte para a redução de volumes persistentes. Tentar corrigir um PVC existente com um tamanho menor do que o atual leva à seguinte mensagem de erro: The persistentVolumeClaim "pvc-azuredisk" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.
A saída do comando é semelhante ao seguinte exemplo:
persistentvolumeclaim/pvc-azuredisk patched
Execute o seguinte comando para confirmar se o tamanho do volume aumentou:
kubectl get pv
A saída do comando é semelhante ao seguinte exemplo:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-391ea1a6-0191-4022-b915-c8dc4216174a 15Gi RWO Delete Bound default/pvc-azuredisk managed-csi 2d2h
(...)
Após alguns minutos, execute os comandos a seguir e confirme o tamanho da PVC:
kubectl get pvc pvc-azuredisk
A saída do comando é semelhante ao seguinte exemplo:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-azuredisk Bound pvc-391ea1a6-0191-4022-b915-c8dc4216174a 15Gi RWO managed-csi 2d2h
Execute o seguinte comando para confirmar o tamanho do disco dentro do pod:
kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk
A saída do comando é semelhante ao seguinte exemplo:
Filesystem Size Used Avail Use% Mounted on
/dev/sdc 15G 46M 15G 1% /mnt/azuredisk
Intermitência sob demanda
O modelo de bursting de disco sob demanda, permite a intermitência de discos sempre que eles precisarem exceder a sua capacidade atual. Esse modelo incorre encargos adicionais, sempre que ocorre intermitência de disco. O estouro sob demanda só está disponível para SSDs Premium com mais de 512 GiB. Para obter mais informações sobre IOPS provisionado por SSDs Premium e taxa de transferência por disco, consulte Tamanho do SSD Premium. Alternativamente, o bursting baseado em crédito é onde o disco terá intermitência somente se ele tiver créditos de intermitência acumulados em seu bucket de crédito. A intermitência baseada em crédito não gera encargos adicionais, quando ocorre intermitência de disco. A intermitência baseada em crédito só está disponível para SSDs Premium de 512 GiB e menores, e SSDs Standard de 1024 GiB e menores. Para obter mais informações sobre o bursting sob demanda, confira Bursting de disco sob demanda.
Importante
A classe de armazenamento managed-csi-premium
padrão tem o bursting sob demanda desabilitado e usa o bursting baseado em crédito. Todo SSD Premium criado dinamicamente por uma declaração de volume persistente com base na classe de armazenamento managed-csi-premium
padrão também tem a intermitência sob demanda desabilitada.
Para criar um volume persistente SSD Premium com bursting sob demanda habilitado, você pode criar uma nova classe de armazenamento com o parâmetro enableBursting definido como true
conforme mostrado no modelo YAML a seguir. Para obter mais informações sobre como habilitar o bursting sob demanda, confira Bursting de disco sob demanda. Para obter mais informações sobre como criar sua própria classe de armazenamento com bursting sob demanda habilitada, consulte Criar uma classe de armazenamento Premium de CSI gerenciada com capacidade de intermitência.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: burstable-managed-csi-premium
provisioner: disk.csi.azure.com
parameters:
skuname: Premium_LRS
enableBursting: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
Contêineres do Windows
O driver da CSI para discos do Azure também permite nós e contêineres do Windows. Se desejar 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, você pode usar as classes de armazenamento internas como managed-csi
. Você pode implantar um conjunto com estado baseado em Windows de exemplo que salva carimbos de data/hora no arquivo data.txt
ao executar o seguinte comando kubectl apply:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/windows/statefulset.yaml
A saída do comando é semelhante ao seguinte exemplo:
statefulset.apps/busybox-azuredisk created
Para validar o conteúdo do volume, execute o seguinte comando:
kubectl exec -it busybox-azuredisk-0 -- cat c:\\mnt\\azuredisk\\data.txt # on Linux/MacOS Bash
kubectl exec -it busybox-azuredisk-0 -- cat c:\mnt\azuredisk\data.txt # on Windows Powershell/CMD
A saída do comando é semelhante ao seguinte exemplo:
2020-08-27 08:13:41Z
2020-08-27 08:13:42Z
2020-08-27 08:13:44Z
(...)
Próximas etapas
- Para saber como usar os drivers da CSI para Arquivos do Azure, confira Usar os Arquivos do Azure com drivers da CSI.
- Para saber como usar o driver CSI para armazenamento de BLOBs do Azure, confira Usar o Armazenamento de BLOBs do Azure com driver da CSI.
- Para obter mais informações sobre as melhores práticas de armazenamento, confira Melhores práticas para armazenamento e backups no Serviço de Kubernetes do Azure.
- Para obter mais informações sobre soluções de armazenamento baseadas em disco, confira Soluções baseadas em disco no AKS.
Azure Kubernetes Service