Utilize volumes dinâmicos para provisionar armazenamento do Intelligent Computing LINGJUN (LINGJUN) sob demanda, sem gerenciar PVs manualmente. Várias aplicações podem ler e gravar em paralelo, ideal para cargas de trabalho de treinamento de IA e análise de big data que exigem compartilhamento de código, arquivos de configuração e resultados intermediários de computação.
Limitações
A violação destas restrições causa falhas de montagem ou torna o status do cluster irrecuperável.
Mesma hpn-zone obrigatória para montagem VSC: O nó do pod deve estar na mesma hpn-zone do sistema de arquivos CPFS para LINGJUN.
Inicialização do nó: Associe um nó LINGJUN a um sistema de arquivos CPFS para LINGJUN durante a inicialização. Ignorar esta etapa resulta em falhas de montagem do CSI.
Um sistema de arquivos por pod: Não monte múltiplos volumes do mesmo sistema de arquivos CPFS para LINGJUN em um único pod (por exemplo, vários PVs com o mesmo
bmcpfsId). O protocolo nativo não suporta a montagem do mesmo sistema de arquivos várias vezes em um pod, mesmo em subdiretórios diferentes.Drenagem antes de desligar um nó: Drene todos os pods de um nó LINGJUN com falha antes de colocá-lo offline. Pular essa etapa deixa recursos de pod irrecuperáveis e metadados de cluster inconsistentes.
Pré-requisitos
Certifique-se de ter:
Versão do cluster 1.26 ou posterior (upgrade guide).
Nós executando Alibaba Cloud Linux 3.
-
Os seguintes complementos de armazenamento nas versões mínimas indicadas. Instale ou atualize na página Add-ons.
Componente
Versão mínima
Complemento CSI (csi-plugin e csi-provisioner)
v1.33.1
0.1.2
Complemento bmcpfs-csi (bmcpfs-csi-controller no plano de controle gerenciado pelo ACK e bmcpfs-csi-node implantado como DaemonSet nos nós do cluster)
1.35.1
Configure recursos do cnfs-nas-daemon
O cnfs-nas-daemon gerencia os processos do Elastic File Client (EFC) e afeta diretamente o desempenho do armazenamento. Configure seus recursos na página Add-ons:
CPU: 0,5 núcleo para cada 1 Gb/s de largura de banda, mais 1 núcleo para gerenciamento de metadados. Exemplo: NIC de 100 Gb/s →
100 × 0.5 + 1 = 51núcleos.Memória: 15% da memória total do nó. Como o CPFS para LINGJUN utiliza FUSE, tanto o cache de dados quanto os metadados de arquivo consomem memória.
Ajuste os limites de recursos conforme a carga de trabalho real.
O cnfs-nas-daemon usa a estratégia de atualização OnDelete. Após alterar as configurações na página Add-ons, exclua manualmente o pod cnfs-nas-daemon em cada nó para aplicar as mudanças. Execute esse procedimento fora do horário de pico.
Nós sem suporte a hot upgrade: Causa uma interrupção de hardware. Os pods da aplicação falham e precisam ser excluídos manualmente; depois, reiniciam e se recuperam automaticamente.
Nós com suporte a hot upgrade: Os pods se recuperam automaticamente. O hot upgrade requer: kernel 5.10.134-18+, bmcpfs-csi-controller e bmcpfs-csi-plugin 1.35.1+, e cnfs-nas-daemon 0.1.9-compatible.1+.
Etapa 1: Crie um sistema de arquivos CPFS
Create a CPFS for LINGJUN file system e anote o ID do sistema de arquivos.
-
(Opcional) Para montar em nós não-LINGJUN, create a VPC mount target na mesma VPC dos nós do seu cluster. Anote o nome de domínio do destino de montagem (formato: cpfs--vpc-.<Region>.cpfs.aliyuncs.com).
Se todos os pods forem executados em nós LINGJUN, a montagem VSC (Virtual Storage Controller) será aplicada por padrão. Pule esta etapa.
Consulte CPFS for LINGJUN limits antes de prosseguir.
Etapa 2: Crie uma StorageClass
A StorageClass define parâmetros de provisionamento, como o ID do sistema de arquivos e a política de recuperação.
-
Crie o arquivo
sc.yaml:Parâmetro
Obrigatório
Descrição
bmcpfsIdSim
ID do sistema de arquivos CPFS para LINGJUN. Formato:
bmcpfs-xxxxxxxxxoucpfs-xxxxxxxxx.pathNão
Subdiretório dentro do sistema de arquivos. O volume é montado em
{path}/{volumeName}/. O padrão é/{volumeName}/.allowVolumeExpansionNão
Parâmetro reservado. A versão atual não suporta expansão dinâmica.
reclaimPolicyNão
Delete(padrão): exclui o fileset de backend quando o PVC é excluído.Retain: mantém o fileset; exige limpeza manual. UseRetainem produção.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-bmcpfs-test parameters: bmcpfsId: bmcpfs-xxxxxx vpcMountTarget: cpfs-xxxxx-vpc-xxxxx.cn-hangzhou.cpfs.aliyuncs.com provisioner: bmcpfsplugin.csi.alibabacloud.com reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true -
Aplique a StorageClass:
kubectl apply -f sc.yamlSaída esperada:
storageclass.storage.k8s.io/alicloud-bmcpfs-test created
Etapa 3: Crie um PVC
Um PVC referencia a StorageClass para solicitar armazenamento provisionado dinamicamente.
-
Crie o arquivo
pvc.yaml:Parâmetro
Descrição
accessModesApenas
ReadWriteMany. Permite acesso simultâneo por múltiplos pods.storageCapacidade de armazenamento solicitada. Suporta unidades como Gi e Ti.
volumeModeSomente
Filesystemé suportado.storageClassNameNome da StorageClass. Aciona a criação dinâmica do volume.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bmcpfs-vsc namespace: default spec: accessModes: - ReadWriteMany # Supports concurrent reads and writes across multiple pods resources: requests: storage: 10Ti # Supports large-capacity storage (Ti level) volumeMode: Filesystem # Only Filesystem is supported storageClassName: alicloud-bmcpfs-test # Must match the StorageClass created in Step 2 -
Aplique o PVC:
kubectl apply -f pvc.yaml -
Verifique se o PVC está vinculado:
kubectl get pvc bmcpfs-vsc -n defaultSaída esperada:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE bmcpfs-vsc Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 10Ti RWX alicloud-bmcpfs-test 30sQuando o
STATUSforBound, o PV é criado automaticamente. Confirme o provisionamento:kubectl describe pvc bmcpfs-vsc -n defaultVerifique nos
Eventsse há uma mensagem deProvisioning succeeded.
Etapa 4: Implantar uma carga de trabalho e montar o PVC
O Deployment a seguir executa três réplicas compartilhando um único volume CPFS para LINGJUN.
-
Crie o arquivo
deploy.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: cpfs-shared-example spec: replicas: 3 # Three replicas verify that shared storage works across multiple pods selector: matchLabels: app: cpfs-shared-app template: metadata: labels: app: cpfs-shared-app spec: tolerations: - key: node-role.alibabacloud.com/lingjun operator: Exists effect: NoSchedule # Optional: to pin all pods to a specific node, uncomment and set the node name # nodeName: cn-hangzhou.10.XX.XX.226 containers: - name: app-container image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 volumeMounts: - name: pvc-cpfs mountPath: /data # Shared volume mounted at /data inside the container lifecycle: postStart: exec: command: - /bin/sh - -c - > echo "Data written by $(hostname)" > /data/$(hostname).txt && echo "Deployment is running, check shared data in /data." && sleep 3600 volumes: - name: pvc-cpfs persistentVolumeClaim: claimName: bmcpfs-vsc # References the PVC created in Step 3 -
Aplique o Deployment:
kubectl apply -f deploy.yamlSaída esperada:
deployment.apps/cpfs-shared-example created
Limpar recursos
Exclua os recursos nesta ordem para evitar custos inesperados e preservar a segurança dos dados.
-
Exclua cargas de trabalho — Interrompa todas as aplicações que usam os PVCs. Isso desmonta os volumes.
kubectl delete deployment <your-deployment-name> -
Exclua PVCs — O resultado depende da
reclaimPolicyda StorageClass:Retain(recomendado): O fileset e os dados do CPFS para LINGJUN permanecem intactos. Prossiga para a Etapa 3 para excluir o PV.Delete: Exclui permanentemente o PV vinculado e o fileset de backend. Ação irreversível.
kubectl delete pvc <your-pvc-name> -
Exclua PVs (apenas quando a
reclaimPolicyforRetain) — Após a exclusão do PVC, o PV entra no statusReleased. Exclua-o para remover o recurso do Kubernetes. Os dados de backend não são afetados.kubectl delete pv <your-pv-name> -
(Opcional) Exclua a StorageClass — Exclua se não for mais necessária. Os volumes existentes não são afetados.
kubectl delete sc <your-sc-name> Exclua o sistema de arquivos CPFS para LINGJUN — Exclui permanentemente todos os dados, incluindo aqueles retidos pela política
Retain. Confirme que não há dependências restantes e então delete the file system.
Solução de problemas
PVC permanece no status Pending
Um PVC preso no status Pending indica falha no provisionamento. Os eventos do PVC geralmente identificam a causa.
kubectl describe pvc <your-pvc-name> -n <your-namespace>
Verifique avisos nos Events. Causas comuns:
StorageClass not found: OstorageClassNameestá incorreto ou a StorageClass não existe.provisioning failedoufailed to create fileset: Problema no armazenamento de backend. Continue abaixo.
Se os eventos indicarem um problema de configuração, inspecione a StorageClass e verifique o registro do driver CSI:
# Check the StorageClass configuration
kubectl get storageclass <your-sc-name> -o yaml
# Verify the CSI driver is registered
kubectl get csidriver bmcpfsplugin.csi.alibabacloud.com
Confirme que:
O
provisionercorresponde abmcpfsplugin.csi.alibabacloud.com.O
bmcpfsIdestá correto e o sistema de arquivos existe.Se
get csidrivernão retornar saída, o driver não está instalado. Instale bmcpfs-csi-controller, bmcpfs-csi-node e cnfs-nas-daemon na página Add-ons.
Pod permanece em ContainerCreating ou falha em MountVolume.Setup
O pod chegou ao nó, mas a montagem do volume falhou. Siga estas etapas para identificar a causa.
-
Verifique os eventos do pod:
kubectl describe pod <pod-name> -n <your-namespace>Procure mensagens de
WarningnosEvents, comoFailedMountouMountVolume.Setup failed. -
Confirme se o PVC está vinculado.
kubectl get pvc <your-pvc-name>O
STATUSdeve serBound. Se estiverPending, consulte PVC stays in Pending status. -
Se estiver vinculado, verifique os logs do plugin CSI no lado do nó:
kubectl get pods -n kube-system -l app.kubernetes.io/name=bmcpfs-csi-driver \ --field-selector spec.nodeName=<nodeName> \ -o name | xargs kubectl logs -n kube-system -c csi-pluginEsses logs mostram conectividade de rede, permissão do destino de montagem e erros de I/O.