Configure montagens de volumes na memória para jobs

Nesta página, descrevemos como configurar um volume dedicado na memória que pode ser usado para leituras e gravações de arquivos com montagens de volumes do Cloud Run. Observe que esse recurso é diferente do sistema de arquivos na memória integrado fornecido pelo Cloud Run.

É possível usar volumes na memória para fazer o seguinte:

  • Limitar o tamanho do volume na memória. Quando você limita o tamanho de um volume, as gravações em um volume total falham. No entanto, isso é melhor do que o cenário em que o Cloud Run encerra as instâncias devido ao alto consumo de memória pelo volume.
  • Compartilhar um volume na memória entre diferentes contêineres em uma única instância do Cloud Run.

Comportamento

Ao criar um volume na memória, recomendamos especificar um limite de tamanho. Se o volume atingir esse limite, outras gravações vão falhar com um erro de falta de memória. A instância pode lidar com esse erro e continuar em execução.

O limite de tamanho é apenas um limite: ele não aloca espaço extra para o volume na memória. Em vez disso, o volume na memória consome a memória configurada para os contêineres. Se você implantar vários contêineres, a memória usada por cada gravação no volume contará como uso da memória do contêiner que gravou os dados.

Se você não especificar um limite de tamanho, ele será definido de modo automático como metade do tamanho total de todos os contêineres no job ou serviço. Por exemplo, o tamanho do volume emptyDir = [Memória (Contêiner A) + Memória (Contêiner B) + Memória (Contêiner N)]/2. Esse comportamento padrão pode fazer com que o limite de tamanho do volume na memória seja maior do que a memória alocada para alguns dos contêineres. Nesse caso, se o contêiner continua gravando memória no volume, a memória alocada é excedida e uma falha é gerada antes que o limite de tamanho do volume seja atingido.

Embora a definição de um limite de tamanho seja opcional, recomendamos realizá-la para proteger os contêineres contra a falta de memória e contra falhas.

A propriedade do volume varia por ambiente de execução e tipo de implantação

Quando você monta um volume, a identidade que detém os arquivos e os diretórios varia de acordo com o ambiente de execução da carga de trabalho e se a implantação consiste em um ou vários contêineres.

No ambiente de execução de primeira geração em que você está implantando um único contêiner, o volume pertence à identidade usada para o contêiner. Em todos os outros casos, o volume pertence à raiz. Incluindo:

  • Ambiente de execução de primeira geração em que você está implantando vários contêineres
  • O ambiente de segunda geração

Configurar um volume na memória

Qualquer mudança na configuração leva à criação de uma nova revisão. As próximas revisões também recebem essa configuração de modo automático, a menos que você faça atualizações explícitas para alterar esse comportamento.

Depois de configurar um volume na memória para o serviço do Cloud Run, um volume vazio é criado para cada instância do Cloud Run iniciada e continua existindo enquanto a instância estiver em execução. Quando a execução da instância é interrompida, os dados no volume são excluídos permanentemente.

Linha de comando

  • Para adicionar um volume e montá-lo:

    gcloud beta run jobs update JOB \
    --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \
    --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

    Substitua:

    • JOB pelo nome do job.
    • VOLUME_NAME pelo nome que você quiser para o volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem associada.
    • MOUNT_PATH pelo caminho relativo no sistema de arquivos do contêiner em que você quer montar esse volume, por exemplo, /cache.
    • SIZE_LIMIT pelo limite de memória que você quer atribuir ao volume, em MiB ou GiB (especificado como Mi ou Gi), por exemplo, 500Mi. Esse limite precisa ser menor que a memória total especificada para os contêineres.
  • Ao usar vários contêineres, primeiro especifique os volumes e, depois, as montagens de volume de cada contêiner:

    gcloud beta run jobs update JOB \
    --add-volume=name= VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \
    --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 existente, faça o download da configuração YAML correspondente:

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. Configure os atributos volumeMounts e volumes conforme mostrado abaixo:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    metadata:
     annotations:
      run.googleapis.com/launch-stage: BETA
    spec:
      template:
        metadata:
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: MOUNT_PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              sizeLimit: SIZE_LIMIT
              medium: Memory
    

    Substitua:

    • 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
    • VOLUME_NAME pelo nome que você quiser para o volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem associada.
    • MOUNT_PATH pelo caminho relativo no sistema de arquivos do contêiner em que você quer montar esse volume, por exemplo, /cache.
    • SIZE_LIMIT pelo limite de memória que você quer atribuir ao volume, em MiB ou GiB (especificado como Mi ou Gi), por exemplo, 500Mi. Esse limite precisa ser menor que a memória total especificada para os contêineres.
  3. Substitua o serviço pela nova configuração usando o seguinte comando:

    gcloud beta run jobs replace job.yaml