O CPFS AI Edition permite que vários pods montem o mesmo sistema de arquivos simultaneamente no modo ReadWriteMany, possibilitando o acesso compartilhado a dados de treinamento e modelos. Este tópico descreve como montar um sistema de arquivos CPFS AI Edition como um volume de armazenamento estático em contêineres usando o plug-in CSI do ACK.
Antes de começar
Um cluster gerenciado ACK Lingjun foi criado. O cluster executa Kubernetes 1.26 ou posterior e utiliza Alibaba Cloud Linux 3 como sistema operacional dos nós.
Um sistema de arquivos CPFS AI Edition foi criado. Anote o ID do sistema de arquivos. Para mais informações, consulte {{XREF_0}}.
-
Os seguintes componentes de armazenamento estão instalados no cluster ACK. Verifique as versões na página Component Management do cluster ou em {{XREF_1}}:
Componente
Versão necessária
csi-plugin / csi-provisioner
≥ v1.33.1
cnfs-nas-daemon
≥ 0.1.2
bmcpfs-csi-controller / bmcpfs-csi-node
Gerenciado pelo ACK. Não é necessária instalação manual.
Caso um pod seja agendado para um nó não-Lingjun ou para um nó Lingjun em uma zona de afinidade computação-armazenamento diferente, crie previamente um ponto de montagem VPC e anote o nome de domínio do ponto de montagem (no formato
cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com). A VPC à qual o ponto de montagem VPC pertence deve ser a mesma VPC do cluster ACK. Para mais informações, consulte {{XREF_2}}.
Considerações
Ao montar um sistema de arquivos CPFS usando VSC, o nó onde o pod é executado deve estar na mesma zona de afinidade computação-armazenamento da instância do sistema de arquivos CPFS AI Edition.
Se você utilizar a montagem baseada em contêiner CSI para CPFS, selecione a opção de suporte a acesso de armazenamento de arquivos de alta performance ao criar um grupo de nós Lingjun.
Antes de retirar um nó Lingjun de serviço devido a falha, drene os pods desse nó. Caso contrário, os metadados do cluster ficarão inconsistentes, fazendo com que os recursos dos pods permaneçam e não sejam recuperados adequadamente.
-
Não há suporte para montar subdiretórios diferentes da mesma instância CPFS por meio de múltiplos PVs em um único pod. Devido a limitações do driver subjacente, essa configuração impede que o pod inicie.
Recomendamos criar apenas um PV/PVC para a instância CPFS e usar o campo
subPathna configuraçãovolumeMountsdo pod para montar separadamente os subdiretórios necessários.O
subPathé implementado com base em um mecanismo leve debind mounte não introduz sobrecarga adicional de performance.
Canais de acesso e agendamento
Em um cluster ACK Lingjun, o canal de rede pelo qual um pod acessa o CPFS AI Edition depende do local de agendamento do pod. O plug-in CSI seleciona automaticamente o canal ideal:
|
Local de agendamento do pod |
Canal de acesso |
Cenário típico |
|
Nó GPU Lingjun na mesma zona de afinidade computação-armazenamento |
VSC + RDMA (performance ideal) |
Tarefas de treinamento com GPU |
|
Nó Lingjun em zona de afinidade computação-armazenamento diferente |
Alterna automaticamente para ponto de montagem VPC (TCP) |
Tarefas de treinamento ou inferência entre zonas |
|
Nó não-Lingjun (pool de nós CPU) |
Ponto de montagem VPC (TCP) |
Pods CPU: pré-processamento de dados, services de inferência, gerenciamento de agendamento, etc. |
Para ativar a alternância automática de canal, configure mountpointAutoSwitch: "true" e vpcMountTarget (nome de domínio do ponto de montagem VPC) nos volumeAttributes do PV. Para detalhes de configuração, consulte {{XREF_3}} abaixo.
Para determinar se um nó Lingjun e um sistema de arquivos CPFS estão na mesma zona de afinidade computação-armazenamento, consulte {{XREF_4}}.
Etapa 1: Criar um PV e PVC
-
Salve o modelo a seguir como
bmcpfs-pv-pvc.yaml, substituindo os espaços reservados pelo ID do seu sistema de arquivos e (se necessário) pelo ponto de montagem VPC.Parâmetros do PV
Parâmetro
Descrição
Obrigatório
accessModesModo de acesso para o PV.
Sim
capacity.storageCapacidade de armazenamento declarada. Não afeta a capacidade real.
Sim
csi.driverTipo de driver. Para CPFS for Lingjun, use
bmcpfsplugin.csi.alibabacloud.com.Sim
csi.volumeHandleID do sistema de arquivos CPFS for Lingjun.
Sim
csi.volumeAttributes.vpcMountTargetNome de domínio do ponto de montagem VPC. Necessário para nós não-Lingjun; omita se os pods forem agendados apenas para nós Lingjun.
Condicional
csi.volumeAttributes.mountpointAutoSwitchAtiva a alternância automática entre pontos de montagem VSC e VPC. Use em conjunto com
vpcMountTarget.Não
mountOptionsOpções de montagem.
Não
Parâmetros do PVC
Parâmetro
Descrição
Obrigatório
accessModesModo de acesso solicitado pelo PVC. Deve corresponder ao do PV.
Sim
resources.requests.storageCapacidade de armazenamento alocada ao pod. Não deve exceder a capacidade do PV.
Sim
volumeModeModo de montagem. Defina como
Filesystem.Sim
volumeNameNome do PV a ser vinculado a este PVC.
Sim
apiVersion: v1 kind: PersistentVolume metadata: name: bmcpfs spec: accessModes: - ReadWriteMany capacity: storage: 10Ti claimRef: name: bmcpfs namespace: default csi: driver: bmcpfsplugin.csi.alibabacloud.com volumeAttributes: # Required if pods schedule to non-Lingjun nodes or cross-zone automatic VPC switching is enabled. # Omit if pods schedule only to Lingjun nodes. vpcMountTarget: cpfs-***-vpc-***.<Region>.cpfs.aliyuncs.com # Enables automatic switching between VSC and VPC mount points. # Use together with vpcMountTarget. mountpointAutoSwitch: "true" # Replace with your CPFS for Lingjun file system ID. volumeHandle: bmcpfs-***** mountOptions: [] --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bmcpfs namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 10Ti volumeMode: Filesystem volumeName: bmcpfs -
Aplique a configuração.
kubectl apply -f bmcpfs-pv-pvc.yaml -
Confirme se o PVC está vinculado ao PV.
kubectl get pvc bmcpfsSaída esperada:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE bmcpfs Bound bmcpfs 10Ti RWX <unset> 51sO
STATUSéBound, confirmando que o PVC está vinculado ao PV.
Etapa 2: Criar uma aplicação e montar o CPFS
Cenário 1: Montar todo o sistema de arquivos CPFS
Utilize esta abordagem quando todos os contêineres precisarem de acesso total ao sistema de arquivos CPFS.
-
Salve o seguinte modelo YAML como
cpfs-test.yaml.apiVersion: apps/v1 kind: Deployment metadata: name: cpfs-test labels: app: cpfs-test spec: replicas: 2 selector: matchLabels: app: cpfs-test template: metadata: labels: app: cpfs-test 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-cpfs mountPath: /data volumes: - name: pvc-cpfs persistentVolumeClaim: claimName: bmcpfs -
Crie o Deployment.
kubectl create -f cpfs-test.yaml -
Verifique se ambos os pods estão em execução.
kubectl get pod -l app=cpfs-testSaída esperada:
NAME READY STATUS RESTARTS AGE cpfs-test-76b77d64b5-2hw96 1/1 Running 0 42s cpfs-test-76b77d64b5-dnwdx 1/1 Running 0 42s -
Verifique a montagem do volume CPFS dentro de um pod.
kubectl exec -it <pod-name> -- mount | grep /dataSaída esperada:
bindroot-f0a5c-******:cpfs-*******-vpc-****.cn-shanghai.cpfs.aliyuncs.com:/ on /data type fuse.aliyun-alinas-efc (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=1048576)O tipo de montagem
fuse.aliyun-alinas-efcem/dataconfirma que o volume CPFS está montado.
Cenário 2: Montar subdiretórios para isolamento de dados
Em cenários de armazenamento compartilhado, como configurações multilocatário ou multitarefa, vários contêineres podem compartilhar um volume CPFS enquanto isolam dados em diretórios separados. Use volumeMounts.subPath para montar subdiretórios diferentes em contêineres distintos a partir do mesmo PVC.
Se um diretóriosubPath(por exemplo,workspace/alpha) não existir, ele será criado automaticamente.
-
Salve o seguinte modelo YAML como
pod.yaml. Este pod executa dois contêineres, cada um montando um subdiretório diferente do mesmo PVC (bmcpfs).apiVersion: v1 kind: Pod metadata: name: cpfs-subpath-demo-pod spec: containers: - name: task-alpha-container image: busybox:1.35 command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - name: cpfs-storage mountPath: /data/workspace # Mount path inside the container subPath: workspace/alpha # Mount the workspace/alpha subdirectory only - name: task-beta-container image: busybox:1.35 command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - name: cpfs-storage mountPath: /data/workspace # Mount paths can be identical across containers subPath: workspace/beta # Mount the workspace/beta subdirectory only volumes: - name: cpfs-storage persistentVolumeClaim: claimName: bmcpfs # Reference the PVC created earlier -
Implante o pod.
kubectl apply -f pod.yaml -
Verifique a montagem e as permissões de gravação do
task-alpha-container.-
Conecte-se ao contêiner.
kubectl exec -it cpfs-subpath-demo-pod -c task-alpha-container -- /bin/sh -
Confirme se o volume CPFS está montado.
df -hSaída esperada (diretório compartilhado montado em
/data/workspace):Filesystem Size Used Available Use% Mounted on ... 192.XX.XX.0:/share 10.0T 1.0G 10.0T 0% /data/workspace ...A entrada do sistema de arquivos em
/data/workspaceconfirma que o subdiretório CPFS está montado. -
Verifique a estrutura do diretório pai.
ls -l /data/Saída esperada:
total 4 drwxr-xr-x 2 root root 4096 Aug 15 10:00 workspace -
Grave um arquivo de teste e saia.
echo "hello from alpha" > /data/workspace/alpha.log exit
-
-
Verifique a montagem e o isolamento de dados do
task-beta-container.-
Conecte-se ao contêiner.
kubectl exec -it cpfs-subpath-demo-pod -c task-beta-container -- /bin/sh -
Grave um arquivo de teste.
echo "hello from beta" > /data/workspace/beta.log -
Liste os arquivos no ponto de montagem.
ls -l /data/workspace/Saída esperada:
total 4 -rw-r--r-- 1 root root 16 Aug 15 10:05 beta.logbeta.logestá presente, mas oalpha.logestá ausente, confirmando o isolamento de dados entre os contêineres.
-
Etapa 3: Verificar a montagem
kubectl exec -it <pod-name> -- mount | grep /data
# Expected output contains fuse.aliyun-alinas-efc, indicating the EFC + FUSE protocol is in use