Esta página mostra como montar uma partilha de ficheiros NFS como um volume no Cloud Run. Pode usar qualquer servidor NFS, incluindo o seu próprio servidor NFS alojado no local ou numa VM do Compute Engine. Se ainda não tiver um servidor NFS, recomendamos o Filestore, que é uma oferta NFS totalmente gerida da Google Cloud.
A montagem da partilha de ficheiros NFS como um volume no Cloud Run apresenta a partilha de ficheiros como ficheiros no sistema de ficheiros do contentor. Depois de montar a partilha de ficheiros como um volume, acede à mesma como se fosse um diretório no seu sistema de ficheiros local, usando as operações e as bibliotecas do sistema de ficheiros da sua linguagem de programação.
Caminhos não permitidos
O Cloud Run não lhe permite montar um volume em /dev
,
/proc
ou /sys
, nem nos respetivos subdiretórios.
Limitações
Para escrever num volume NFS, o seu contentor tem de ser executado como raiz. Se o seu contentor apenas ler a partir do sistema de ficheiros, pode ser executado como qualquer utilizador.
O Cloud Run não suporta o bloqueio de NFS. Os volumes NFS são montados automaticamente no modo sem bloqueio.
Antes de começar
Para montar um servidor NFS como um volume no Cloud Run, certifique-se de que tem o seguinte:
- Uma rede VPC onde o servidor NFS ou a instância do Filestore está em execução.
- Um servidor NFS em execução numa rede VPC, com a sua tarefa do Cloud Run ligada a essa rede VPC. Se ainda não tiver um servidor NFS, crie um criando uma instância do Filestore.
- A tarefa do Cloud Run está anexada à rede VPC onde o servidor NFS está a ser executado. Para um melhor desempenho, use a VPC direta em vez dos conectores de VPC.
- Se estiver a usar um projeto existente, certifique-se de que a configuração da firewall da VPC permite que o Cloud Run alcance o seu servidor NFS. (Se estiver a começar com um novo projeto, esta opção está selecionada por predefinição.) Se estiver a usar o Filestore como servidor NFS, siga a documentação do Filestore para criar uma regra de saída da firewall para permitir que o Cloud Run alcance o Filestore.
Funções necessárias
Para receber as autorizações necessárias para configurar tarefas do Cloud Run, peça ao administrador para lhe conceder as seguintes funções de IAM na tarefa:
-
Programador do Cloud Run (
roles/run.developer
) – a tarefa do Cloud Run -
Utilizador da conta de serviço (
roles/iam.serviceAccountUser
): a identidade do serviço
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 a sua tarefa do Cloud Run interagir com Google Cloud APIs, como as bibliotecas de 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.
Monte um volume NFS
Pode montar vários servidores NFS, instâncias do Filestore ou outros tipos de volumes em diferentes caminhos de montagem.
Se estiver a usar vários contentores, especifique primeiro os volumes e, em seguida, especifique as montagens de volumes para cada contentor.
Consola
Na Google Cloud consola, aceda à página Tarefas do Cloud Run:
Selecione Tarefas no menu e clique em Implementar contentor para preencher a página de definições iniciais da tarefa. Se estiver a configurar uma tarefa existente, selecione a tarefa e, de seguida, clique em Editar.
Clique em Recipientes, volumes, ligações, segurança para expandir a página de propriedades da tarefa.
Clique no separador Volumes.
- Em Volumes:
- Clique em Adicionar volume.
- No menu pendente Tipo de volume, selecione NFS como o tipo de volume.
- No campo Nome do volume, introduza o nome que quer usar para o volume.
- No campo Servidor NFS, introduza o nome do domínio ou a localização (no formato
IP_ADDRESS
) da partilha de ficheiros NFS. - No campo Caminho, introduza o caminho para o diretório do servidor NFS que quer montar.
- Clique em Concluído.
- Clique no separador Contentor e, de seguida, expanda o contentor no qual está a montar o volume para editar o contentor.
- Clique no separador Montagens de volumes.
- Clique em Montar volume.
- Selecione o volume NFS no menu.
- Especifique o caminho onde quer montar o volume.
- Clique em Montar volume
- Em Volumes:
Clique em Criar ou Atualizar.
gcloud
Para adicionar um volume e montá-lo:
gcloud run jobs update JOB \ --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH
Substituir:
- JOB com o nome do seu trabalho.
- VOLUME_NAME com o nome que quer dar ao volume.
- IP_ADDRESS com a localização da partilha de ficheiros NFS.
- NFS_PATH com o caminho para a partilha de ficheiros NFS.
- MOUNT_PATH com o caminho no sistema de ficheiros do contentor onde quer montar este volume.
Para montar o volume como um volume só de leitura:
--add-volume name VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=true
Se estiver a usar vários contentores, especifique primeiro os volumes e, em seguida, especifique as montagens de volumes para cada contentor:
gcloud run jobs update JOB \ --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \ --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 uma nova tarefa, ignore este passo. Se estiver a atualizar uma tarefa existente, transfira a respetiva configuração YAML:
gcloud run jobs describe JOB_NAME --format export > job.yaml
Atualize o MOUNT_PATH, VOLUME_NAME, IP_ADDRESS e NFS_PATH conforme necessário. Se tiver vários volumes montados, terá vários destes atributos.
apiVersion: run.googleapis.com/v1 kind: Job metadata: name: JOB_NAME spec: metadata: template: metadata: annotations: run.googleapis.com/execution-environment: gen2 spec: template: spec: containers: - image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME nfs: server: IP_ADDRESS path: NFS_PATH readonly: IS_READ_ONLY
Substituir
- JOB com o nome da sua tarefa do Cloud Run
- MOUNT_PATH com o caminho relativo onde está a montar o volume, por exemplo,
/mnt/my-volume
. - VOLUME_NAME com qualquer nome que quiser para o volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem do volume.
- IP_ADDRESS com a morada da partilha de ficheiros NFS.
- NFS_PATH com o caminho para a partilha de ficheiros NFS.
- IS_READ_ONLY com
True
para tornar o volume só de leitura ouFalse
para permitir escritas.
Crie ou atualize a tarefa através do seguinte comando:
gcloud run jobs replace job.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_job
na sua configuração do Terraform:resource "google_cloud_run_v2_job" "default" {
name = "JOB_NAME"
location = "REGION"
template {
template {
containers {
image = "us-docker.pkg.dev/cloudrun/container/hello"
volume_mounts {
name = "VOLUME_NAME"
mount_path = "MOUNT_PATH"
}
}
vpc_access {
network_interfaces {
network = "default"
subnetwork = "default"
}
}
volumes {
name = "VOLUME_NAME"
nfs {
server = google_filestore_instance.default.networks[0].ip_addresses[0]
path = "NFS_PATH"
read_only = IS_READ_ONLY
}
}
}
}
}
resource "google_filestore_instance" "default" {
name = "cloudrun-job"
location = "REGION"
tier = "BASIC_HDD"
file_shares {
capacity_gb = 1024
name = "share1"
}
networks {
network = "default"
modes = ["MODE_IPV4"]
}
}
Substituir:
- JOB_NAME com o nome da tarefa do Cloud Run.
- REGION com a região Google Cloud . Por exemplo,
europe-west1
. - MOUNT_PATH com o caminho relativo onde está a montar o volume, por exemplo,
/mnt/nfs/filestore
. - VOLUME_NAME com qualquer nome que quiser para o volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem do volume.
- NFS_PATH com o caminho para a partilha de ficheiros NFS a começar com uma barra
invertida, por exemplo,
/share1
. - IS_READ_ONLY com
True
para tornar o volume só de leitura ouFalse
para permitir escritas.
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");
Resolução de problemas de NFS
Se tiver problemas, verifique o seguinte:
- O seu serviço Cloud Run está ligado à rede VPC em que o servidor NFS se encontra.
- Não existem regras de firewall que impeçam o Cloud Run de alcançar o servidor NFS.
- Se o seu contentor escrever no seu servidor NFS, certifique-se de que está a ser executado como raiz.
Tempo de arranque do contentor e montagens de volume NFS
A utilização de montagens de volumes NFS pode aumentar ligeiramente o tempo de arranque a frio do contentor do Cloud Run, porque a montagem de volumes é iniciada antes do início dos contentores. O contentor só é iniciado se o NFS for montado com êxito.
Tenha em atenção que o NFS monta com êxito um volume apenas depois de estabelecer uma ligação ao servidor e obter um identificador de ficheiro. Se o Cloud Run não conseguir estabelecer uma ligação ao servidor, a tarefa do Cloud Run não é iniciada.
Além disso, quaisquer atrasos na rede podem ter um impacto no tempo de arranque do contentor, uma vez que o Cloud Run tem um limite de tempo total de 30 segundos para todas as montagens. Se o NFS demorar mais de 30 segundos a ser montado, a tarefa do Cloud Run não é iniciada.
Caraterísticas de desempenho do NFS
Se criar mais do que um volume NFS, todos os volumes são montados em paralelo.
Uma vez que o NFS é um sistema de ficheiros de rede, está sujeito a limites de largura de banda e o acesso ao sistema de ficheiros pode ser afetado pela largura de banda limitada.
Quando escreve no seu volume NFS, a escrita é armazenada na memória do Cloud Run até que os dados sejam descarregados. Os dados são descarregados nas seguintes circunstâncias:
- A sua aplicação esvazia os dados dos ficheiros explicitamente através de sync(2), msync(2) ou fsync(3).
- A sua aplicação fecha um ficheiro com close(2).
- A pressão da memória força a recuperação de recursos de memória do sistema.
Para mais informações, consulte a documentação do Linux sobre o NFS.
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 da sua tarefa de contentor único, execute o seguinte comando:
gcloud run jobs update JOB \ --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 jobs update JOB \ --clear-volumes \ --clear-volume-mounts \ --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 jobs update JOB \ --remove-volume VOLUME_NAME --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH