Configurar montagens de volumes do Cloud Storage para serviços

Nesta página, você aprende a montar um bucket do Cloud Storage como um volume de armazenamento usando as montagens de volumes do Cloud Run.

Montar o bucket como um volume no Cloud Run apresenta o bucket conteúdo como arquivos no sistema de arquivos do contêiner. Depois de ativar o bucket, como um volume, você acessa o bucket como se fosse um diretório no arquivo local do sistema de arquivos, usando as operações e bibliotecas do sistema de arquivos da sua linguagem de programação em vez das bibliotecas de cliente das APIs do Google.

.

Requisitos de memória

As montagens de volume do Cloud Storage usam a memória do contêiner do Cloud Run para as seguintes atividades:

  • Para todo o armazenamento em cache do Cloud Storage FUSE, o Cloud Run usa a configuração de cache de estatísticas com um Time to live (TTL) de 60 segundos por padrão. O tamanho máximo padrão do cache de estatísticas é 32 MB, e o tamanho máximo padrão do cache de tipo é 4 MB.

  • Durante a leitura, o Cloud Storage FUSE também consome memórias diferentes de caches de estatística e tipo, por exemplo, uma matriz de 1 MiB para cada arquivo que está sendo lido e para goroutines.

  • Ao gravar no Cloud Storage, o arquivo inteiro é preparado na memória do Cloud Run antes de ser gravado no Cloud Storage.

Limitações

Como o Cloud Run usa o Cloud Storage FUSE para essa montagem de volume, há algumas coisas a serem lembradas ao montar um bucket do Cloud Storage como um volume:

  • O Cloud Storage FUSE não oferece controle de simultaneidade para várias gravações (bloqueio de arquivo) no mesmo arquivo. Quando várias gravações tentam substituir um arquivo, a última é bem-sucedida e todas as anteriores são perdidas.
  • O Cloud Storage FUSE não é um sistema de arquivos totalmente compatível com POSIX. Para mais detalhes, consulte a documentação do Cloud Storage FUSE.

Caminhos não permitidos

O Cloud Run não permite montar um volume em /dev, /proc e /sys ou nos subdiretórios deles.

Antes de começar

Você precisa de um bucket do Cloud Storage para montar como o volume.

Para ter o melhor desempenho de leitura/gravação no Cloud Storage, consulte Como otimizar o desempenho da largura de banda de rede do Cloud Storage FUSE.

Funções exigidas

Para receber as permissões necessárias para configurar as montagens de volume do Cloud Storage, peça ao administrador para conceder a você os seguintes papéis do IAM:

Para receber as permissões de que a identidade de serviço precisa para acessar o arquivo e o bucket do Cloud Storage, peça ao administrador para conceder à identidade de serviço o seguinte papel do IAM:

Para mais detalhes sobre papéis e permissões do Cloud Storage, consulte IAM para o Cloud Storage.

Para uma lista de papéis e permissões do IAM associados ao Cloud Run, consulte Papéis do IAM do Cloud Run e Permissões do IAM do Cloud Run. Se o serviço do Cloud Run interage com as APIs do Google Cloud, como as bibliotecas de cliente do Cloud, consulte o guia de configuração de identidade de serviço. Para mais informações sobre como conceder papéis, consulte permissões de implantação e gerenciar acesso.

Montar um volume do Cloud Storage

É possível montar vários buckets em diferentes caminhos de montagem. Também é possível montar um volume em mais de um contêiner usando caminhos de montagem iguais ou diferentes nos contêineres.

Ao usar vários contêineres, primeiro especifique os volumes e, depois, as montagens de volume de cada contêiner.

As montagens de volumes exigem o ambiente de execução de segunda geração. O Cloud Run selecionará automaticamente o ambiente de execução de segunda geração para seu serviço se nenhum ambiente de execução for explicitamente configurado.

Console

  1. No console do Google Cloud, acesse o Cloud Run:

    Acessar o Cloud Run

  2. Clique em Implantar contêiner e selecione Serviço para configurar um novo serviço. Se você estiver configurando um serviço atual, clique nele e em Editar e implantar nova revisão.

  3. Ao configurar um novo serviço, preencha a página inicial de configurações de serviço e clique em Contêineres, volumes, redes e segurança para expandir essa página.

  4. Clique na guia Volumes.

    imagem

      • Clique em Adicionar volume.
      • No menu suspenso Tipo de volume, selecione o bucket do Cloud Storage como o tipo.
      • No campo Nome do volume, digite o nome que você quer usar para o volume.
      • Procure e selecione o bucket do Cloud Storage a ser usado para o volume ou, se quiser, crie um novo bucket.
      • Se você quiser tornar o bucket somente leitura, marque a caixa de seleção "Somente leitura".
      • Clique em Concluído.
      Clique na guia Contêiner:
      • Clique na guia Montagens de volumes.
      • Clique em Montar volume.
      • Selecione o volume de armazenamento no menu.
      • Especifique o caminho em que você quer montar o volume.
      • Clique em Concluir.
  5. Clique em Criar ou Implantar.

gcloud

  • Para adicionar um volume e montá-lo:

    gcloud run services update SERVICE \
    --add-volume name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME \
    --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH

    Substitua:

    • SERVICE pelo nome do serviço;
    • MOUNT_PATH pelo caminho relativo em que você está montando o volume, por exemplo, /mnt/my-volume.
    • VOLUME_NAME pelo nome que você quiser para o volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem associada.
    • BUCKET_NAME pelo nome do bucket do Cloud Storage.
  • Para montar o volume como somente leitura:

    --add-volume=name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME,readonly=true
  • Se você estiver usando vários contêineres, primeiro especifique os volumes e, em seguida, as ativações de volume para cada contêiner:

    gcloud run services update SERVICE \
    --add-volume name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME \
    --container CONTAINER_1 \
    --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH \
    --container CONTAINER_2 \
    --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH2

