Em aplicações containerizadas, o método convencional para montar dados de armazenamento de objetos utiliza um sistema de arquivos baseado em Filesystem in Userspace (FUSE), como o ossfs. No entanto, essa abordagem frequentemente apresenta desempenho insuficiente em cenários de leitura intensiva que envolvem milhões de arquivos pequenos, como carregamento de conjuntos de dados para treinamento de IA ou análise de logs de séries temporais, nos quais alto throughput e baixa latência são críticos. Para esses casos de uso, recomendamos uma solução de dispositivo de bloco virtual. Ao montar dados de armazenamento de objetos diretamente com um volume strmvol, você otimiza significativamente o desempenho de leitura de arquivos pequenos.
Notas de uso
Volumes strmvol
Use apenas endpoints internos para acessar dados do OSS.
-
Durante a inicialização de um dispositivo de bloco virtual, o sistema constrói um índice completo de metadados de arquivos. Esse processo consome recursos do nó e mantém o pod da aplicação no estado
ContainerCreating. O tempo e os recursos necessários são diretamente proporcionais à quantidade de arquivos no caminho de montagem do bucket do OSS.-
Ao selecionar um caminho de montagem de bucket do OSS, siga o princípio do menor privilégio.
Se o Negócio A acessa conteúdo em
/app/a/em um bucket do OSS e o Negócio B acessa conteúdo em/app/b/, crie volumes separados para o Negócio A e o Negócio B com caminhos de destino de montagem/app/a/e/app/b/, respectivamente. Para obter informações sobre o tempo e a sobrecarga de recursos durante a inicialização, consulte Construção de índice de metadados.
-
As configurações no PersistentVolume (PV) limitam o consumo de recursos do dispositivo de bloco virtual durante seu ciclo de vida de montagem, exceto na fase de inicialização. Reserve recursos suficientes no nó.
Um único dispositivo de bloco virtual tem capacidade de 16 TiB; portanto, o caminho montado do OSS também está limitado a 16 TiB de dados.
Requisitos de cluster e nó
O cluster deve ser um cluster ACK gerenciado Pro ou um cluster ACK dedicado executando Kubernetes 1.20 ou posterior. O plug-in de armazenamento deve ser um plug-in Container Storage Interface (CSI).
Os nós devem usar a versão de kernel 4,19 ou posterior. Recomendamos especificações de recursos de pelo menos 4 vCPU e 8 GiB de memória.
-
Sistemas operacionais de nó suportados: Alibaba Cloud Linux 3, Alibaba Cloud Linux 2 e CentOS 7. Para otimizar o desempenho de acesso a dados com o sistema operacional erofs, recomendamos o uso do Alibaba Cloud Linux 3.
NotaO CentOS 7 e o Alibaba Cloud Linux 2 atingiram o fim de vida útil (EOL). Para mais informações, consulte [[Alteração de Produto] Anúncio sobre a descontinuação do suporte para Alibaba Cloud Linux 2 e CentOS 7](t2602809.xdita#).
Não é possível montar volumes strmvol em um pod serverless agendado em um nó virtual.
Pré-requisitos
Etapa 1: Implantar o strmvol-csi-driver
Para usar volumes strmvol, implante um driver CSI separado, o componente strmvol-csi-driver. Após a implantação, esse driver CSI opera independentemente e não entra em conflito com os componentes csi-provisioner e csi-plugin gerenciados pelo ACK.
Faça login no console do ACK. No painel de navegação à esquerda, escolha .
Na página Marketplace, pesquise por strmvol-csi-driver e clique em seu cartão.
Na página de detalhes da aplicação, clique em Deploy no canto superior direito.
No painel exibido, configure as informações básicas e os parâmetros e clique em OK.
Etapa 2: Configurar permissões de acesso ao OSS
-
Crie um usuário RAM e conceda as permissões necessárias.
-
Crie um usuário RAM. Pule esta etapa se já possuir um usuário RAM.
Acesse a página Criar Usuário no Console RAM e siga as instruções na tela para criar um usuário RAM. Especifique parâmetros como nome de login e senha.
-
Crie uma política personalizada para acesso ao OSS. Para mais informações, consulte Criar uma política personalizada.
Escolha entre as seguintes políticas de permissão de somente leitura e leitura/gravação conforme suas necessidades e substitua
mybucketpelo nome do seu bucket.-
Política de somente leitura do OSS
-
Política de leitura/gravação do OSS
Clique para visualizar a política de leitura/gravação
{ "Statement": [ { "Action": "oss:*", "Effect": "Allow", "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] } ], "Version": "1" }
-
(Opcional) Se você criptografa objetos do OSS com uma chave mestra de cliente (CMK) do Key Management Service (KMS), também deve conceder permissões do KMS ao usuário RAM. Para mais informações, consulte Criptografar volumes ossfs 1.0.
Conceda as permissões do OSS ao usuário RAM. Para mais informações, consulte Gerenciar permissões de usuário RAM.
-
O AccessKey criado será armazenado como um Secret para o PV.
Acesse a página Usuários no Console RAM, clique em seu nome de usuário RAM e, na seção AccessKey, clique em Create AccessKey.
Siga as instruções na tela para criar um AccessKey. Copie e armazene com segurança o AccessKey ID e o AccessKey Secret.
-
-
Crie um secret para armazenar as credenciais de autenticação para acesso aos dados do OSS.
O comando abaixo é um exemplo. Substitua
akIdeakSecretpelo seu AccessKey ID e AccessKey secret.kubectl create -n default secret generic strmvol-secret --from-literal='akId=xxxxxx' --from-literal='akSecret=xxxxxx'
Montar um volume strmvol
Etapa 1: Criar um volume strmvol
Volume estático
-
Crie um PersistentVolume (PV).
-
Crie um arquivo chamado strmvol-pv.yaml com o seguinte conteúdo.
apiVersion: v1 kind: PersistentVolume metadata: name: pv-strmvol spec: capacity: # The mounted OSS path can store a maximum of 16 TiB of data. storage: 20Gi # Only the ReadOnlyMany access mode is supported. accessModes: - ReadOnlyMany # To prevent accidental data loss, only the Retain policy is supported. persistentVolumeReclaimPolicy: Retain csi: driver: strmvolplugin.csi.alibabacloud.com volumeHandle: pv-strmvol # Use the secret created in the prerequisite steps. nodeStageSecretRef: name: strmvol-secret namespace: default volumeAttributes: bucket: cnfs-oss-test path: /subpath # strmvol volumes only support accessing OSS data over an internal network. url: oss-cn-hangzhou-internal.aliyuncs.com umask: "000" directMode: "false" resourceLimit: "2c4g"-
Parâmetros em
nodeStageSecretRefParâmetro
Obrigatório
Descrição
nameSim
Nome do secret que armazena as informações do AccessKey.
namespaceSim
Namespace do secret que contém as informações do AccessKey.
-
Parâmetros em
volumeAttributesParâmetro
Obrigatório
Descrição
bucketSim
Bucket do OSS a ser montado.
pathNão
Caminho do diretório a ser montado dentro do bucket do OSS. Este caminho é relativo à raiz do bucket.
ImportanteSelecione um caminho de montagem baseado no princípio do menor privilégio.
urlSim
Endpoint interno para o OSS. Deve corresponder ao endpoint exibido na página Visão Geral do bucket no console do OSS. Formatos comuns para endpoints internos incluem:
http://oss-{{regionName}}-internal.aliyuncs.comouhttps://oss-{{regionName}}-internal.aliyuncs.com.ImportanteO formato de endpoint interno
vpc100-oss-{{regionName}}.aliyuncs.comestá obsoleto. Atualize para um novo formato o mais rápido possível.umaskNão
Máscara de permissão para o sistema de arquivos após a montagem do dispositivo de bloco virtual.
Por exemplo, para definir as permissões padrão de arquivo como
755, definaumaskcomo022.directModeNão
Define se o modo direto deve ser ativado.
"true": Ativa o modo direto, que desabilita o pré-busca de dados e o cache local. Adequado para cenários de leitura aleatória, como leitura em lote aleatória de conjuntos de dados de treinamento."false": Desativa o modo direto (padrão). Adequado para cenários de uso geral, como leituras sequenciais de arquivos pequenos ou leituras de arquivos grandes. Se sua aplicação não tiver um padrão específico de acesso a dados, mantenha este modo desativado.
resourceLimitNão
Recursos máximos do nó que o dispositivo de bloco virtual pode consumir.
Por exemplo,
"2c4g"indica que o dispositivo de bloco virtual pode usar até 2 vCPUs e 4 GiB de memória do nó.NotaA memória é usada principalmente para pré-busca de dados e cache local. Quando o modo direto está ativado, o uso de memória é significativamente menor que o valor predefinido.
Para sistemas operacionais diferentes do Alibaba Cloud Linux 3, o desempenho de leitura é semelhante independentemente da configuração. Portanto, limites altos de recursos não são recomendados. Para mais informações, consulte Testes de desempenho de leitura de dados.
-
-
Crie o PV.
kubectl create -f strmvol-pv.yaml -
Verifique o status do PV.
kubectl get pv pv-strmvolSaída esperada:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pv-strmvol 20Gi ROX Retain Available <unset> 18s
-
-
Crie um PersistentVolumeClaim (PVC).
-
Crie um arquivo chamado strmvol-pvc-static.yaml com o seguinte conteúdo.
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-strmvol namespace: default spec: # The following settings must match the PV configuration. accessModes: - ReadOnlyMany resources: requests: storage: 20Gi volumeName: pv-strmvol -
Crie o PVC.
kubectl create -f strmvol-pvc-static.yaml -
Verifique o status do PVC.
kubectl get pvc pvc-strmvolA saída esperada mostra que o PVC agora está vinculado ao PV.
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-strmvol-2 Bound pv-strmvol 20Gi ROX <unset> 16s
-
Volume dinâmico
-
Crie uma StorageClass.
-
Crie um arquivo chamado strmvol-sc.yaml com o seguinte conteúdo.
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: strmvol-test parameters: # Use the secret created in the prerequisite steps. csi.storage.k8s.io/node-stage-secret-name: strmvol-secret csi.storage.k8s.io/node-stage-secret-namespace: default bucket: cnfs-oss-test path: /subpath # strmvol volumes only support accessing OSS data over an internal network. url: oss-cn-hangzhou-internal.aliyuncs.com umask: "000" directMode: "false" resourceLimit: "2c4g" provisioner: strmvolplugin.csi.alibabacloud.com # To prevent accidental data loss, only the Retain policy is supported. reclaimPolicy: Retain volumeBindingMode: ImmediateOs parâmetros em
parameterssão descritos da seguinte forma:-
Configuração do Secret
Parâmetro
Obrigatório
Descrição
csi.storage.k8s.io/node-stage-secret-nameSim
Nome do secret que armazena as informações do AccessKey.
csi.storage.k8s.io/node-stage-secret-namespaceSim
Namespace do secret que contém as informações do AccessKey.
-
Configuração do volume
Parâmetro
Obrigatório
Descrição
bucketSim
Bucket do OSS a ser montado.
pathNão
Caminho do diretório a ser montado dentro do bucket do OSS. Este caminho é relativo à raiz do bucket.
ImportanteSelecione um caminho de montagem baseado no princípio do menor privilégio.
urlSim
Endpoint interno para o OSS. Deve corresponder ao endpoint exibido na página Visão Geral do bucket no console do OSS. Formatos comuns para endpoints internos incluem:
http://oss-{{regionName}}-internal.aliyuncs.comouhttps://oss-{{regionName}}-internal.aliyuncs.com.ImportanteO formato de endpoint interno
vpc100-oss-{{regionName}}.aliyuncs.comestá obsoleto. Atualize para um novo formato o mais rápido possível.umaskNão
Máscara de permissão para o sistema de arquivos após a montagem do dispositivo de bloco virtual.
Por exemplo, para definir as permissões padrão de arquivo como
755, definaumaskcomo022.directModeNão
Define se o modo direto deve ser ativado.
"true": Ativa o modo direto, que desabilita o pré-busca de dados e o cache local. Adequado para cenários de leitura aleatória, como leitura em lote aleatória de conjuntos de dados de treinamento."false": Desativa o modo direto (padrão). Adequado para cenários de uso geral, como leituras sequenciais de arquivos pequenos ou leituras de arquivos grandes. Se sua aplicação não tiver um padrão específico de acesso a dados, mantenha este modo desativado.
resourceLimitNão
Recursos máximos do nó que o dispositivo de bloco virtual pode consumir.
Por exemplo,
"2c4g"indica que o dispositivo de bloco virtual pode usar até 2 vCPUs e 4 GiB de memória do nó.NotaA memória é usada principalmente para pré-busca de dados e cache local. Quando o modo direto está ativado, o uso de memória é significativamente menor que o valor predefinido.
Para sistemas operacionais diferentes do Alibaba Cloud Linux 3, o desempenho de leitura é semelhante independentemente da configuração. Portanto, limites altos de recursos não são recomendados. Para mais informações, consulte Testes de desempenho de leitura de dados.
-
-
Crie a StorageClass.
kubectl create -f strmvol-sc.yaml
-
-
Crie um PVC.
-
Crie um arquivo chamado strmvol-pvc-dynamic.yaml com o seguinte conteúdo.
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-strmvol namespace: default spec: # Only the ReadOnlyMany access mode is supported. accessModes: - ReadOnlyMany # Specify the StorageClass. storageClassName: strmvol-test resources: requests: # The mounted OSS path can store a maximum of 16 TiB of data. storage: 20Gi -
Crie o PVC.
kubectl create -f strmvol-pvc-dynamic.yaml -
Verifique o status do PVC.
kubectl get pvc pvc-strmvolA saída esperada mostra que o PVC está vinculado a um PV provisionado automaticamente pelo driver CSI.
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-strmvol Bound strmvol-d8d1d22a-e1d7-4caa-b875-54f378dec769 20Gi ROX strmvol-test <unset> 3m
-
Etapa 2: Criar uma aplicação e montar o volume
-
Crie um arquivo chamado strmvol-test.yaml com o seguinte conteúdo.
O exemplo YAML a seguir cria um StatefulSet com um pod. O pod solicita recursos de armazenamento usando um PVC chamado
pvc-strmvol, e o caminho de montagem é/data.apiVersion: apps/v1 kind: StatefulSet metadata: name: strmvol-test namespace: default spec: replicas: 1 selector: matchLabels: app: strmvol-test template: metadata: labels: app: strmvol-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-strmvol mountPath: /data volumes: - name: pvc-strmvol persistentVolumeClaim: claimName: pvc-strmvol -
Crie o StatefulSet.
kubectl create -f strmvol-test.yaml -
Verifique o status de implantação do pod no StatefulSet.
kubectl get pod -l app=strmvol-testSaída esperada:
NAME READY STATUS RESTARTS AGE strmvol-test-0 1/1 Running 0 14s -
Verifique se o ponto de montagem é um dispositivo de bloco e se a aplicação consegue acessar os dados no OSS.
kubectl exec -it strmvol-test-0 -- sh -c "df /data && ls /data"Saída esperada:
Filesystem 1K-blocks Used Available Use% Mounted on /dev/ublkb1 24812 24812 0 100% /data <data in OSS mount path>