Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Use CPFS for Lingjun dynamic volumes

Última atualização: Sep 09, 2026

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

    cnfs-nas-daemon add-on

    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 = 51 nú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.

Importante

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

  1. Create a CPFS for LINGJUN file system e anote o ID do sistema de arquivos.

  2. (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.

  1. Crie o arquivo sc.yaml:

    Parâmetro

    Obrigatório

    Descrição

    bmcpfsId

    Sim

    ID do sistema de arquivos CPFS para LINGJUN. Formato: bmcpfs-xxxxxxxxx ou cpfs-xxxxxxxxx.

    path

    Não

    Subdiretório dentro do sistema de arquivos. O volume é montado em {path}/{volumeName}/. O padrão é /{volumeName}/.

    allowVolumeExpansion

    Não

    Parâmetro reservado. A versão atual não suporta expansão dinâmica.

    reclaimPolicy

    Não

    Delete (padrão): exclui o fileset de backend quando o PVC é excluído. Retain: mantém o fileset; exige limpeza manual. Use Retain em 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
  2. Aplique a StorageClass:

    kubectl apply -f sc.yaml

    Saí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.

  1. Crie o arquivo pvc.yaml:

    Parâmetro

    Descrição

    accessModes

    Apenas ReadWriteMany. Permite acesso simultâneo por múltiplos pods.

    storage

    Capacidade de armazenamento solicitada. Suporta unidades como Gi e Ti.

    volumeMode

    Somente Filesystem é suportado.

    storageClassName

    Nome 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
  2. Aplique o PVC:

    kubectl apply -f pvc.yaml
  3. Verifique se o PVC está vinculado:

    kubectl get pvc bmcpfs-vsc -n default

    Saída esperada:

    NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS           AGE
    bmcpfs-vsc   Bound    pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx   10Ti       RWX            alicloud-bmcpfs-test   30s

    Quando o STATUS for Bound, o PV é criado automaticamente. Confirme o provisionamento:

    kubectl describe pvc bmcpfs-vsc -n default

    Verifique nos Events se há uma mensagem de Provisioning 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.

  1. 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
  2. Aplique o Deployment:

    kubectl apply -f deploy.yaml

    Saí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.

  1. Exclua cargas de trabalho — Interrompa todas as aplicações que usam os PVCs. Isso desmonta os volumes.

    kubectl delete deployment <your-deployment-name>
  2. Exclua PVCs — O resultado depende da reclaimPolicy da 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>
  3. Exclua PVs (apenas quando a reclaimPolicy for Retain) — Após a exclusão do PVC, o PV entra no status Released. Exclua-o para remover o recurso do Kubernetes. Os dados de backend não são afetados.

    kubectl delete pv <your-pv-name>
  4. (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>
  5. 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: O storageClassName está incorreto ou a StorageClass não existe.

  • provisioning failed ou failed 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 provisioner corresponde a bmcpfsplugin.csi.alibabacloud.com.

  • O bmcpfsId está correto e o sistema de arquivos existe.

  • Se get csidriver nã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.

  1. Verifique os eventos do pod:

    kubectl describe pod <pod-name> -n <your-namespace>

    Procure mensagens de Warning nos Events, como FailedMount ou MountVolume.Setup failed.

  2. Confirme se o PVC está vinculado.

    kubectl get pvc <your-pvc-name>

    O STATUS deve ser Bound. Se estiver Pending, consulte PVC stays in Pending status.

  3. 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-plugin

    Esses logs mostram conectividade de rede, permissão do destino de montagem e erros de I/O.