Esta página descreve como configurar um volume dedicado na memória que pode usar para leituras e escritas de ficheiros através de montagens de volumes do Cloud Run. Tenha em atenção que esta funcionalidade difere do sistema de ficheiros na memória integrado fornecido pelo Cloud Run.
Quando monta o volume na memória no Cloud Run, o volume na memória é apresentado como ficheiros no sistema de ficheiros do contentor. Depois de montar o volume na memória, acede ao mesmo como se fosse um diretório no sistema de ficheiros local, usando as operações e as bibliotecas do sistema de ficheiros da sua linguagem de programação.
Pode usar volumes na memória para fazer o seguinte:
- Limitar o tamanho do volume na memória. Quando limita o tamanho de um volume, as escritas num volume cheio falham, o que é preferível a ter instâncias do Cloud Run terminadas porque o volume está a consumir demasiada memória.
- Partilhe um volume na memória entre diferentes contentores numa instância do Cloud Run. Quando o Cloud Run é dimensionado horizontalmente para várias instâncias de um serviço, cada instância tem o seu próprio volume na memória partilhado por todos os contentores nessa instância. Este volume está disponível para todos os contentores quando o Cloud Run é dimensionado para processar o tráfego.
Comportamento
Ao criar um volume na memória, recomendamos que especifique um limite de tamanho. Se o volume atingir o limite de tamanho, as gravações adicionais falham com um erro de falta de memória. A sua instância pode processar este erro e continuar a ser executada.
Tenha em atenção que o limite de tamanho é apenas um limite: não atribui espaço adicional ao seu volume na memória. Em vez disso, o volume na memória consome a memória que configurou para os seus contentores. Se implementar vários contentores, a memória usada por cada gravação no volume conta como utilização de memória para o contentor que escreveu os dados.
Se não especificar um limite de tamanho, este é definido automaticamente para metade do tamanho total de todos os contentores no seu trabalho ou serviço. Por exemplo,
emptyDir
tamanho do volume = [Memória (recipiente A) + Memória (recipiente B) + Memória (recipiente N)]/2.
Este comportamento predefinido pode resultar num limite de tamanho do volume na memória superior à memória alocada para alguns dos seus contentores. Isto pode levar a falhas inesperadas se um único contentor exceder a respetiva memória alocada ao tentar escrever mais dados no volume, mesmo que o limite de tamanho do volume não tenha sido atingido.
Embora a definição de um limite de tamanho seja opcional, recomendamos que defina um para proteger os seus contentores de ficarem sem memória e falharem.
Caminhos não permitidos
O Cloud Run não permite montar um volume em /dev
,
/proc
e /sys
, nem nos respetivos subdiretórios.
Funções necessárias
Para receber as autorizações de que precisa para configurar e implementar serviços do Cloud Run, peça ao seu administrador para lhe conceder as seguintes funções de IAM:
-
Programador do Cloud Run (
roles/run.developer
) no serviço Cloud Run -
Utilizador da conta de serviço (
roles/iam.serviceAccountUser
) na identidade do serviço
Se estiver a implementar um serviço ou uma função a partir do código fonte, também tem de ter funções adicionais concedidas no seu projeto e na conta de serviço do Cloud Build.
Para ver uma lista de funções e autorizações de IAM associadas ao Cloud Run, consulte os artigos Funções de IAM do Cloud Run e Autorizações de IAM do Cloud Run. Se o seu serviço do Cloud Run interage com Google Cloud APIs, como as bibliotecas cliente da Google Cloud, consulte o guia de configuração da identidade do serviço. Para mais informações sobre a atribuição de funções, consulte as autorizações de implementação e faça a gestão do acesso.
Configure um volume na memória
Qualquer alteração de configuração leva à criação de uma nova revisão. As revisões subsequentes também vão receber automaticamente esta definição de configuração, a menos que faça atualizações explícitas para a alterar.
Depois de configurar um volume na memória para o seu serviço do Cloud Run, é criado um volume vazio para cada instância do Cloud Run iniciada e o volume existe enquanto essa instância estiver em execução. Quando a instância deixa de ser executada, os dados no volume são eliminados permanentemente.
Consola
Na Google Cloud consola, aceda ao Cloud Run:
Selecione Serviços no menu e clique em Implementar contentor para configurar um novo serviço. Se estiver a configurar um serviço existente, clique no serviço e, de seguida, em Editar e implementar nova revisão.
Se estiver a configurar um novo serviço, preencha a página de definições iniciais do serviço e, de seguida, clique em Contentores, volumes, rede, segurança para expandir a página de configuração do serviço.
Clique no separador Volumes.
- Em Volumes:
- Clique em Adicionar volume.
- No menu pendente Tipo de volume, selecione Na memória como tipo de volume.
- No campo Nome do volume, introduza o nome que quer usar para o volume.
- Clique em Concluído.
- Clique no separador Recipiente.
- Clique no separador Montagens de volumes.
- Clique em Montar volume.
- Selecione o volume na memória no menu.
- Especifique o caminho onde quer montar o volume.
- Clique em Montar volume
- Em Volumes:
Clique em Criar ou Implementar.
gcloud
Para adicionar um volume e montá-lo:
gcloud run services update SERVICE \ --add-volume=name=VOLUME_NAME,type=in-memory,size-limit=SIZE_LIMIT \ --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH
Substitua o seguinte:
SERVICE
: o nome do seu serviço.- VOLUME_NAME: qualquer nome que pretender para o seu volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem do volume.
MOUNT_PATH
: o caminho relativo no sistema de ficheiros do contentor onde quer montar este volume, por exemplo,/mnt/my-volume
.- SIZE_LIMIT: o limite de memória que quer atribuir ao volume, em
MiB ou GiB (especificado como Mi ou Gi), por exemplo,
500Mi
. Este limite tem de ser inferior à memória total especificada para os seus contentores.
Se estiver a usar vários contentores, especifique primeiro os volumes e, em seguida, especifique as montagens de volumes para cada contentor:
gcloud run services update SERVICE \ --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
Se estiver a criar um novo serviço, ignore este passo. Se estiver a atualizar um serviço existente, transfira a respetiva configuração YAML:
gcloud run services describe SERVICE --format export > service.yaml
Configure os atributos
volumeMounts
evolumes
, conforme mostrado:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE_NAME spec: template: spec: containers: - image: IMAGE_URL volumeMounts: - mountPath: MOUNT_PATH name: VOLUME_NAME volumes: - name: VOLUME_NAME emptyDir: sizeLimit: SIZE_LIMIT medium: Memory
Substitua o seguinte:
- IMAGE_URL: uma referência à imagem do contentor, por exemplo,
us-docker.pkg.dev/cloudrun/container/hello:latest
. Se usar o Artifact Registry, o repositório REPO_NAMEtem de já estar criado. O URL segue o formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. - VOLUME_NAME: qualquer nome que pretender para o seu volume. O valor VOLUME_NAME é usado para mapear o volume para o volume mount.
MOUNT_PATH
: o caminho relativo no sistema de ficheiros do contentor onde quer montar este volume, por exemplo,/mnt/my-volume
.- SIZE_LIMIT: o limite de memória que quer atribuir ao volume, em
MiB ou GiB (especificado como Mi ou Gi), por exemplo,
500Mi
. Este limite tem de ser inferior à memória total especificada para os seus contentores.
- IMAGE_URL: uma referência à imagem do contentor, por exemplo,
Crie ou atualize o serviço com o seguinte comando:
gcloud run services replace service.yaml
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte os comandos básicos do Terraform.
Adicione o seguinte a um recursogoogle_cloud_run_v2_service
na sua configuração do Terraform:resource "google_cloud_run_v2_service" "default" {
name = "SERVICE_NAME"
location = "REGION"
template {
containers {
image = "IMAGE_URL"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
volumes {
name = "VOLUME_NAME"
empty_dir {
medium = "MEMORY"
size_limit = "SIZE_LIMIT"
}
}
}
}
Substitua o seguinte:
- SERVICE_NAME: o nome do seu serviço do Cloud Run.
- REGION: a Google Cloud região. Por exemplo,
europe-west1
. - IMAGE_URL: uma referência à imagem do contentor, por exemplo,
us-docker.pkg.dev/cloudrun/container/hello:latest
. Se usar o Artifact Registry, o repositório REPO_NAMEtem de já estar criado. O URL segue o formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. - VOLUME_NAME: qualquer nome que pretender para o seu volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem do volume.
- MOUNT_PATH: o caminho relativo no sistema de ficheiros do contentor onde quer montar este volume, por exemplo,
/mnt/my-volume
. - SIZE_LIMIT: o limite de memória que quer atribuir ao volume, em MiB ou GiB (especificado como Mi ou Gi), por exemplo,
500Mi
. Este limite tem de ser inferior à memória total especificada para os seus contentores.
Ler e escrever num volume
Se usar a funcionalidade de montagem de volumes do Cloud Run, acede a um volume montado através das mesmas bibliotecas no seu idioma de programação que usa para ler e escrever ficheiros no seu sistema de ficheiros local.
Isto é especialmente útil se estiver a usar um contentor existente que espera que os dados sejam armazenados no sistema de ficheiros local e usa operações regulares do sistema de ficheiros para aceder aos mesmos.
Os seguintes fragmentos pressupõem uma montagem de volume com um mountPath
definido como /mnt/my-volume
.
Nodejs
Use o módulo do sistema de ficheiros para criar um novo ficheiro ou anexar a um ficheiro existente no volume, /mnt/my-volume
:
var fs = require('fs'); fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });
Python
Escrever num ficheiro mantido no volume /mnt/my-volume
:
f = open("/mnt/my-volume/sample-logfile.txt", "a")
Ir
Use o pacote os
para criar um novo ficheiro 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 ficheiro de registo no volume /mnt/my-volume
:
import java.io.File; File f = new File("/mnt/my-volume/sample-logfile.txt");
Limpe e remova volumes e montagens de volumes
Pode limpar todos os volumes e montagens ou remover volumes individuais e montagens de volumes.
Limpe todos os volumes e montagens de volumes
Para limpar todos os volumes e montagens de volumes do seu serviço de contentor único, execute o seguinte comando:
gcloud run services update SERVICE \ --clear-volumes --clear-volume-mounts
Se tiver vários contentores, siga as convenções da CLI de sidecars para limpar volumes e montagens de volumes:
gcloud run services update SERVICE \ --container=container1 \ --clear-volumes -–clear-volume-mounts \ --container=container2 \ --clear-volumes \ -–clear-volume-mounts
Remova volumes individuais e montagens de volumes
Para remover um volume, também tem de remover todas as montagens de volumes que usam esse volume.
Para remover volumes individuais ou montagens de volumes, use os flags remove-volume
e remove-volume-mount
:
gcloud run services update SERVICE \ --remove-volume VOLUME_NAME \ --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH