Monte um bucket do Object Storage Service (OSS) como um volume persistente (PV) em um cluster ACK usando o ossfs 2.0 — o cliente baseado em FUSE (Filesystem in Userspace) otimizado para cargas de trabalho de leitura e escrita sequenciais. Com o provisionamento dinâmico, uma StorageClass atua como modelo que cria e vincula automaticamente um PV ao criar uma PersistentVolumeClaim (PVC). Assim, sua aplicação lê e grava dados no OSS por meio de interfaces POSIX padrão, sem gerenciar PVs manualmente.
O ossfs 2.0 destaca-se pelo throughput sequencial, sendo ideal para treinamento de IA, inferência e processamento de big data. Para benchmarks de desempenho, consulte benchmarks de desempenho do cliente ossfs 2.0.
Antes de começar
Verifique as restrições obrigatórias antes de iniciar. O ossfs 2.0 não é adequado para todas as cargas de trabalho — prosseguir sem validar esses pontos causará retrabalho.
Interrompa o processo se algum destes cenários se aplicar:
Escritas aleatórias ou concorrentes: o ossfs 2.0 não garante consistência de dados para operações de escrita aleatórias ou concorrentes. Use o ossfs 1.0 para bancos de dados, edição colaborativa ou qualquer carga de trabalho que modifique o conteúdo do arquivo localmente.
Versão do Kubernetes inferior a 1.26: a autenticação RRSA exige Kubernetes 1.26 ou posterior. Atualize seu cluster se necessário.
Versão do plugin CSI inferior a 1.33.1: ambos os métodos de autenticação exigem a versão 1.33.1 ou superior do plugin CSI. Atualize o csi-plugin e o csi-provisioner se necessário.
Antes de começar, certifique-se de ter:
Um cluster ACK com o plugin CSI instalado
Um bucket OSS na mesma conta Alibaba Cloud do cluster. Para montar um bucket entre contas diferentes, use a autenticação RRSA — consulte as perguntas frequentes sobre volumes ossfs 2.0 para mais detalhes
Notas de uso
Alterações de dados imediatas: qualquer modificação ou exclusão de arquivo em um ponto de montagem ossfs — seja dentro de um pod ou no nó host — sincroniza-se instantaneamente com o bucket OSS de source. Ative o versionamento para proteger contra perda acidental de dados.
Verificações de integridade: configure um liveness probe nos pods que usam volumes OSS para monitorar a disponibilidade do ponto de montagem. Se a montagem falhar, o Kubernetes reinicia o pod automaticamente.
Uploads multipart: arquivos maiores que 10 MB são enviados automaticamente via upload multipart. Se o envio for interrompido, partes incompletas permanecem no bucket e geram custos de armazenamento. Configure uma regra de ciclo de vida para limpá-las automaticamente ou exclua-as manualmente.
Escolha um método de autenticação
|
RRSA |
AccessKey |
|
|
Tipo de credencial |
Temporária, com rotação automática (via OIDC + STS) |
Chave estática de longo prazo |
|
Escopo de permissão |
Isolamento no nível do pod |
Compartilhada entre todos os pods que usam o mesmo Secret |
|
Indicado para |
Ambientes de produção e multilocatários |
Apenas desenvolvimento e testes |
|
Risco em caso de exposição da chave |
Baixo — as credenciais expiram automaticamente |
Alto — a chave deve ser revogada e rotacionada manualmente |
|
Rotação de chaves |
Automática |
Manual; exige atualização do Secret e reinicialização dos pods |
Use RRSA para ambientes de produção. A autenticação via AccessKey é aceitável apenas para desenvolvimento e testes — uma chave estática exposta ou mal configurada exige revogação manual e causa interrupção do serviço durante a rotação.
Ambos os métodos seguem o mesmo fluxo geral:
Configure as credenciais (função RAM para RRSA ou usuário RAM + Secret para AccessKey)
Crie uma StorageClass
Crie uma PVC
Monte o volume na aplicação
Método 1: Autenticar usando RRSA
O RRSA (RAM Roles for Service Accounts) fornece isolamento de permissões no nível do pod usando credenciais temporárias com rotação automática por meio do OpenID Connect (OIDC) e Security Token Service (STS). Para mais informações, consulte Usar RRSA para autorizar pods diferentes a acessar serviços de nuvem diferentes.
Se você já usou RRSA com uma versão do plugin CSI anterior a 1.30.4, consulte [\[Alterações do Produto\] Atualização de versão e otimização do processo de montagem do ossfs no CSI](https://www.alibabacloud.com/help/en/document_detail/2842828.html) para verificar as mudanças necessárias na autorização da função RAM.
Etapa 1: Crie uma função RAM
Ignore esta etapa se já tiver montado um volume OSS neste cluster usando RRSA.
-
Crie uma função RAM para um Provedor de Identidade OIDC. Use os seguintes parâmetros para a função de exemplo
demo-role-for-rrsa:Parâmetro
Valor
Identity Provider Type
Selecione OIDC
Identity Provider
Selecione o provedor associado ao cluster, como
ack-rrsa-<cluster_id>oidc:iss
Mantenha o valor padrão
oidc:aud
Mantenha o valor padrão
oidc:sub — Key
Selecione
oidc:suboidc:sub — Operator
Selecione StringEquals
oidc:sub — Value
Insira
system:serviceaccount:ack-csi-fuse:csi-fuse-ossfs. O namespaceack-csi-fuseé fixo e não pode ser personalizado. O nome da conta de serviçocsi-fuse-ossfspode ser alterado — consulte as perguntas frequentes sobre volumes ossfs 2.0.Role Name
Insira
demo-role-for-rrsa
Etapa 2: Conceder permissões OSS à função RAM
-
Crie uma política personalizada para conceder acesso ao OSS à função. Substitua
mybucketpelo nome real do bucket.-
Acesso somente leitura
{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] } ], "Version": "1" } -
Acesso de leitura e gravação
{ "Statement": [ { "Action": "oss:*", "Effect": "Allow", "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] } ], "Version": "1" }
-
(Opcional) Se os objetos no bucket estiverem criptografados com uma chave mestra do cliente (CMK) no Key Management Service (KMS), conceda também acesso ao KMS. Consulte Criptografia.
-
Conceda a política personalizada à função demo-role-for-rrsa.
NotaPara reutilizar uma função RAM existente que já tenha acesso ao OSS, modifique sua política de confiança. Consulte Usar uma função RAM existente e conceder as permissões necessárias à função RAM.
Etapa 3: Crie uma StorageClass
-
Crie o arquivo
ossfs2-sc-rrsa.yaml:Parâmetro Obrigatório Descrição Padrão / comportamento quando omitido bucketSim Nome do bucket OSS a ser montado — pathSim Caminho base dentro do bucket. Com volumeAs: sharepath, cada PV obtém um subdiretório exclusivo sob este caminho, como/ack/<pv-name>Monta a raiz do bucket se deixado em branco urlSim O endpoint do bucket OSS. Use um endpoint interno ( http://oss-<region>-internal.aliyuncs.com) se o cluster e o bucket estiverem na mesma região ou conectados via Virtual Private Cloud (VPC). Use um endpoint público (http://oss-<region>.aliyuncs.com) para acesso entre regiões.NotaO formato de endpoint interno
vpc100-oss-<region>.aliyuncs.comfoi descontinuado — migre para o novo formato.— fuseTypeSim Deve ser definido como ossfs2para usar o cliente ossfs 2.0— authTypeSim Defina como rrsa— roleNameSim Função RAM a ser assumida. Para atribuir permissões diferentes por PV, crie uma função RAM separada para cada conjunto de permissões e especifique-a aqui — volumeAsNão Defina como sharepathpara que cada PV crie um subdiretório separado sobpath— otherOptsNão Opções adicionais de montagem no formato -o <flag> -o <flag>. Para todas as opções disponíveis, consulte opções de montagem do ossfs 2.0Nenhuma opção adicional apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ossfs2-sc parameters: bucket: cnfs-oss-test # The name of your OSS bucket. path: /subpath # The subdirectory to mount. Leave blank to mount the bucket root. url: oss-cn-hangzhou-internal.aliyuncs.com # Internal endpoint (same region or VPC); use public endpoint for cross-region. authType: rrsa roleName: demo-role-for-rrsa # The RAM role created in Step 1. fuseType: ossfs2 # Must be ossfs2 to use the ossfs 2.0 client. volumeAs: sharepath # Each PV gets a unique subdirectory under path, e.g., /subpath/ack/<pv-name>. otherOpts: "-o close_to_open=false" # false (default): cache metadata for lower latency. true: fetch fresh metadata on every file open (increases latency and API costs). provisioner: ossplugin.csi.alibabacloud.com # Fixed value. reclaimPolicy: Retain # Only Retain is supported. Deleting the PVC does not delete the PV or OSS data. volumeBindingMode: Immediate # OSS volumes have no zone-based node affinity requirements.A tabela a seguir descreve os campos de
parameters: -
Aplique a StorageClass:
kubectl create -f ossfs2-sc-rrsa.yaml -
Verifique se a StorageClass foi criada:
kubectl get sc ossfs2-scSaída esperada:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE ossfs2-sc ossplugin.csi.alibabacloud.com Retain Immediate 10s
Etapa 4: Crie uma PVC
A criação da PVC aciona o provisionamento automático do PV subjacente.
-
Crie o arquivo
ossfs2-pvc-dynamic.yaml:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: ossfs2-sc -
Crie a PVC:
kubectl create -f ossfs2-pvc-dynamic.yaml -
Verifique se a PVC está vinculada ao PV criado automaticamente:
kubectl get pvc pvc-ossfs2Saída esperada:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-ossfs2 Bound d-bp17y03tpy2b8x****** 20Gi RWX ossfs2-sc 25s
Etapa 5: Montar o volume na aplicação
-
Crie o arquivo
ossfs2-test.yaml. O StatefulSet abaixo monta a PVC em/data:apiVersion: apps/v1 kind: StatefulSet metadata: name: ossfs2-test namespace: default spec: replicas: 1 selector: matchLabels: app: ossfs2-test template: metadata: labels: app: ossfs2-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-ossfs2 mountPath: /data volumes: - name: pvc-ossfs2 persistentVolumeClaim: claimName: pvc-ossfs2 -
Implante a aplicação:
kubectl create -f ossfs2-test.yaml -
Verifique se o pod está em execução:
kubectl get pod -l app=ossfs2-testSaída esperada:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 2m -
Valide o acesso de leitura e gravação ao ponto de montagem:
# Write a test file kubectl exec -it ossfs2-test-0 -- touch /data/test.txt # List files at the mount point kubectl exec -it ossfs2-test-0 -- ls /dataA saída deve incluir
test.txt, confirmando que o volume está montado e permite gravação.
Método 2: Autenticar usando AccessKey
Este método usa uma chave estática de longo prazo. Use-o apenas para desenvolvimento e testes. Para produção, prefira a autenticação RRSA.
Se o AccessKey referenciado por um PV for revogado ou tiver suas permissões alteradas, todos os pods que usam esse volume perderão o acesso imediatamente. Para restaurar o acesso: atualize as credenciais no Secret e reinicie os pods. Isso causa uma breve interrupção do serviço e deve ser executado durante uma janela de manutenção.
Etapa 1: Crie um usuário RAM e armazenar credenciais em um Secret
Crie um usuário RAM e conceder permissões OSS
Crie um usuário RAM caso ainda não possua um.
-
Crie uma política personalizada para conceder acesso ao OSS. Substitua
mybucketpelo nome real do bucket.-
Acesso somente leitura
{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] } ], "Version": "1" } -
Acesso de leitura e gravação
{ "Statement": [ { "Action": "oss:*", "Effect": "Allow", "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] } ], "Version": "1" }
-
(Opcional) Se os objetos no bucket estiverem criptografados com uma CMK no KMS, conceda também acesso ao KMS. Consulte Criptografia.
Crie um par de AccessKey para o usuário RAM.
Armazenar o AccessKey em um Secret do Kubernetes
Execute o comando abaixo. Substitua os valores de espaço reservado pelo seu AccessKey ID e Secret reais:
kubectl create -n default secret generic oss-secret \
--from-literal='akId=<your-access-key-id>' \
--from-literal='akSecret=<your-access-key-secret>'
Etapa 2: Crie uma StorageClass
-
Crie o arquivo
ossfs2-sc.yaml:Configuração do Secret
Parâmetro
Obrigatório
Descrição
csi.storage.k8s.io/node-publish-secret-nameSim
Nome do Secret que armazena o AccessKey
csi.storage.k8s.io/node-publish-secret-namespaceSim
Namespace onde o Secret está localizado
Configuração do volume
Parâmetro Obrigatório Descrição Padrão / comportamento quando omitido fuseTypeSim Deve ser definido como ossfs2para usar o cliente ossfs 2.0— bucketSim Nome do bucket OSS a ser montado — pathNão Caminho de montagem dentro do bucket, relativo à raiz do bucket Monta a raiz do bucket se deixado em branco urlSim Endpoint do bucket OSS. Use um endpoint interno ( http://oss-<region>-internal.aliyuncs.com) para acesso na mesma região ou via VPC, ou um endpoint público (http://oss-<region>.aliyuncs.com) para acesso entre regiões.NotaO formato de endpoint interno
vpc100-oss-<region>.aliyuncs.comfoi descontinuado.— otherOptsNão Opções adicionais de montagem no formato -o <flag> -o <flag>. Para todas as opções disponíveis, consulte opções de montagem do ossfs 2.0Nenhuma opção adicional apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ossfs2-sc parameters: csi.storage.k8s.io/node-publish-secret-name: oss-secret # The Secret created above. csi.storage.k8s.io/node-publish-secret-namespace: default # The namespace where the Secret lives. fuseType: ossfs2 # Must be ossfs2 to use the ossfs 2.0 client. bucket: cnfs-oss-test # The name of your OSS bucket. path: /subpath # The subdirectory to mount. Leave blank to mount the bucket root. url: oss-cn-hangzhou-internal.aliyuncs.com # Internal endpoint (same region or VPC); use public endpoint for cross-region. otherOpts: "-o close_to_open=false" # false (default): cache metadata for lower latency. true: fetch fresh metadata on every file open (increases latency and API costs). provisioner: ossplugin.csi.alibabacloud.com # Fixed value. reclaimPolicy: Retain # Only Retain is supported. Deleting the PVC does not delete the PV or OSS data. volumeBindingMode: Immediate # OSS volumes have no zone-based node affinity requirements. -
Crie a StorageClass:
kubectl create -f ossfs2-sc.yaml
Etapa 3: Crie uma PVC
-
Crie o arquivo
ossfs2-pvc-dynamic.yaml:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-ossfs2 namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi storageClassName: ossfs2-sc -
Crie a PVC:
kubectl create -f ossfs2-pvc-dynamic.yaml -
Verifique se a PVC está vinculada:
kubectl get pvc pvc-ossfs2Saída esperada:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-ossfs2 Bound d-bp17y03tpy2b8x****** 20Gi RWX ossfs2-sc 25s
Etapa 4: Montar o volume na aplicação
-
Crie o arquivo
ossfs2-test.yaml:apiVersion: apps/v1 kind: StatefulSet metadata: name: ossfs2-test namespace: default spec: replicas: 1 selector: matchLabels: app: ossfs2-test template: metadata: labels: app: ossfs2-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-ossfs2 mountPath: /data volumes: - name: pvc-ossfs2 persistentVolumeClaim: claimName: pvc-ossfs2 -
Implante a aplicação:
kubectl create -f ossfs2-test.yaml -
Verifique se o pod está em execução:
kubectl get pod -l app=ossfs2-testSaída esperada:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 2m -
Valide o acesso de leitura e gravação:
# Write a test file kubectl exec -it ossfs2-test-0 -- touch /data/test.txt # List files at the mount point kubectl exec -it ossfs2-test-0 -- ls /dataA saída deve incluir
test.txt, confirmando que o volume está montado e permite gravação.
Aplicação em produção
|
Categoria |
Melhores práticas |
|
Segurança |
Use RRSA — ele fornece credenciais temporárias com rotação automática e isolamento de permissões no nível do pod, eliminando o risco de exposição de chaves estáticas. Conceda apenas as permissões mínimas necessárias (somente leitura ou leitura/gravação, com escopo limitado a um bucket específico). |
|
Desempenho |
Prefira um endpoint interno quando o cluster e o bucket estiverem na mesma região para evitar custos de transferência de dados públicos e reduzir a latência. Para cargas de trabalho que leem muitos arquivos pequenos, mantenha |
|
Adequação da carga |
O ossfs 2.0 é otimizado para cargas com muitas leituras e apenas anexos: treinamento de IA, inferência, processamento de big data e direção autônoma. Não é adequado para cargas com escritas aleatórias, como bancos de dados ou edição colaborativa. |
|
Custo |
Configure uma regra de ciclo de vida no bucket OSS para excluir automaticamente uploads multipart incompletos. Isso evita o acúmulo de custos de armazenamento decorrentes de uploads de arquivos grandes interrompidos. |
|
Operações |
Configure um liveness probe nos pods para verificar a disponibilidade do ponto de montagem — o Kubernetes reiniciará o pod automaticamente se a montagem falhar. Configure o monitoramento de armazenamento de contêineres para acompanhar o desempenho do volume e receber alertas antes que problemas afetem a carga de trabalho. |