Monte um disco em nuvem existente em um pod como um PersistentVolume (PV) para obter armazenamento persistente de alto throughput e baixa latência no cluster ACK.
No provisionamento estático, você cria o PV e o PersistentVolumeClaim (PVC) manualmente antes de implantar a carga de trabalho. Isso oferece controle total sobre o disco utilizado e mantém o disco independente do ciclo de vida do pod.
Casos de uso
Os volumes de disco estáticos são adequados quando:
A aplicação exige alta E/S de disco — por exemplo, ao executar MySQL ou Redis.
É necessário gravar logs em alta velocidade.
Você tem um disco existente e deseja reutilizá-lo entre reinicializações de pods.
Para mais informações sobre volumes de armazenamento em bloco, consulte Volumes de armazenamento em bloco.
Pré-requisitos
Antes de começar, certifique-se de ter:
O plugin Container Storage Interface (CSI) instalado no cluster. Verifique o status dos componentes
csi-pluginecsi-provisionerna página Add-ons, na aba Storage. Para atualizar o plugin CSI e usar recursos específicos, consulte Atualizar o plugin CSI. Se o cluster ainda usa FlexVolume, migre para o plugin CSI primeiro — o FlexVolume foi descontinuado.-
Um disco em nuvem existente que atenda aos seguintes requisitos:
Método de faturamento: pagamento conforme o uso
Status: Available
Mesma zona do nó ECS onde o pod será executado
Tipo de disco compatível com o tipo de instância ECS — consulte Famílias de instâncias para detalhes de compatibilidade
Não é possível montar discos entre zonas diferentes. Se o tipo de disco for incompatível com o tipo de instância do nó, a montagem falhará.
Observações de uso
Um disco por pod simultaneamente. Discos são armazenamentos não compartilhados. A menos que o multi-attach esteja ativado, um único disco só pode ser montado em um pod por vez. Consulte Usar os recursos de multi-attach e reserva de discos NVMe.
Restrição de zona. Um disco só pode ser montado em um pod na mesma zona. A montagem entre zonas não é suportada.
Comportamento de reconstrução de pod. Quando um pod é reconstruído, o disco original é remontado. Caso o pod não possa ser agendado na zona original devido a outras restrições, ele permanecerá no estado Pending.
Use StatefulSets ou pods individuais, não Deployments. Com o multi-attach desativado, um disco pode ser montado em apenas um pod. Se for indispensável montar um disco em um Deployment, defina o número de réplicas como 1. Mesmo assim, não há garantia quanto à prioridade de montagem e desmontagem, e a estratégia de atualização contínua pode impedir que o novo pod monte o disco durante reinicializações. Portanto, não recomendamos a montagem de discos em Deployments.
securityContext.fsgroupaumenta o tempo de montagem. Ao configurarsecurityContext.fsgroup, o kubelet executachmodechownapós a montagem, o que adiciona sobrecarga proporcional ao número de arquivos. Para Kubernetes 1.20 e versões posteriores, definafsGroupChangePolicy: OnRootMismatchpara aplicar alterações de propriedade apenas na primeira inicialização do contêiner. Para um controle mais refinado, use um contêiner de inicialização para gerenciar permissões.
Montar um volume de disco provisionado estaticamente usando kubectl
Etapa 1: Criar um PV
Função: administrador do cluster
Conecte-se ao cluster. Use o kubectl ou o CloudShell e Workbench para estabelecer a conexão.
-
Crie um arquivo chamado
disk-pv.yamlcom o conteúdo abaixo e substitua os espaços reservados pelos detalhes do seu disco.Espaço reservado
Descrição
Exemplo
<YOUR-DISK-ID>ID do disco existente
d-uf628m33r5rsbi******<YOUR-DISK-SIZE>Capacidade do disco
20Gi<YOUR-DISK-ZONE-ID>Zona onde o disco está localizado
cn-shanghai-f<YOUR-DISK-CATEGORY>Valor do tipo de disco (veja tabela abaixo)
cloud_essdValores de tipo de disco para
<YOUR-DISK-CATEGORY>:Tipo de disco
Valor
Disco ESSD Entry
cloud_essd_entryDisco ESSD AutoPL
cloud_autoESSD
cloud_essdSSD padrão
cloud_ssdDisco Ultra
cloud_efficiencyDisco com redundância de zona
cloud_regional_disk_auto(requernodeAffinitydiferente — veja a tabela de parâmetros abaixo)apiVersion: v1 kind: PersistentVolume metadata: name: "<YOUR-DISK-ID>" annotations: csi.alibabacloud.com/volume-topology: '{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node.csi.alibabacloud.com/disktype.<YOUR-DISK-CATEGORY>","operator":"In","values":["available"]}]}]}' spec: capacity: storage: "<YOUR-DISK-SIZE>" claimRef: apiVersion: v1 kind: PersistentVolumeClaim namespace: default name: disk-pvc accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain csi: driver: diskplugin.csi.alibabacloud.com volumeHandle: "<YOUR-DISK-ID>" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.diskplugin.csi.alibabacloud.com/zone operator: In values: - "<YOUR-DISK-ZONE-ID>" storageClassName: alicloud-disk-topology-alltype volumeMode: FilesystemParâmetros principais:
Parâmetro
Obrigatório
Padrão
Descrição
csi.alibabacloud.com/volume-topologyRecomendado
Nenhum
Restringe o agendamento de pods a nós que suportam o tipo de disco especificado. Defina
<YOUR-DISK-CATEGORY>para evitar falhas de agendamento causadas por incompatibilidade entre disco e tipo de instância.claimRefOpcional
Nenhum
Vincula este PV a um PVC específico. Remova este bloco para permitir que qualquer PVC compatível se vincule a este PV.
accessModesObrigatório
—
Deve ser
ReadWriteOnce— o volume pode ser montado como leitura e escrita por um único pod.persistentVolumeReclaimPolicyObrigatório
RetainRetain: o PV e o disco são mantidos quando o PVC é excluído; limpe-os manualmente.Delete: o PV e o disco são excluídos quando o PVC é excluído.driverObrigatório
—
Sempre
diskplugin.csi.alibabacloud.compara volumes de disco da Alibaba Cloud.nodeAffinityObrigatório
—
Restringe o agendamento do pod à mesma zona do disco. Para discos com redundância de zona, substitua este bloco por uma afinidade no nível de região, permitindo que o disco seja montado em qualquer zona dentro da região:
topology.kubernetes.io/region: <YOUR-DISK-REGION-ID>(por exemplo,cn-shanghai).storageClassNameObrigatório
—
Deve corresponder exatamente ao
storageClassNameno PVC. O valoralicloud-disk-topology-alltypeé usado aqui — não é necessário criar esta StorageClass antecipadamente para provisionamento estático.ImportanteO
storageClassNamedeve ser idêntico tanto no PV quanto no PVC. Uma divergência faz com que o PVC permaneça não vinculado ou se vincule a um PV diferente. Se o cluster tiver uma StorageClass padrão, definastorageClassNameexplicitamente no PV e no PVC para evitar que o PVC se vincule a um volume provisionado dinamicamente em vez do PV desejado. -
Crie o PV.
kubectl create -f disk-pv.yaml -
Verifique se o PV está no estado
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 disk <unset> 1m36s
Etapa 2: Criar um PVC
Função: desenvolvedor
-
Crie um arquivo chamado
disk-pvc.yamlcom o seguinte conteúdo.Parâmetro
Obrigatório
Padrão
Descrição
accessModesObrigatório
—
Deve corresponder ao
accessModesdo PV. ApenasReadWriteOnceé suportado.storageObrigatório
—
Capacidade de armazenamento a ser solicitada. Não pode exceder a capacidade real do disco.
storageClassNameObrigatório
—
Deve corresponder exatamente ao
storageClassNamedo PV —alicloud-disk-topology-alltypeneste exemplo.volumeNameRecomendado
Nenhum
Vincula este PVC a um PV específico pelo nome. Remova este campo para permitir que o PVC se vincule a qualquer PV compatível.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: "<YOUR-DISK-SIZE>" storageClassName: alicloud-disk-topology-alltype volumeName: "<YOUR-DISK-ID>" -
Crie o PVC.
kubectl create -f disk-pvc.yaml -
Verifique se o PVC está vinculado ao PV.
kubectl get pvcSaída esperada mostrando o status
Bound:NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-pvc Bound d-uf628m33r5rsbi****** 20Gi RWO disk <unset> 64s
Etapa 3: Implantar um StatefulSet e montar o disco
Função: desenvolvedor
-
Crie um arquivo chamado
disk-test.yamlcom o conteúdo a seguir. Este comando cria um StatefulSet com um pod que monta o PVCdisk-pvcem/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-pvc -
Crie o StatefulSet.
kubectl create -f disk-test.yaml -
Confirme se o pod está em execução.
kubectl get pod -l app=nginxSaída esperada:
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 14s -
Verifique se o disco está montado em
/data.kubectl exec disk-test-0 -- df -h /dataSaída esperada:
Filesystem Size Used Avail Use% Mounted on /dev/vdb 20G 24K 20G 1% /data
Montar um volume de disco provisionado estaticamente no console
Etapa 1: Criar um PV
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster. No painel de navegação à esquerda, escolha Volumes > Persistent Volumes.
Na página Persistent Volumes, clique em Create.
-
Defina os parâmetros e clique em Create. Após a criação, o PV aparece na página Persistent Volumes.
Parâmetro
Obrigatório
Descrição
Exemplo
PV type
Obrigatório
Selecione Cloud Disk.
Cloud Disk
Access mode
Obrigatório
Apenas ReadWriteOnce é suportado.
ReadWriteOnce
Disk ID
Obrigatório
Clique em Select Disk e selecione o disco a ser montado. O disco deve estar na mesma região e zona do nó.
d-uf628m33r5rsbi******File system type
Opcional
Sistema de arquivos usado para formatar o disco. Suportados: ext4, ext3, xfs, vfat.
ext4 (padrão)
Etapa 2: Criar um PVC
No painel de navegação à esquerda, escolha Volumes > Persistent Volume Claims.
Na página Persistent Volume Claims, clique em Create.
-
Defina os parâmetros e clique em OK. Após a criação, o PVC aparece na página Persistent Volume Claims com o status Bound.
Parâmetro
Obrigatório
Descrição
Exemplo
PVC type
Obrigatório
Selecione Cloud Disk.
Cloud Disk
Name
Obrigatório
Nome do PVC. Siga os requisitos de formato exibidos no console.
disk-pvcAllocation mode
Obrigatório
Selecione Existing Volumes.
Existing Volumes
Existing volumes
Obrigatório
Selecione o PV criado na etapa 1.
d-uf690053kttkprgx****, 20GiCapacity
Obrigatório
Armazenamento a ser alocado. Não pode exceder a capacidade do disco.
20Gi
Etapa 3: Implantar um StatefulSet e montar o disco
No painel de navegação à esquerda, escolha Workloads > StatefulSets.
No canto superior direito, clique em Create from Image.
-
Defina os parâmetros principais listados abaixo e clique em Create from Image. Para todos os outros parâmetros, consulte Criar um StatefulSet.
Página de configuração
Parâmetro
Obrigatório
Descrição
Exemplo
Basic information
Name
Obrigatório
Nome do StatefulSet. Siga os requisitos de formato exibidos no console.
disk-testBasic information
Replicas
Obrigatório
Número de pods. Defina como 1 para volumes de disco sem multi-attach.
1Container
Image name
Obrigatório
Endereço da imagem do contêiner.
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6Container
Required resources
Opcional
vCPU, memória e armazenamento efêmero para o contêiner.
CPU: 0,25 Core; Memória: 512 MiB
Volume
Add PVC
Obrigatório
Clique em Add PVC, defina Mount Source como o PVC da etapa 2 e configure Container Path para o diretório de montagem.
Mount Source:
disk-pvc; Container Path:/data Após a implantação, clique em o nome do StatefulSet e acesse a aba Pods para confirmar se o pod está no estado Running.
Verificar a persistência de dados
Quando um pod no StatefulSet é excluído, o Kubernetes cria um pod substituto e remonta o disco original. Os dados no disco são preservados.
-
Verifique o conteúdo do diretório montado.
kubectl exec disk-test-0 -- ls /dataSaída esperada:
lost+found -
Grave um arquivo de teste no disco.
kubectl exec disk-test-0 -- touch /data/test -
Exclua o pod. O controlador do StatefulSet cria automaticamente um substituto.
kubectl delete pod disk-test-0 -
Aguarde o início do pod substituto e verifique seu status.
kubectl get pod -l app=nginxSaída esperada — o novo pod tem o mesmo nome porque os StatefulSets preservam a identidade do pod:
NAME READY STATUS RESTARTS AGE disk-test-0 1/1 Running 0 27s -
Confirme se os dados sobreviveram à exclusão do pod.
kubectl exec disk-test-0 -- ls /dataSaída esperada — o arquivo
testainda está presente:lost+found test
Próximos passos
Caso enfrente problemas com volumes de disco, consulte as Perguntas frequentes sobre volumes de disco.
Se o disco estiver cheio ou subdimensionado, veja como Expandir volumes persistentes de disco.
Para monitorar o uso do disco, consulte a Visão geral do monitoramento de armazenamento de contêineres.