YAML

  1. Se você estiver criando um novo serviço, pule esta etapa. Se você estiver atualizando um serviço, faça o download da configuração YAML correspondente:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Faça as atualizações necessárias.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/execution-environment: gen2
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - name: VOLUME_NAME
              mountPath: MOUNT_PATH
          volumes:
          - name: VOLUME_NAME
            csi:
              driver: gcsfuse.run.googleapis.com
              readOnly: IS_READ_ONLY
              volumeAttributes:
                bucketName: BUCKET_NAME

    Substituir

    • IMAGE_URL por uma referência à imagem de contêiner. Por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Se você usa o Artifact Registry, o repositório REPO_NAME já precisará ter sido criado. O URL tem o formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • MOUNT_PATH pelo caminho relativo em que você está montando o volume, por exemplo, /mnt/my-volume.
    • VOLUME_NAME pelo nome que você quiser para o volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem associada.
    • IS_READ_ONLY com True para tornar o volume somente leitura ou False para permitir gravações.
    • BUCKET_NAME pelo nome do bucket do Cloud Storage.
  3. Crie ou atualize o serviço usando o seguinte comando:

    gcloud run services replace service.yaml

Como ler e gravar em um volume

Se você usar o recurso de montagem de volume do Cloud Run, poderá acessar um volume usando as mesmas bibliotecas na linguagem de programação que você usa para ler e gravar arquivos no sistema de arquivos local.

Isso é especialmente útil se você estiver usando um contêiner existente em que espera os dados sejam armazenados no sistema de arquivos local e usa o sistema de arquivos para acessá-lo.

Os snippets a seguir pressupõem uma montagem de volume com mountPath definido como /mnt/my-volume.

Nodejs

Use o módulo Sistemas de arquivos para criar um novo arquivo ou adicionar ao final de um arquivo existente no volume, /mnt/my-volume:

var fs = require('fs');
fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });

Python

Grave em um arquivo no volume, /mnt/my-volume:

f = open("/mnt/my-volume/sample-logfile.txt", "a")

Go

Use o pacote os para criar um novo arquivo mantido no volume, /mnt/my-volume

f, err := os.Create("/mnt/my-volume/sample-logfile.txt")

Java

Use a classe Java.io.File para criar um arquivo de registro no volume, /mnt/my-volume:

import java.io.File;
File f = new File("/mnt/my-volume/sample-logfile.txt");

Ver configurações de montagens de volumes

Para ver as configurações atuais de montagem de volumes no serviço do Cloud Run:

Console

  1. No console do Google Cloud, acesse o Cloud Run:

    Acessar o Cloud Run

  2. Clique no serviço de seu interesse para abrir a página Detalhes do serviço.

  3. Clique na guia Revisões.

  4. No painel de detalhes à direita, a configuração de montagem de volumes está listada na guia Volumes.

gcloud

  1. Use o comando a seguir:

    gcloud run services describe SERVICE
  2. Localize a configuração de montagens de volume na configuração retornada.

Como otimizar o desempenho da largura de banda da rede do Cloud Storage FUSE

Para melhorar a performance de leitura e gravação, conecte seu serviço do Cloud Run a uma rede VPC usando a VPC direta e roteando todo o tráfego de saída pela rede VPC. Faça isso usando uma das opções a seguir:

Tempo de inicialização do contêiner e montagens do Cloud Storage FUSE

Usar o Cloud Storage FUSE pode aumentar um pouco o tempo de inicialização a frio do contêiner do Cloud Run porque a montagem do volume é iniciada antes de iniciar o(s) contêiner(es). Seu contêiner só será iniciado se o Cloud Storage FUSE for montado corretamente.

Observe que o Cloud Storage FUSE monta com sucesso um volume somente após estabelecer uma conexão com o Cloud Storage. Qualquer atraso na rede pode afetar o tempo de inicialização do contêiner. Da mesma forma, se a tentativa de conexão falhar, o Cloud Storage FUSE não será montado e o serviço do Cloud Run não será iniciado. Além disso, se o Cloud Storage FUSE levar mais de 30 segundos para ser montado, o serviço do Cloud Run não vai ser iniciado porque o Cloud Run tem um tempo limite total de 30 segundos para realizar todas as montagens.

Características de desempenho do Cloud Storage FUSE

Se você definir dois volumes, cada um apontando para um bucket diferente, dois processos do Cloud Storage FUSE serão iniciados. As montagens e os processos ocorrem em paralelo.

As operações que usam o Cloud Storage FUSE são afetadas pela largura de banda da rede porque o Cloud Storage FUSE se comunica com o Cloud Storage usando a API Cloud Storage. Algumas operações, como listar o conteúdo de um bucket, podem ficar lentas se a largura de banda da rede estiver baixa. Da mesma forma, a leitura de um arquivo grande pode levar tempo, já que também é limitada pela largura de banda da rede.

Quando você grava em um bucket, o Cloud Storage FUSE organiza totalmente o objeto na memória. Isso significa que a gravação de arquivos grandes é limitada pela quantidade de memória disponível para a instância do contêiner (o limite máximo de memória do contêiner é de 32 GiB).

A gravação é transferida para o bucket somente quando você executa um close ou um fsync: o objeto completo é enviado/reenviado ao bucket. A única exceção para um objeto que é totalmente reenviado para o bucket é no caso de um arquivo com conteúdo anexado quando o arquivo tem 2 MiB ou mais.

Para saber mais, acesse os recursos a seguir: