Antes de tarefas de treinamento de IA ou análise de dados, pré-carregue grandes volumes de dados frios do OSS sob demanda para volumes de alto desempenho, como CPFS for Lingjun ou discos cloud. Isso permite que as cargas de trabalho leiam dados em alta velocidade. Os volumes são liberados automaticamente após a conclusão das tarefas, equilibrando a aceleração da computação e a otimização de custos.
Como funciona
Implementação do recurso
Este recurso utiliza os Volume Populators do Kubernetes, gerenciados pelo storage-operator do ACK. Ao criar uma PVC que referencia o recurso personalizado OSSVolumePopulator (OSSVP), o storage-operator intercepta a solicitação e preenche os dados.
O modo de preenchimento depende do tipo de volume de destino:
|
Modo |
Tipos de armazenamento suportados |
Descrição |
|
|
CPFS for Lingjun |
O storage-operator usa o fluxo de dados nativo do CPFS para preencher os dados. Este modo não consome recursos de computação do cluster e oferece maior eficiência. |
|
|
Outros tipos de armazenamento, como discos cloud ou CPFS general-purpose edition |
O storage-operator cria um pod temporário no namespace Este modo consome recursos de computação do cluster. |
Após o preenchimento bem-sucedido, o status da PVC muda de Pending para Bound. Os pods da aplicação podem então montar a PVC e acessar os dados pré-carregados.
Cenários típicos
Este resource suporta dois casos de uso principais.
|
Dimensão |
Scenario 1: Prefetch data to CPFS for Lingjun shared volumes |
|
|
Cenário aplicável |
Cargas de trabalho com alto throughput e leitura intensiva, como treinamento e inferência de modelos de IA, para superar gargalos de acesso ao OSS. |
Tarefas em lote paralelas ou pipelines de dados que exigem espaços de trabalho de leitura e gravação isolados para evitar conflitos de concorrência e garantir o isolamento dos dados. |
|
Implementação técnica |
Use o CPFS for Lingjun com o modo |
Use armazenamento provisionado dinamicamente, como discos cloud, com o modo |
|
Características principais |
|
|
Fluxo de trabalho
As etapas principais do VolumePopulator são semelhantes em ambos os modos.
|
|
|
Pré-requisitos
-
O cluster deve executar Kubernetes 1.26 ou posterior com o plugin CSI. Este resource requer armazenamento provisionado dinamicamente.
Para atualizar seu cluster, consulte Manually upgrade a cluster . Para migrar do FlexVolume para CSI, consulte Migrate FlexVolume to CSI using csi-compatible-controller .
-
Atualize o storage-operator para a versão v1.35.1 ou posterior e ative o Feature Gate
VolumePopulator.Se outros feature gates já estiverem ativados, use o formato:
xxxxxx=true,yyyyyy=false,VolumePopulator=true
Cenário 1: Pré-carregar dados para volumes compartilhados do CPFS for Lingjun
Para treinamento e inferência de modelos somente leitura com alto throughput, use o fluxo de dados do CPFS for Lingjun para pré-carregar modelos do OSS sob demanda, permitindo que múltiplas tarefas de GPU leiam dados em alta velocidade.
Pré-requisitos
Conclua os preparations for using CPFS for Lingjun dynamic volumes.
-
Revise a documentação do CPFS for Lingjun data flow (invitational preview) para obter detalhes sobre o resource e limites.
ImportanteO fluxo de dados do CPFS for Lingjun está em preview por convite. O desempenho pode oscilar em clusters de grande escala. Para problemas ou sugestões de product, participe do grupo DingTalk 35532895.
1. Definir uma tag específica no bucket do OSS
Em Object tagging operations, adicione uma tag ao seu bucket do OSS com key cpfs-dataflow e value true.
Não exclua nem modifique esta tag durante o uso, pois a criação do volume pode falhar.
2. Criar OSSVolumePopulator (OSSVP)
Crie um OSSVolumePopulator no mesmo namespace da sua aplicação e PVC para definir a fonte de dados do OSS.
apiVersion: storage.alibabacloud.com/v1beta1
kind: OSSVolumePopulator
metadata:
name: qwen3-32b
# Must be in the same namespace as the application and PVC
namespace: bmcpfs-dataflow-demo
spec:
bucket: <your-bucket-name>
region: cn-hangzhou
endpoint: oss-cn-hangzhou-internal.aliyuncs.com
path: /Qwen3-32B/
# Dedicated for CPFS for Lingjun volumes, leveraging its data flow capability
mode: bmcpfs-dataflow
# Optional advanced configurations for bmcpfs-dataflow mode
# This example recommends default settings. Ignore if no special requirements.
# bmcpfsDataflow:
# Maximum data flow throughput (MB/s). Options: 600, 1200, 1500. Default: 600
# throughput: 1200
# Enable encrypted transfer. Default: empty (disabled)
# sourceSecurityType: SSL
# Data prefill mode. Default: metadataAndData for full prefill.
# Set to metadata for metadata-only prefill.
# dataType: metadataAndData
Parâmetros:
|
Nome |
Descrição |
Opcional |
Padrão |
|
|
O OSSVolumePopulator deve estar no mesmo namespace da aplicação e da PVC. |
Não |
N/A |
|
|
Nome do bucket do OSS. |
Não |
N/A |
|
|
region do OSS. |
Não |
N/A |
|
|
endpoint do service OSS. |
Não |
N/A |
|
|
Prefixo do caminho dentro do bucket do OSS, como |
Sim |
|
|
|
Modo de operação. Opções:
|
Sim |
|
|
|
Throughput máximo do fluxo de dados do CPFS for Lingjun (MB/s). Valores válidos: |
Sim |
Mesmo padrão do fluxo de dados do CPFS for Lingjun |
|
|
Protocolo de segurança para transferência de dados, como |
Sim |
Criptografia desativada |
|
|
Tipo de dado a ser sincronizado:
|
Sim |
|
3. Preparar StorageClass e PVC
Crie uma StorageClass para CPFS for Lingjun e, em seguida, crie uma PVC que referencie o OSSVP com dataSourceRef.
|
Criar StorageClass |
Cada volume dinâmico desta StorageClass cria um Fileset no CPFS for Lingjun de backend. Crie diferentes resources OSSVP para pré-carregar diferentes conjuntos de dados do OSS em diferentes volumes com a mesma StorageClass. |
|
Criar PVC |
Como a StorageClass define |
4. Verificar o status do pré-carregamento de dados
Durante o preenchimento, o status da PVC permanece como Pending e muda para Bound após a conclusão.
Para o modo bmcpfs-dataflow, verifique o progresso em tempo real do fluxo de dados do CPFS for Lingjun com este comando:
kubectl -n bmcpfs-dataflow-demo describe ossvp qwen3-32b
-
statusdurante o preenchimento:Bmcpfs Dataflow: 62a4e7ec-fae1-4f11-848f-b57cxxxxxxxx: Data Flow Id: df-29d3ad9e9xxxxxxx Data Flow Task Id: task-2993179xxxxxxxxx File Set Id: fset-2997498xxxxxxxxx File System Id: bmcpfs-29000z8xz3lf5xxxxxxxx Progress: 59% -
statusapós a conclusão:Message: Populated successfully
5. Criar carga de trabalho e usar dados
Depois que a PVC estiver Bound, crie uma carga de trabalho que a monte.
Este exemplo usa resources de GPU. Apenas para verificação, crie um pod de CPU e use kubectl exec para inspecionar os dados.
Guia de limpeza de resources
Após a conclusão das tarefas de treinamento ou inferência de IA, libere os volumes compartilhados do CPFS for Lingjun e as cargas de trabalho relacionadas.
Resources a serem liberados:
Cargas de trabalho usando o volume compartilhado (neste exemplo, um
StatefulSet)PVC usada para pré-carregamento de dados
Resources de armazenamento de backend (FileSet do CPFS for Lingjun) criados automaticamente pela PVC
Etapas de limpeza:
-
Exclua a carga de trabalho
Exclua o StatefulSet que utiliza o volume para liberar a PVC.
kubectl delete statefulset demo-apply-qwen3-32b -n bmcpfs-dataflow-demo -
Exclua a PVC
Com
reclaimPolicy: Deletena StorageClass, a exclusão da PVC também exclui o FileSet do CPFS no backend, libera o armazenamento e interrompe o faturamento.kubectl delete pvc qwen3-32b -n bmcpfs-dataflow-demo -
Verifique a limpeza de resources:
No console NAS, escolha File System > File System List e confirme se o FileSet para esta PVC foi excluído e se a capacidade utilizada diminuiu.
Os dados de source no OSS permanecem inalterados. No console OSS, confirme se o conjunto de dados permanece intacto.
Cenário 2: Pré-carregar dados para volumes isolados de disco cloud
Para fluxos de trabalho de processamento em lote, use o Argo Workflows para criar e pré-aquecer dinamicamente um disco cloud independente por tarefa, garantindo isolamento de dados e elasticidade.
Pré-requisitos
-
Ative o
VolumePopulatorPodHandlerno storage-operator.Após a ativação, o sistema concede as permissões RBAC necessárias aos componentes relacionados e aos pods temporários. Avalie os riscos de segurança antes de ativar.
-
O Argo Workflows deve estar instalado.
Este exemplo usa computação serverless (ECI) para tarefas de pré-carregamento de dados e workflows. Instale o ack-virtual-node add-on. Para verificação sem serverless, remova
alibabacloud.com/eci: "true"dos resources.
1. Autorizar tarefas de pré-carregamento de dados a acessar o OSS
No modo generic, as tarefas de pré-carregamento de dados são executadas como pods temporários no namespace ack-volume-populator. Conceda a esses pods acesso ao bucket do OSS com os dados de source.
RRSA method: Atribui dinamicamente funções RAM temporárias e com rotação automática aos pods para isolamento granular de permissões com maior segurança.
AccessKey method: Armazena credenciais estáticas e de longo prazo em um Secret. Simples de configure, mas menos seguro.
Método RRSA
1. Ativar RRSA no cluster
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters. Na página Clusters, clique no nome do cluster alvo.
-
Na aba Basic Information, na seção Security and Auditing, clique em Enable ao lado de RRSA OIDC e siga as instruções na tela para ativar o RRSA fora do horário de pico.
Quando o status do cluster mudar de Updating para Running, o RRSA estará ativado.
ImportanteApós a ativação do RRSA, o período máximo de validade dos tokens ServiceAccount recém-criados no cluster é limitado a 12 horas.
2. Criar uma função RAM e conceder permissões
Crie uma função RAM para que os pods assumam o acesso ao OSS através da autenticação RRSA.
Método AccessKey
Crie um usuário RAM. Pule esta etapa se já existir um usuário RAM. Acesse a página Console RAM - Criar Usuário e crie um usuário RAM conforme instruído, definindo, por exemplo, o nome de login e a senha.
-
Crie uma política de permissão.
Seguindo o princípio do menor privilégio, create a custom policy concedendo acesso ao bucket OSS alvo (permissões de somente leitura ou leitura/gravação do OSS).
Acesse a página Console RAM - Criar Política, mude para JSON Editor e configure o script da política conforme instruído.
-
Anexe a política ao usuário RAM.
Acesse a página Console RAM - Usuários. Na lista de usuários, localize o usuário alvo e clique em Add Permissions na coluna Actions.
Na seção Policies, pesquise e selecione a política criada na etapa anterior e conclua a autorização.
-
Crie um AccessKey para o usuário RAM para armazenar como um Secret para pré-carregamento de dados.
Acesse a página Console RAM - Usuários, clique no usuário alvo na lista de usuários RAM e, na aba AccessKey, clique em Create AccessKey.
Siga as instruções para criar o AccessKey na caixa de diálogo e armazene com segurança o AccessKey ID e o AccessKey Secret.
-
Crie um Secret no cluster.
Use o YAML a seguir para criar um Secret no namespace
ack-volume-populatorpara armazenar o AccessKey.apiVersion: v1 kind: Secret metadata: name: oss-secret # The namespace must be set to ack-volume-populator namespace: ack-volume-populator stringData: # Replace with the previously obtained AccessKey ID accessKeyId: <your-AccessKey-ID> # Replace with the previously obtained AccessKey Secret accessKeySecret: <your-AccessKey-Secret>
2. Criar OSSVolumePopulator (OSSVP)
Crie um OSSVolumePopulator no mesmo namespace da sua aplicação e PVC. Defina mode como generic e configure a autorização.
apiVersion: storage.alibabacloud.com/v1beta1
kind: OSSVolumePopulator
metadata:
name: generic-demo
# Must be in the same namespace as the application and PVC
namespace: argo
spec:
bucket: my-test-bucket
region: cn-hangzhou
endpoint: oss-cn-hangzhou-internal.aliyuncs.com
path: /many-files/
# Generic mode for any backend storage volume
mode: generic
generic:
# Add labels to data population task pods for scheduling to ECI pods
labels:
alibabacloud.com/eci: "true"
# Add annotations to data population task pods for configuring ECI specs
annotations:
k8s.aliyun.com/eci-use-specs: "2-4Gi"
# Choose either secretRef or rrsaConfigs
# secretRef: oss-secret
rrsaConfigs:
# ARN of the RAM role used for RRSA authorization
roleArn: "acs:ram::1234567*****:role/oss-populator"
# ARN of the cluster's OIDC Provider
oidcProviderArn: "acs:ram::1234567*****:oidc-provider/my-oidc-provider"
# Configure affinity for data population task pods to schedule to specific nodes
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "disktype"
operator: NotIn
values:
- "hdd"
# Configure tolerations for data population task pods
tolerations:
- key: "virtual-kubelet.io/provider"
operator: Equal
value: "alibabacloud"
effect: NoSchedule
# Maximum throughput (MB/s)
# throughput: 1000
Parâmetros:
|
Nome |
Descrição |
Opcional |
Padrão |
|
|
O OSSVolumePopulator deve estar no mesmo namespace da aplicação e da PVC. |
Não |
N/A |
|
|
Nome do bucket do OSS. |
Não |
N/A |
|
|
region do OSS. |
Não |
N/A |
|
|
endpoint do service OSS. |
Não |
N/A |
|
|
Prefixo do caminho dentro do bucket do OSS, como |
Sim |
|
|
|
Modo de operação. Opções:
|
Sim |
|
|
|
Rótulos para pods de tarefas de preenchimento de dados agendarem no ECI. |
Sim |
N/A |
|
|
Anotações para pods de tarefas de preenchimento de dados configurarem especificações do ECI. |
Sim |
N/A |
|
|
Nome do Secret que armazena o AccessKey. Use este ou |
Sim |
N/A |
|
|
ARN da função RAM usada para autorização RRSA. Acesse a página Console RAM - Funções, clique no nome da função RAM e obtenha-o na página de detalhes. |
Obrigatório ao usar RRSA |
N/A |
|
|
ARN do Provedor OIDC do cluster. Acesse a página Clusters ACK, clique no nome do cluster alvo, selecione Cluster Information e obtenha-o na aba Basic Information em RRSA OIDC. |
Obrigatório ao usar RRSA |
N/A |
|
|
Afinidade para pods de tarefas de preenchimento de dados agendarem em nós específicos. |
Sim |
N/A |
|
|
Tolerâncias para pods de tarefas de preenchimento de dados. |
Sim |
N/A |
|
|
Throughput máximo (MB/s) para pods de tarefas de preenchimento de dados. Diferente do |
Sim |
Ilimitado (a taxa real depende da rede do nó, CPU e desempenho de gravação do armazenamento) |
3. Preparar StorageClass
Este cenário requer uma StorageClass para provisionamento dinâmico de discos cloud. O ACK fornece uma default StorageClass e suporta manually creating a StorageClass.
Este exemplo usa
alicloud-disk-essdcomreclaimPolicydefinido comoDeleteevolumeBindingModedefinido comoImmediate, adequado para computação serverless sem consciência de zona.Para fluxos de trabalho não serverless, use uma StorageClass com
volumeBindingModedefinido comoWaitForFirstConsumer(comoalicloud-disk-topology-alltype) para que discos cloud e pods da aplicação sejam criados na mesma zona.
4. Criar Argo Workflow
Este exemplo de Workflow usa um ephemeral volumeClaimTemplate para criar um disco cloud independente com dados pré-carregados para cada tarefa paralela.
Após criar o Workflow, verifique os logs de qualquer pod de tarefa para confirmar se as leituras dos dados pré-carregados foram bem-sucedidas.
Em produção, use o Artifact do Argo Workflows para persistir os resultados finais da computação no OSS.
# Replace <your-workflow-pod-name> with the actual pod name
kubectl -n argo logs <your-workflow-pod-name>
Saída esperada:
Subtask started, ID: 1
Creating a new log file...
Listing contents from the disk populated by OSSVP:
1-logs
lost+found
results-2025-04-16T07:48:00Z
...
Subtask completed, ID: 1
Análise do resultado:
1-logs: Arquivo gravado pela tarefa, confirmando acesso de leitura/gravação e armazenamento isolado entre tarefas paralelas.results-2025-04-16T07:48:00Ze arquivos similares: Dados pré-carregados do OSS para o disco cloud.lost+found: Diretório criado durante a formatação do sistema de arquivos. Ignore-o.
Guia de limpeza de resources
Após a conclusão das tarefas de processamento em lote, libere os volumes isolados de disco cloud e as instâncias do Argo Workflow.
Resources a serem liberados:
Instância do Argo Workflow
PVCs temporárias criadas automaticamente pelo Workflow
Resources de armazenamento de backend (discos cloud) criados automaticamente pelas PVCs.
Etapas de liberação:
-
Exclua o Argo Workflow:
Exclua o resource
Workflow. Com reivindicações de volumeephemeral, a exclusão se propaga para todas as PVCs. OStorageClasscomreclaimPolicy: Deleteentão exclui os discos cloud de backend, libera resources e interrompe o faturamento.# Replace <workflow-name> with the actual Workflow name kubectl -n argo delete workflow <workflow-name> -
Verifique a limpeza de resources:
Execute
kubectl -n argo get pvcpara confirmar se todas as PVCs relacionadas ao workflow foram excluídas.Verifique os resources de disco cloud: Acesse Console ECS - Block Storage - Disks e confirme se não restam resources de disco cloud deste workflow.
Os dados de source no OSS permanecem inalterados. No console OSS, confirme se o conjunto de dados permanece intacto.
Aplicar em produção
-
Gerenciamento de custos e resources:
Defina
reclaimPolicy: Deletena StorageClass para volumes criados dinamicamente, para que o armazenamento de alto desempenho seja limpo automaticamente após a conclusão das tarefas.No modo
generic, configureaffinityetolerationsnoOSSVolumePopulatorpara agendar pods temporários de tarefas em computação serverless de menor custo (incluindo ACS, ECI) ou instâncias spot.Solicite
storageda PVC maior que o tamanho dos dados de source, caso contrário, o preenchimento falhará por espaço insuficiente.
-
Desempenho e estabilidade:
Defina o
volumeBindingModeda StorageClass comoWaitForFirstConsumerem nós ECS para que discos cloud e pods da aplicação sejam criados na mesma zona.Para CPFS for Lingjun, escolha
dataType: metadatapara disponibilidade mais rápida do PV se a latência na primeira leitura for aceitável, oudataType: metadataAndDatapara pré-carregamento completo e alto desempenho na primeira leitura.Monitore o status do pré-carregamento com
kubectl describe ossvp <name>para solução rápida de problemas.
-
Segurança e permissões:
No modo
generic, prefira RRSA em vez de AccessKey ao conceder acesso ao OSS para pods de tarefas de preenchimento de dados.
Faturamento
Este resource incorre nas seguintes cobranças:
Taxas de armazenamento de alto desempenho baseadas no tipo de volume criado (como CPFS for Lingjun ou cloud disks) e seu ciclo de vida.
storage fees do OSS para dados de source.
Taxas de transferência de dados: Configure o endpoint interno do OSS no OSSVP para evitar cobranças de tráfego. Um endpoint público incorre em traffic fees.
Taxas de resources de computação (apenas para o modo
generic): Pods temporários consomem resources de computação do cluster (CPU, memória, largura de banda) e são cobrados por especificações e duração.Para CPFS for Lingjun no modo
bmcpfs-dataflow, as tarefas de fluxo de dados são free to use porque o resource de fluxo de dados está em preview público.
Perguntas frequentes
Após a conclusão do pré-carregamento, se eu atualizar arquivos de source no OSS, os dados no volume serão sincronizados automaticamente?
Não. O pré-carregamento de dados ocorre apenas uma vez durante a criação do volume. Após o preenchimento, o conteúdo do volume é desacoplado dos dados de source do OSS, e alterações posteriores no OSS não são sincronizadas.
Por que minha PVC permanece no status Pending?
O status Pending é normal durante o pré-carregamento de dados. Se persistir, solucione o problema da seguinte forma:
kubectl describe pvc <pvc-name> -n <namespace>: Verifique eventos da PVC para erros do populator.kubectl describe ossvp <ossvp-name> -n <namespace>: Verifique o status e eventos do OSSVP para progresso ou falhas no preenchimento.No modo
generic, verifique pods com falha no namespaceack-volume-populatore revise os logs. Causas comuns incluem permissões insuficientes no OSS, problemas de rede ou espaço de armazenamento insuficiente.