Nesta página, mostramos como montar um compartilhamento de arquivos NFS como um volume no Cloud Run. É possível usar qualquer servidor NFS, incluindo seu próprio servidor NFS hospedado no local ou em uma VM do Compute Engine. Se você ainda não tiver um servidor NFS, recomendamos o Filestore, que é uma oferta de NFS totalmente gerenciada do Cloud de Confiance by S3NS.
Montar o compartilhamento de arquivos NFS como um volume no Cloud Run apresenta o arquivo compartilhar como arquivos no sistema de arquivos do contêiner. Depois de montar o compartilhamento de arquivos como um volume, você o acessa como se fosse um diretório no sistema de arquivos local, usando as operações e bibliotecas do sistema de arquivos da sua linguagem de programação.
Limitações
- O Cloud Run não é compatível com bloqueio de NFS. Os volumes NFS são montados automaticamente no modo sem bloqueio.
- Caminhos não permitidos: o Cloud Run não permite montar um volume em
/dev,/procou/sys, ou nos subdiretórios deles.
Antes de começar
Para montar um servidor NFS como um volume no Cloud Run, verifique se você tem:
- Uma rede VPC em que o servidor NFS ou a instância do Filestore esteja em execução.
- Um servidor NFS em execução em uma rede VPC, com o job do Cloud Run conectado a essa rede VPC. Se você ainda não tiver um servidor NFS, crie um criando uma instância do Filestore.
- O job do Cloud Run está anexado à rede VPC em que o servidor NFS está em execução. Para ter o melhor desempenho, use a VPC direta em vez de conectores de VPC.
- Se você estiver usando um projeto atual, verifique se a configuração do firewall da VPC permite que o Cloud Run acesse seu servidor NFS. Se você está começando de um projeto novo, isso é verdade por padrão. Se você estiver usando o Filestore como servidor NFS, siga a documentação do Filestore para criar uma regra de saída de firewall e permitir que o Cloud Run alcance o Filestore.
- Defina as permissões no compartilhamento de arquivos NFS remoto para permitir o acesso ao usuário do contêiner. Por padrão, o Filestore oferece acesso de leitura a todos os usuários, mas restringe o acesso de gravação ao usuário raiz (
uid 0). Se o contêiner exigir acesso de gravação e não for executado como usuário raiz, use um cliente conectado (executado como raiz) para modificar as permissões de compartilhamento. Por exemplo, use o comandochownpara mudar a propriedade dos arquivos ou diretórios para o ID de usuário específico em que o contêiner é executado.
Funções exigidas
Para receber as permissões necessárias para configurar jobs do Cloud Run, peça ao administrador para conceder a você os seguintes papéis do IAM no job:
- Desenvolvedor do Cloud Run (
roles/run.developer): o job do Cloud Run - Usuário da conta de serviço (
roles/iam.serviceAccountUser): a identidade de serviço
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 job do Cloud Run interagir com APIs doCloud de Confiance , 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 NFS
É possível montar vários servidores NFS, instâncias do Filestore ou outros tipos de volumes em diferentes caminhos de montagem.
Ao usar vários contêineres, primeiro especifique o(s) volumes e, depois, a(s) montagem(ns) de volume de cada contêiner.
Console
No console Cloud de Confiance by S3NS , acesse a página do Cloud Run:
Selecione Jobs no menu de navegação do Cloud Run:
Se você estiver criando um job, clique em Implantar contêiner para preencher a página inicial de configurações do job.
Se você estiver configurando um job, selecione-o e clique em Ler e editar a configuração do job.
Clique em Contêineres, conexões, segurança para expandir a página de propriedades do job.
Clique na guia Volumes.
Clique em Montar volume.
Clique em NFS como o tipo de volume.
Configure o volume fazendo o seguinte:
- No campo Caminho de ativação, insira o caminho em que você quer ativar o volume.
- No campo Servidor NFS, digite o nome ou o local do domínio (no
formulário
IP_ADDRESS) do compartilhamento de arquivos NFS. - No campo Caminho, digite o caminho para o diretório do servidor NFS que você quer montar.
- Clique em Salvar.
Clique em Criar ou Atualizar.
gcloud
Para adicionar uma montagem de volume:
gcloud run jobs update JOB \ --add-volume mount-path=MOUNT_PATH,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=READ_ONLY
Substitua:
- JOB: o nome do job.
- MOUNT_PATH: o caminho no sistema de arquivos do contêiner em que você quer ativar esse volume.
- IP_ADDRESS: o local do compartilhamento de arquivos NFS.
- NFS_PATH: o caminho para o compartilhamento de arquivos NFS.
- READ_ONLY:
truepara tornar o volume somente leitura oufalsepara permitir gravações.
Ao usar vários contêineres, primeiro especifique os volumes e, depois, as montagens de volume de cada contêiner:
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 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
Atualize MOUNT_PATH, VOLUME_NAME, IP_ADDRESS e NFS_PATH conforme necessário. Se você tiver várias montagens de volume, terá vários desses 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
Substitua:
- JOB: o nome do seu job do Cloud Run
- MOUNT_PATH: o caminho relativo em que você está montando o volume, por exemplo,
/mnt/my-volume. - VOLUME_NAME: qualquer nome que você queira dar ao volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem associada.
- IP_ADDRESS: o endereço do compartilhamento de arquivos NFS.
- NFS_PATH: o caminho para o compartilhamento de arquivos NFS.
- IS_READ_ONLY:
Truepara tornar o volume somente leitura ouFalsepara permitir gravações.
Crie ou atualize o serviço usando o seguinte comando:
gcloud run jobs replace job.yaml
Por padrão, o comando
gcloud run jobs replaceusa o arquivojob.yaml, se ele estiver presente.
Terraform
Para saber como aplicar ou remover uma configuração do Terraform, consulte Comandos básicos do Terraform.
Adicione o seguinte a um recursogoogle_cloud_run_v2_job
na 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"]
}
}
Substitua:
- JOB_NAME: o nome do seu job do Cloud Run;
- REGION com a região Cloud de Confiance . Por exemplo,
europe-west1. - MOUNT_PATH: o caminho relativo em que você está montando o
volume, por exemplo,
/mnt/nfs/filestore. - VOLUME_NAME: qualquer nome que você queira dar ao volume. O valor VOLUME_NAME é usado para mapear o volume para a montagem associada.
- NFS_PATH: o caminho para o compartilhamento de arquivos NFS que começa com uma
barra, por exemplo,
/share1. - IS_READ_ONLY:
Truepara tornar o volume somente leitura ouFalsepara permitir gravações.
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 "Sistema de arquivos" para criar um novo arquivo ou adicionar ao final de um arquivo
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");Solução de problemas de NFS
Se você tiver problemas, verifique se:
- O serviço do Cloud Run está conectado à rede VPC em que o servidor NFS está.
- Não há regras de firewall impedindo o Cloud Run de alcançar o servidor NFS.
- Se o contêiner precisar gravar dados, verifique se as permissões de compartilhamento do NFS estão configuradas para permitir gravações do usuário do contêiner.
Tempo de inicialização do contêiner e montagens de volumes NFS
O uso de montagens de volume NFS pode aumentar um pouco o tempo de inicialização a frio do contêiner do Cloud Run, porque a montagem de volume é iniciada antes dos contêineres. O contêiner só será iniciado se o NFS for montado.
O NFS só monta um volume após estabelecer uma conexão com o servidor e buscar um identificador de arquivo. Se o Cloud Run não conseguir estabelecer uma conexão com o servidor, o job do Cloud Run não será iniciado.
Além disso, qualquer atraso na rede pode afetar o tempo de inicialização do contêiner, já que o Cloud Run tem um tempo limite total de 30 segundos para todas as montagens. Se o NFS levar mais de 30 segundos para ser montado, o job do Cloud Run não será iniciado.
Características de desempenho do NFS
Se você criar mais de um volume NFS, todos os volumes serão montados em paralelo.
Como o NFS é um sistema de arquivos de rede, ele está sujeito a limites de largura de banda e o acesso ao sistema de arquivos pode ser afetado pela largura de banda limitada.
Quando você grava no volume NFS, a gravação é armazenada no Cloud Run na memória até que os dados sejam apagados. Os dados são apagados nas seguintes circunstâncias:
- O aplicativo limpa os dados do arquivo explicitamente usando sync(2), msync(2) ou fsync(3).
- O aplicativo fecha um arquivo 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 NFS.
Limpar e remover volumes e montagens de volume
É possível limpar todos os volumes e as ativações ou remover volumes e ativações individuais.
Limpar todos os volumes e as ativações de volumes
Para limpar todos os volumes e as montagens de volume do seu job de contêiner único, execute o seguinte comando:
gcloud run jobs update JOB \ --clear-volumes \ --clear-volume-mounts
gcloud run jobs update JOB \ --clear-volumes \ --clear-volume-mounts \ --container=container1 \ --clear-volumes \ --clear-volume-mounts \ --container=container2 \ --clear-volumes \ --clear-volume-mounts
Remover volumes e montagens de volume individuais
Para remover um volume, também é preciso remover todas as montagens de volume que o usam.
Para remover volumes ou ativações de volume individuais, use as 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