Ao criar manualmente um PV e um PVC, você monta um disco em nuvem em um Pod como um volume com provisionamento estático. Esse método oferece armazenamento persistente, sendo ideal para cargas de trabalho que exigem alta performance de I/O de disco e baixa latência, sem compartilhamento de dados.
Os discos são adequados para os seguintes cenários:
Aplicações que demandam alto throughput de I/O de disco sem compartilhamento de dados, como MySQL e Redis.
Escrita de logs em alta velocidade.
Persistência de dados independente do ciclo de vida do pod.
Fluxo de trabalho
|
Pré-requisitos
-
Requisitos dos componentes CSI: Os componentes csi-plugin e csi-provisioner devem estar instalados.
Os componentes CSI são instalados por padrão. Verifique a página para garantir que eles ainda estejam instalados. Recomendamos atualizar os componentes CSI para a versão mais recente.
-
O disco em nuvem deve estar no estado Available e atender aos seguintes requisitos:
Limitações de zona de disponibilidade: Exceto pelos discos em nuvem ESSD com redundância de zona, outros tipos de disco só podem ser anexados a pods na mesma zona de disponibilidade.
Limitações de família de tipos de instância: Alguns tipos de disco em nuvem só podem ser anexados a famílias de tipos de instância específicas.
-
Limitações de nó virtual: Para usar um disco em nuvem em um nó virtual, seu cluster e o kube-scheduler devem atender aos seguintes requisitos de versão.
-
Limitações de nó Lingjun: Para usar discos em nuvem em nós Lingjun, os seguintes requisitos devem ser atendidos.
Etapa 1: Crie um PV
Crie um PV para declarar um disco em nuvem existente como um recurso de armazenamento disponível no cluster.
kubectl
-
Crie um arquivo chamado disk-pv.yaml com o seguinte conteúdo.
Obtenha o ID do disco, o tamanho do disco, o ID da zona e a categoria do disco, e substitua as variáveis no arquivo YAML pelos valores reais.
apiVersion: v1 kind: PersistentVolume metadata: # The ID of your existing cloud disk, such as d-uf628m33r5rsbi****** name: "<YOUR-DISK-ID>" annotations: # Recommended. Ensures the Pod is scheduled to a node that supports this disk type. # <YOUR-DISK-CATEGORY> is the category of your existing cloud disk. Supported values include cloud_essd_entry, cloud_auto, cloud_essd, cloud_ssd, cloud_efficiency, and cloud_regional_disk_auto. csi.alibabacloud.com/volume-topology: '{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node.csi.alibabacloud.com/disktype.<YOUR-DISK-CATEGORY>","operator":"In","values":["available"]}]}]}' spec: capacity: # The size of your existing cloud disk, such as 20Gi. storage: "<YOUR-DISK-SIZE>" claimRef: apiVersion: v1 kind: PersistentVolumeClaim namespace: default name: disk-pvc accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain csi: driver: diskplugin.csi.alibabacloud.com # The ID of your existing cloud disk, such as d-uf628m33r5rsbi****** volumeHandle: "<YOUR-DISK-ID>" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.diskplugin.csi.alibabacloud.com/zone operator: In values: # The zone where the cloud disk is located, such as cn-shanghai-f. - "<YOUR-DISK-ZONE-ID>" storageClassName: alicloud-disk-topology-alltype volumeMode: FilesystemA tabela a seguir descreve os principais parâmetros.
Parâmetro
Descrição
csi.alibabacloud.com/volume-topologyEsta anotação define a afinidade de nó para o disco em nuvem, garantindo que os Pods que utilizam este disco sejam agendados em nós compatíveis com o tipo de disco correspondente. Isso evita falhas de montagem devido à incompatibilidade de nós.
Para garantir um agendamento preciso, recomendamos especificar a categoria do disco. Os tipos suportados são:
Disco ESSD Entry:
cloud_essd_entryDisco ESSD AutoPL:
cloud_autoDisco ESSD:
cloud_essdSSD Padrão:
cloud_ssdDisco Ultra:
cloud_efficiencyDisco com redundância de zona:
cloud_regional_disk_auto(requer ajustes no parâmetro nodeAffinity)
claimRefEspecifica o PVC que pode se vincular a este PV. Para permitir que qualquer PVC se vincule a este PV, remova este parâmetro.
accessModesO modo de acesso. O modo suportado depende se o recurso multi-attach para discos em nuvem está ativado.
Multi-attach desativado: Apenas
ReadWriteOnce(RWO) é suportado. O disco em nuvem pode ser montado em um único nó no modo leitura/escrita.Multi-attach ativado:
Como sistema de arquivos padrão (formatado): Suporta
ReadWriteOnce(RWO) eReadOnlyMany(ROX).Para evitar corrupção de dados devido a escritas simultâneas em sistemas de arquivos como ext4 em vários nós, o modo
ReadWriteMany(RWX) não é suportado.Como dispositivo de bloco bruto (não formatado): Suporta
ReadWriteOnce(RWO),ReadOnlyMany(ROX) eReadWriteMany(RWX).
persistentVolumeReclaimPolicyA política de recuperação do PV, que determina o que acontece com o PV e o disco em nuvem subjacente quando o PVC vinculado é excluído.
Delete: Quando o PVC é excluído, tanto o PV quanto o disco em nuvem são excluídos. Use esta configuração com cautela.Para evitar perda acidental de dados, você pode criar uma política de snapshot automático para fazer backup do disco em nuvem antes da exclusão.
Retain: Quando o PVC é excluído, o PV e o disco em nuvem não são excluídos. Você deve liberá-los manualmente.
driverDefina como
diskplugin.csi.alibabacloud.comao usar discos da Alibaba Cloud.nodeAffinityConfigurações de afinidade de nó. Exceto pelos discos ESSD com redundância de zona, outros tipos de disco em nuvem só podem ser anexados a Pods dentro da mesma zona. Esta configuração garante que os Pods sejam agendados em nós ECS na mesma zona do disco em nuvem.
Para discos com redundância de zona, altere a configuração para o seguinte para permitir que o disco seja montado em qualquer zona dentro da região.
Nesta configuração,
<YOUR-DISK-REGION-ID>é a região onde o disco em nuvem está localizado, comocn-shanghai.nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/region operator: In values: - "<YOUR-DISK-REGION-ID>"storageClassNameEsta configuração não tem efeito em volumes com provisionamento estático, e você não precisa criar uma StorageClass correspondente. No entanto, você deve garantir que o valor desta configuração seja o mesmo tanto no PV quanto no PVC.
-
Crie o PV.
kubectl create -f disk-pv.yaml -
Verifique o status do PV e certifique-se de que ele esteja
Available.kubectl get pvSaída esperada:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE d-uf628m33r5rsbi****** 20Gi RWO Retain Available default/disk-pvc alicloud-disk-topology-alltype <unset> 1m36s
Console
Na página ACK Clusters, clique em no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
Na página Persistent Volumes, clique em Create, defina PV Type como Cloud Disk e configure os parâmetros do PV conforme solicitado.
Parâmetro
Descrição
Access Mode
Apenas ReadWriteOnce é suportado.
Disk ID:
Clique em Select Disk e selecione um disco em nuvem não montado na mesma região e zona do nó.
File System Type:
Selecione o tipo de sistema de arquivos para armazenar dados no disco em nuvem. Os tipos de File System Type: suportados incluem ext4, ext3, xfs e vfat.
Etapa 2: Crie um PVC
Crie um PVC para vincular ao PV criado na etapa anterior.
kubectl
-
Crie um arquivo chamado disk-pvc.yaml com o seguinte conteúdo.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce resources: requests: # The requested storage capacity, which must match the PV capacity. storage: "<YOUR-DISK-SIZE>" # Must match the storageClassName defined in the PV. storageClassName: alicloud-disk-topology-alltype # Specify the PV to bind to. volumeName: "<YOUR-DISK-ID>"A tabela a seguir descreve os principais parâmetros.
Parâmetro
Descrição
accessModesO modo de acesso. Deve ser consistente com a configuração do PV.
storageA capacidade de armazenamento alocada ao Pod. Deve ser consistente com a capacidade do PV.
storageClassNameEsta configuração não tem efeito em volumes com provisionamento estático, e você não precisa criar uma StorageClass correspondente. No entanto, você deve garantir que o valor desta configuração seja o mesmo tanto no PV quanto no PVC.
volumeNameEspecifica o PV ao qual se vincular. Para permitir que o PVC se vincule a qualquer PV correspondente, remova este parâmetro.
-
Crie o PVC.
kubectl create -f disk-pvc.yaml -
Verifique o status do PVC e certifique-se de que ele esteja
Bound.kubectl get pvcSaída esperada, indicando que o PVC está vinculado ao PV do disco em nuvem:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Bound d-bp1ff1mn65jk8s****** 20Gi RWO alicloud-disk-topology-alltype <unset> 6s
Console
No painel de navegação à esquerda da página de gerenciamento do cluster, escolha .
-
Na página Persistent Volume Claims, clique em Create, defina PVC Type como Disk e crie um PVC conforme solicitado.
Parâmetro
Descrição
Allocation Mode
Selecione Existing Volumes.
Existing Volumes
Selecione o PV criado anteriormente.
Capacity
A capacidade de armazenamento alocada ao Pod, que não pode exceder a capacidade do disco em nuvem.
Etapa 3: Crie uma aplicação e monte o disco em nuvem
Crie uma carga de trabalho e utilize o disco em nuvem montando o PVC.
Um Disco em Nuvem fornece armazenamento não compartilhado e, a menos que o multi-attach esteja ativado, pode ser montado em apenas um Pod por vez. Compartilhar um PVC em um Deployment com múltiplas réplicas pode impedir que novos Pods iniciem se o Disco em Nuvem já estiver em uso por outro Pod.
Se você ainda precisar usar um Disco em Nuvem com um Deployment, considere usar um Disco em Nuvem como volume efêmero. Para ativar o multi-attach, consulte Usar Discos em Nuvem baseados em NVMe com multi-attach e reserva.
kubectl
-
Crie um arquivo chamado disk-test.yaml com o seguinte conteúdo.
O exemplo a seguir cria um StatefulSet com uma réplica. O Pod solicita recursos de armazenamento através de um PVC chamado
disk-pvce monta o volume no caminho/data.apiVersion: apps/v1 kind: StatefulSet metadata: name: disk-test spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - name: pvc-disk mountPath: /data volumes: - name: pvc-disk persistentVolumeClaim: claimName: disk-pvcImportante-
Ao configurar
securityContext.fsgroup, o kubelet altera recursivamente as permissões de arquivo (chmod/chown) ao montar um volume. Isso pode aumentar significativamente o tempo de montagem para volumes com muitos arquivos.Para clusters da versão 1,20 ou posterior, recomendamos definir
fsGroupChangePolicycomoOnRootMismatch. Isso otimiza o desempenho da montagem realizando a alteração recursiva de permissões apenas quando o volume é montado pela primeira vez e as permissões do diretório raiz não correspondem. Se o desempenho continuar sendo um problema ou se você precisar de um controle de permissão mais granular, use uminitContainerpara gerenciar permissões antes que o contêiner da aplicação inicie. Quando um Pod é recriado, ele remonta o disco em nuvem original. Se outras restrições impedirem que o Pod seja agendado na zona original, ele permanecerá no estado Pending porque não conseguirá montar o disco em nuvem.
-
-
Crie o StatefulSet e monte o disco em nuvem.
kubectl create -f disk-test.yaml -
Verifique o status do Pod e certifique-se de que ele esteja
Running.kubectl get pod -l app=nginxSaída esperada:
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 14s -
Verifique o caminho de montagem para confirmar que o disco em nuvem está montado.
kubectl exec disk-test-0 -- df -h /dataSaída esperada:
Filesystem Size Used Avail Use% Mounted on /dev/vdb 20G 24K 20G 1% /data
Console
No painel de navegação à esquerda da página de gerenciamento do cluster, escolha .
Na página StatefulSets, clique em Create from Image.
-
Na página StatefulSets, clique em Create from Image e siga as instruções na página para configurar os parâmetros do StatefulSet.
A tabela a seguir descreve os principais itens de configuração. Para instruções detalhadas de configuração, consulte Criar um StatefulSet.
Página de configuração
Parâmetro
Descrição
Basic Information
Replicas:
Configure o número de réplicas para o StatefulSet.
Container
Image Name
Insira o endereço da imagem usada para implantar a aplicação, como
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6.Required Resources
Defina os recursos necessários de vCPU, memória e armazenamento efêmero.
Neste exemplo, a CPU está definida como 0,25 Core e a memória como 512 MiB.
Volume
Clique em Add PVC e configure os parâmetros.
Mount Source: Selecione o PVC criado anteriormente.
Container Path: Insira o caminho no contêiner onde o disco em nuvem será montado, como /data.
-
Verifique o status da implantação da aplicação.
Na página StatefulSets, clique em no nome da aplicação.
Na aba Pods, certifique-se de que o Pod esteja no estado Running.
Verificar a persistência de dados
Siga o processo "gravar dados > excluir o Pod > verificar dados" para confirmar que os dados armazenados no disco em nuvem persistem após a recriação do Pod.
-
Grave dados de teste no Pod.
-
Verifique o caminho de montagem para visualizar os dados no disco em nuvem.
kubectl exec disk-test-0 -- ls /dataSaída esperada:
lost+found -
Grave dados de teste no Pod.
Tome o Pod
disk-test-0como exemplo. Crie um arquivo de teste no diretório/data, que é o caminho de montagem do disco em nuvem.kubectl exec disk-test-0 -- touch /data/test
-
-
Simule uma falha de Pod excluindo o Pod.
kubectl delete pod disk-test-0Execute o comando
kubectl get pod -l app=nginxnovamente. Um Pod com o mesmo nome é criado automaticamente. -
Verifique os dados no novo Pod.
Verifique novamente o diretório
/datano novo Poddisk-test-0.kubectl exec disk-test-0 -- ls /dataNa saída esperada, o arquivo de teste criado anteriormente ainda existe, indicando que os dados persistem mesmo após o Pod ser excluído e recriado.
lost+found test
Considerações de produção
-
Alta disponibilidade
-
Política de agendamento de Pods
Configure corretamente
nodeAffinityecsi.alibabacloud.com/volume-topologyno PV para garantir que o Pod possa ser agendado com sucesso e que o disco em nuvem possa ser remontado após a recriação do Pod. -
Seleção de disco em nuvem
Avalie fatores como desempenho, faturamento, zonas de disponibilidade e famílias de tipos de instância para garantir que seus pods sejam agendados em nós compatíveis.
Ao selecionar um tipo de disco em nuvem, observe que os discos SSD e Ultra estão sendo descontinuados. Recomendamos usar discos ESSD PL0 ou ESSD Entry para substituir os discos Ultra, e discos ESSD AutoPL para substituir os discos SSD.
-
Recuperação de desastres entre zonas
Recuperação de desastres no nível da aplicação: Para cargas de trabalho críticas, como bancos de dados, implante instâncias da aplicação em várias zonas de disponibilidade e use o mecanismo nativo de sincronização de dados da aplicação para alta disponibilidade.
Recuperação de desastres no nível de armazenamento: Escolha um tipo de disco em nuvem que suporte recuperação de desastres multi-AZ. Este recurso grava dados sincronizadamente em diferentes zonas de disponibilidade dentro da mesma região, permitindo failover entre zonas. Para mais informações, consulte Usar Discos ESSD com Redundância Co-localizada.
-
-
Segurança de dados
Backups rotineiros: Use uma política de snapshot automático para criar snapshots dos seus discos em nuvem para backup e recuperação de dados.
-
Otimização de desempenho e custo
-
Anexação paralela
Para acelerar a inicialização do pod, use anexação paralela para discos em nuvem.
-
Monitoramento e alertas de armazenamento
Configure alertas com base no monitoramento de armazenamento de contêineres para detectar prontamente anomalias em volumes de armazenamento ou gargalos de desempenho.
-
Limpar recursos
Para evitar cobranças inesperadas e garantir a segurança dos dados, siga este processo para liberar recursos não utilizados.
-
Excluir a carga de trabalho
-
Ação: Exclua todas as aplicações que usam o PVC relevante, como Deployments e StatefulSets. Esta ação interrompe os Pods em execução e desmonta os volumes.
Comando de exemplo:
kubectl delete deployment <your-deployment-name>
-
-
Excluir o PVC
Ação: Exclua o PVC associado à aplicação. Após a exclusão, o que acontece com o PV vinculado depende de sua
persistentVolumeReclaimPolicy.-
Detalhes da política de recuperação:
Retain: Após a exclusão do PVC, o status do PV vinculado muda paraReleased, mas o objeto PV e o disco em nuvem de backend são retidos. Se você confirmar que o disco em nuvem e todos os seus dados não são mais necessários, consulte Liberar um disco em nuvem para excluí-lo. Esta ação é irreversível, portanto, proceda com cautela.-
Delete: Após a exclusão do PVC, tanto o objeto PV quanto o disco em nuvem de backend são excluídos. Os dados no disco em nuvem serão perdidos permanentemente e não poderão ser recuperados. Use esta política com cautela.Para evitar perda acidental de dados, você pode criar uma política de snapshot automático para fazer backup do disco em nuvem antes da exclusão.
Comando de exemplo:
kubectl delete pvc <your-pvc-name>
-
Excluir o objeto PV: Esta ação remove apenas a definição do recurso do cluster e não exclui o disco em nuvem de backend.
Ação: Exclua manualmente o PV que está no estado
Released.Comando de exemplo:
kubectl delete pv <your-pv-name>
Documentos relacionados
Para recomendações de otimização de configuração para implantação multi-zona de discos em nuvem, consulte Recomendações de configuração de alta disponibilidade para volumes de disco em nuvem.
Se a capacidade do seu disco em nuvem for insuficiente ou o disco estiver cheio, consulte Expandir volumes de disco em nuvem para redimensioná-lo.
Se você não utiliza mais um disco em nuvem e deseja parar o faturamento dele, pode liberar o disco em nuvem. Após a liberação, o disco em nuvem e os dados armazenados nele são excluídos, e o faturamento é interrompido.
Se encontrar problemas ao usar volumes de disco em nuvem, consulte as Perguntas frequentes sobre volumes de disco em nuvem.
Se o seu cluster ainda estiver usando o componente FlexVolume descontinuado, migre do FlexVolume para o CSI.
