Configurar montagens de volumes NFS para serviços

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 Google Cloud.

Se você quiser usar os sistemas de arquivos de rede NBd, 9P, CIFS/Samba e Ceph, consulte Como usar sistemas de arquivos de rede NBD, 9P, CIFS/Samba e Ceph.

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 arquivo compartilhar como um volume, você o acessa como se fosse um diretório no arquivo local usando as operações e bibliotecas do sistema de arquivos da sua linguagem de programação.

Caminhos não permitidos

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

Limitações

  • Para gravar em um volume NFS, o contêiner precisa ser executado como raiz. Se o contêiner só fizer leituras no sistema de arquivos, ele poderá ser executado como qualquer usuário.

  • O Cloud Run não é compatível com 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, 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 serviço 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 serviço 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.

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

  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

    • Em Volumes:
      • Clique em Adicionar volume.
      • No menu suspenso Tipo de volume, selecione NFS como o tipo de volume.
      • No campo Nome do volume, digite o nome que você quer usar para 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 Concluído.
    • Clique na guia "Contêiner" e abra o contêiner para que você está montando o volume para editar o contêiner.
    • Clique na guia Montagens de volumes.
    • Clique em Montar volume.
      • Selecione o volume NFS de armazenamento no menu.
      • Especifique o caminho em que você quer montar o volume.
      • Clique em Montar volume.
  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=nfs,location=IP_ADDRESS:NFS_PATH \
    --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

    Substitua:

    • SERVICE pelo nome do serviço;
    • VOLUME_NAME pelo nome que você quer dar ao volume.
    • IP_ADDRESS pelo local do compartilhamento de arquivos NFS.
    • NFS_PATH pelo caminho para o compartilhamento de arquivos NFS que começa com uma barra, por exemplo /example-directory.
    • 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.
  • Para montar o volume como somente leitura:

    --add-volume=name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=true
  • Ao usar vários contêineres, primeiro especifique os volumes e, depois, as montagens de volume de cada contêiner:

    gcloud run services update SERVICE \
    --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

  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. 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: 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
            nfs:
              server: IP_ADDRESS
              path: NFS_PATH
              readOnly: IS_READ_ONLY

    Substituir

    • SERVICE pelo nome do serviço do Cloud Run;
    • 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.
    • IP_ADDRESS pelo endereço do compartilhamento de arquivos NFS.
    • NFS_PATH pelo caminho para o compartilhamento de arquivos NFS que começa com uma barra, por exemplo, /example-directory.
    • IS_READ_ONLY com True para tornar o volume somente leitura ou False para permitir gravações.
  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");

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 grava no servidor NFS, verifique se ele está sendo executado como raiz.

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. Qualquer atraso na rede pode afetar o tempo de inicialização do contêiner. Se o Cloud Run não conseguir estabelecer uma conexão com o servidor, o serviço do Cloud Run não será iniciado. Além disso, se o NFS demorar mais de 30 segundos para ser montado, o serviço do Cloud Run não será iniciado porque o Cloud Run tem um tempo limite total de 30 segundos para executar todas as montagens.

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 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.