Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Montar um volume OSS dinâmico usando ossfs 2.0 em um cluster ACK

Última atualização: Jun 27, 2026

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:

  1. Configure as credenciais (função RAM para RRSA ou usuário RAM + Secret para AccessKey)

  2. Crie uma StorageClass

  3. Crie uma PVC

  4. 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.

Nota

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.

  1. Ative o recurso RRSA no console ACK.

  2. 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:sub

    oidc:sub — Operator

    Selecione StringEquals

    oidc:sub — Value

    Insira system:serviceaccount:ack-csi-fuse:csi-fuse-ossfs. O namespace ack-csi-fuse é fixo e não pode ser personalizado. O nome da conta de serviço csi-fuse-ossfs pode 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

  1. Crie uma política personalizada para conceder acesso ao OSS à função. Substitua mybucket pelo 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"
      }
  2. (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.

  3. Conceda a política personalizada à função demo-role-for-rrsa.

    Nota

    Para 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

  1. Crie o arquivo ossfs2-sc-rrsa.yaml:

    Parâmetro Obrigatório Descrição Padrão / comportamento quando omitido
    bucket Sim Nome do bucket OSS a ser montado —
    path Sim 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
    url Sim 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.
    Nota

    O formato de endpoint interno vpc100-oss-<region>.aliyuncs.com foi descontinuado — migre para o novo formato.

    —
    fuseType Sim Deve ser definido como ossfs2 para usar o cliente ossfs 2.0 —
    authType Sim Defina como rrsa —
    roleName Sim 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 —
    volumeAs Não Defina como sharepath para que cada PV crie um subdiretório separado sob path —
    otherOpts Nã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.0 Nenhuma 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:

  2. Aplique a StorageClass:

    kubectl create -f ossfs2-sc-rrsa.yaml
  3. Verifique se a StorageClass foi criada:

    kubectl get sc ossfs2-sc

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

  1. 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
  2. Crie a PVC:

    kubectl create -f ossfs2-pvc-dynamic.yaml
  3. Verifique se a PVC está vinculada ao PV criado automaticamente:

    kubectl get pvc pvc-ossfs2

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

  1. 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
  2. Implante a aplicação:

    kubectl create -f ossfs2-test.yaml
  3. Verifique se o pod está em execução:

    kubectl get pod -l app=ossfs2-test

    Saída esperada:

    NAME            READY   STATUS    RESTARTS   AGE
    ossfs2-test-0   1/1     Running   0          2m
  4. 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 /data

    A saída deve incluir test.txt, confirmando que o volume está montado e permite gravação.

Método 2: Autenticar usando AccessKey

Importante

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

  1. Crie um usuário RAM caso ainda não possua um.

  2. Crie uma política personalizada para conceder acesso ao OSS. Substitua mybucket pelo 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"
      }
  3. (Opcional) Se os objetos no bucket estiverem criptografados com uma CMK no KMS, conceda também acesso ao KMS. Consulte Criptografia.

  4. Conceda a política personalizada ao usuário RAM.

  5. 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

  1. Crie o arquivo ossfs2-sc.yaml:

    Configuração do Secret

    Parâmetro

    Obrigatório

    Descrição

    csi.storage.k8s.io/node-publish-secret-name

    Sim

    Nome do Secret que armazena o AccessKey

    csi.storage.k8s.io/node-publish-secret-namespace

    Sim

    Namespace onde o Secret está localizado

    Configuração do volume

    Parâmetro Obrigatório Descrição Padrão / comportamento quando omitido
    fuseType Sim Deve ser definido como ossfs2 para usar o cliente ossfs 2.0 —
    bucket Sim Nome do bucket OSS a ser montado —
    path Não Caminho de montagem dentro do bucket, relativo à raiz do bucket Monta a raiz do bucket se deixado em branco
    url Sim 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.
    Nota

    O formato de endpoint interno vpc100-oss-<region>.aliyuncs.com foi descontinuado.

    —
    otherOpts Nã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.0 Nenhuma 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.
  2. Crie a StorageClass:

    kubectl create -f ossfs2-sc.yaml

Etapa 3: Crie uma PVC

  1. 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
  2. Crie a PVC:

    kubectl create -f ossfs2-pvc-dynamic.yaml
  3. Verifique se a PVC está vinculada:

    kubectl get pvc pvc-ossfs2

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

  1. 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
  2. Implante a aplicação:

    kubectl create -f ossfs2-test.yaml
  3. Verifique se o pod está em execução:

    kubectl get pod -l app=ossfs2-test

    Saída esperada:

    NAME            READY   STATUS    RESTARTS   AGE
    ossfs2-test-0   1/1     Running   0          2m
  4. 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 /data

    A 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 close_to_open=false (padrão) para reduzir chamadas de API de metadados. Defina close_to_open=true apenas se outro sistema atualizar objetos no bucket frequentemente e seu pod precisar de visibilidade imediata. Para ajustes adicionais, consulte as opções de montagem do ossfs 2.0.

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.

Perguntas frequentes