Encaminhamento de proxy de front-end com o Nginx

Esta página mostra como usar o NGINX como um proxy de front-end para o contentor da sua aplicação. Isto é útil se quiser processar pedidos ou respostas. Pode adicionar a compressão gzip ou traduzir HTTP/2 para HTTP/1 se os contentores da sua aplicação suportarem apenas HTTP/1 e precisar de usar HTTP/2 ponto a ponto por motivos de desempenho.

No exemplo fornecido nesta página, um contentor Nginx é executado em todas as instâncias do Cloud Run como o contentor de publicação principal e está configurado para encaminhar pedidos para o contentor da aplicação, que é executado como um contentor sidecar, conforme mostrado neste diagrama:

Cloud Run mc hello nginx 1

A forma mais eficaz de fazer o proxying de frontend no Cloud Run é implementar o contentor do servidor proxy do servidor Nginx e o contentor da app Web como um único serviço do Cloud Run:

Cloud Run mc hello nginx 2

Este único serviço do Cloud Run aceita pedidos e entrega-os ao contentor de entrada (publicação), que, neste caso, é o servidor proxy. Em seguida, o servidor proxy envia pedidos à app Web através da interface de rede localhost, o que evita qualquer rede externa.

A implementação como um único serviço do Cloud Run reduz as latências, a sobrecarga de gestão de serviços e elimina a exposição a redes externas. O Cloud Run não interage diretamente com os contentores auxiliares, exceto para os iniciar ou parar sempre que o serviço é iniciado ou parado.

O contentor da app Web e todos os contentores auxiliares podem ser escritos em diferentes linguagens de programação. Para ver um exemplo escrito em PHP, consulte o exemplo de nginx em PHP no GitHub.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Enable the Cloud Run and Secret Manager APIs.

    Enable the APIs

  7. Instale e inicialize a CLI gcloud.
  8. Atualize a CLI do Google Cloud: gcloud components update
  9. Configurar a CLI do Google Cloud: gcloud init
  10. Autentique-se com a CLI do Google Cloud: gcloud auth login
  11. Autorizações necessárias para a implementação

    Tem de ter UMA das seguintes opções:

    Vista geral da configuração

    Estas instruções usam imagens de contentores pré-criadas, pelo que a única coisa necessária para o proxying de front-end é configurar os contentores e o próprio serviço.

    Configure o contentor de entrada Nginx

    A imagem do contentor está nginx disponível no Docker Hub. Está praticamente pronto a usar, exceto que tem de ser configurado para ser executado como um serviço de proxy, fornecendo os pedidos de proxy à porta onde o contentor sidecar está a escutar localhost. O exemplo nesta página também ativa a compressão gzip para pedidos e respostas.

    A configuração é fornecida através de um ficheiro de texto montado em /etc/nginx/conf.d/nginx.conf. Uma vez que não pode editar diretamente ficheiros no contentor, tem de montar um volume em /etc/nginx/conf.d/ que contenha o ficheiro de configuração. Uma forma de montar um ficheiro numa localização específica num contentor em execução no Cloud Run é armazenar o conteúdo do ficheiro num segredo do Secret Manager e montar esse segredo na localização selecionada.

    Copie o seguinte num ficheiro com o nome nginx.conf no diretório atual da sua máquina local.

    
    server {
        # Listen at port 8080
        listen 8080; 
        # Server at localhost
        server_name _;
        # Enables gzip compression to make our app faster
        gzip on;
    
        location / {
            # Passes initial requests to port 8080 to `hello` container at port 8888
            proxy_pass   http://127.0.0.1:8888;
        }
    }
    

    Na configuração, faça o seguinte:

    • Atribua nginx para ouvir na mesma porta predefinida do Cloud Run 8080, localizada em localhost.
    • Aplique a compressão gzip para melhorar o desempenho.
    • Instrua o proxy_pass a entregar todos os pedidos a este contentor de entrada no contentor secundário da app Web na porta do anfitrião local 8888.

    Crie um segredo com o conteúdo do ficheiro nginx.conf.

    Consola

    1. Aceda à página Secret Manager da Google Cloud consola:

      Aceda ao Secret Manager

    2. Clique em Criar segredo.

    3. No campo do formulário name, introduza nginx_config.

    4. Carregue o ficheiro nginx.conf localizado em multi-container/hello-nginx-sample/nginx.conf como o valor secreto.

    5. Manter as predefinições (Google-owned and Google-managed encryption key, etc).

    6. Clique em Criar segredo.

    7. Conceda à conta de serviço de computação do projeto acesso a este novo segredo. Para o fazer, aceda à página IAM na Google Cloud consola:

      Aceda ao IAM

    8. Localize a conta de serviço principal com o nome: Compute Engine default service account e clique em Editar principal.

    9. Clique em Adicionar outra função e selecione Acesso ao segredo do Secret Manager.

    10. Clique em Guardar.

    gcloud

    1. Num terminal, use o seguinte comando para criar um novo segredo do nginx_config no Secret Manager:

      gcloud secrets create nginx_config --replication-policy='automatic' --data-file='./nginx.conf'

    2. Conceda à conta de serviço de computação do projeto acesso a este novo segredo através do comando

      export PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')
      gcloud secrets add-iam-policy-binding nginx_config --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com --role='roles/secretmanager.secretAccessor'

    3. Verifique se o segredo foi criado executando gcloud secrets list.

    Acerca da imagem de exemplo da barra lateral da app Web

    Estas instruções usam a imagem do contentor de exemplo em us-docker.pkg.dev/cloudrun/container/hello. Tem de especificar o número da porta em que o contentor vai escutar e localhost como anfitrião, conforme descrito em Especifique a configuração do contentor auxiliar, conforme descrito nas secções seguintes.

    Configure o serviço com vários contentores

    Pode usar a Google Cloud consola ou o ficheiro YAML do Cloud Run para configurar um serviço do Cloud Run com mais do que um contentor.

    Na configuração do serviço, especifique o servidor proxy Nginx como contentor de entrada (publicação), a porta na qual vai escutar, se aceita pedidos HTTP 1 ou HTTP 2 e a ordem de início do contentor. O contentor de entrada (servidor proxy) depende do componente suplementar da app Web, pelo que este tem de ser iniciado primeiro.

    Estas configurações são apresentadas nas secções seguintes.

    Adicione metadados YAML

    Consola

    Navegue até Implementar o serviço para ver as instruções completas da consola.

    YAML

    1. 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
    2. Em service.yaml, adicione o seguinte:

      metadata:
        name: "MC_SERVICE_NAME"
        labels:
          cloud.googleapis.com/location: "REGION"
        annotations:
          # Required to use Cloud Run multi-containers (preview feature)
          run.googleapis.com/launch-stage: BETA
          run.googleapis.com/description: sample tutorial service
          # Externally available
          run.googleapis.com/ingress: all

    A secção descreve a revisão do serviço, que inclui propriedades que podem variar de revisão para revisão.

    Especifique a ordem de arranque do contentor

    Consola

    Navegue até Implementar o serviço para ver as instruções completas da consola.

    YAML

    Em service.yaml, anexe o seguinte:

    spec:
      template:
        metadata:
          annotations:
            # Defines container startup order within multi-container service.
            # Below requires hello container to spin up before nginx container,
            # which depends on the hello container.
            # https://cloud.google.com/run/docs/configuring/containers#container-ordering
            run.googleapis.com/container-dependencies: "{nginx: [hello]}"

    Repare na anotação container-dependencies que indica ao Cloud Run para aguardar que o contentor hello seja iniciado antes de iniciar o contentor nginx. Caso contrário, se o contentor nginx for iniciado primeiro, pode tentar encaminhar um pedido Web para o contentor da app Web que não está pronto, o que gera respostas de erro Web.

    Cada contentor pode ter opcionalmente uma propriedade de nome definida para si, que pode ser usada para se referir a ele noutras diretivas. O contentor de publicação executa o servidor proxy, denominado nginx. Este é o contentor para o qual o Cloud Run envia pedidos recebidos. Por isso, tem de especificar a versão do HTTP e a porta do contentor para os enviar.

    Especifique a configuração do contentor de publicação

    Consola

    Navegue até Implementar o serviço para ver as instruções completas da consola.

    YAML

    No ficheiro service.yaml, anexe o seguinte:

    spec:
      containers:
        # A) Serving ingress container "nginx" listening at PORT 8080
        # Main entrypoint of multi-container service.
        # Source is stored in nginx_config secret in Secret Manager.
        # Any pings to this container will proxy over to hello container at PORT 8888.
        # https://cloud.google.com/run/docs/container-contract#port
        - image: nginx
          name: nginx
          ports:
            - name: http1
              containerPort: 8080
          resources:
            limits:
              cpu: 500m
              memory: 256Mi
          # Referencing declared volume below,
          # Declaring volume to mount in current ingress container's filesystem
          # https://cloud.google.com/run/docs/reference/rest/v2/Container#volumemount
          volumeMounts:
            - name: nginx-conf-secret
              readOnly: true
              mountPath: /etc/nginx/conf.d/
          startupProbe:
            timeoutSeconds: 240
            periodSeconds: 240
            failureThreshold: 1
            tcpSocket:
              port: 8080

    O servidor nginx requer um ficheiro de configuração no diretório /etc/nginx/conf.d/. Para o fazer, monte um volume que contenha o ficheiro nessa localização. A secção volumeMount especifica um volume denominado configuration a ser colocado aí. O volume em si está definido na sua própria secção mais adiante no ficheiro.

    Especifique a configuração do contentor sidecar

    Consola

    Navegue até Implementar o serviço para ver as instruções completas da consola.

    YAML

    Em service.yaml, anexe o seguinte:

    - image: us-docker.pkg.dev/cloudrun/container/hello
      name: hello
      env:
        - name: PORT
          value: "8888"
      resources:
        limits:
          cpu: 1000m
          memory: 512Mi
      startupProbe:
        timeoutSeconds: 240
        periodSeconds: 240
        failureThreshold: 1
        tcpSocket:
          port: 8888

    A aplicação hello também precisa de informações de configuração. O servidor fica à escuta de pedidos recebidos na porta especificada na variável de ambiente PORT. Esse nome e valor são especificados na secção env.

    Especifique o volume secreto

    Consola

    Navegue até Implementar o serviço para ver as instruções completas da consola.

    YAML

    No ficheiro service.yaml, anexe o seguinte:

    volumes:
      - name: nginx-conf-secret
        secret:
          secretName: nginx_config
          items:
            - key: latest
              path: default.conf

    Especifique a configuração volume montada na secção volumeMount. Contém um único ficheiro denominado nginx.conf cujo conteúdo é definido como o valor do segredo denominado nginx-conf-secret.

    Implemente o serviço

    Consola

    1. Aceda à página Cloud Run na Google Cloud consola:

      Aceda ao Cloud Run

    2. Selecione Serviços no menu e clique em Implementar contentor para apresentar o formulário Criar serviço.

      1. Selecione Implementar uma revisão a partir de uma imagem de contentor existente e introduza nginx como URL da imagem de contentor.
      2. No campo Nome do serviço, indique um nome para o seu serviço, por exemplo, hello-mc.
      3. Na lista Região, selecione uma localização para implementar, por exemplo, us-west1.
      4. Em Autenticação, selecione Permitir acesso público. Se não tiver autorizações (função de administrador do Cloud Run) para selecionar esta opção, o serviço é implementado e requer autenticação.
    3. Clique em Recipientes, volumes, trabalhar em rede, segurança para expandir o formulário de configuração.

      1. Clique no separador Volumes.
      2. Clique em Adicionar volume.
      3. Na lista Tipo de volume, selecione Secreto.
      4. No campo Nome do volume, introduza nginx-conf-secret.
      5. No campo Segredo, introduza nginx_config.
      6. Em Caminhos especificados para versões secretas, especifique default.conf como o caminho e latest como a versão.
      7. Clique em Criar para criar o volume do segredo.
    4. Clique no separador Contentores para apresentar o formulário Editar contentor.

      1. Clique em Definições e, em Recursos, altere a memória para 256 MiB e a CPU para 1 CPU.
      2. Clique em Volumes montados.
      3. Clique em Montar volume.
      4. Selecione nginx-conf-secret na lista de nomes.
      5. Em Caminho de montagem, introduza etc/nginx/conf.d.
      6. Clique em Concluído para concluir a configuração do primeiro contentor.
    5. Clique em Adicionar contentor para adicionar o contentor sidecar e apresentar o formulário Novo contentor.

      1. Selecione o URL da imagem do contentor predefinido us-docker.pkg.dev/cloudrun/container/hello
      2. Clique no separador Definições e, de seguida, em Recursos, altere a memória para 256 MiB e a CPU para 1 CPU.
      3. Clique em Variáveis e segredos.
      4. Clique em Adicionar variável.
      5. Introduza PORT como o novo nome da variável de ambiente e 8888 como o valor.
      6. Clique em Concluído.
    6. Navegue para o formulário Editar contentor do primeiro contentor (nginx).

      1. Clique no separador Definições.
      2. Em Ordem de arranque do contentor, selecione nginx na lista Depende de. Isto significa que o contentor nginx só é iniciado depois de o contentor hello ser iniciado com êxito.
      3. Clique em Criar e aguarde pela implementação do serviço.

    YAML

    Para implementar o contentor do servidor proxy e o contentor da app Web como um único serviço:

    gcloud run services replace service.yaml

    Valide o serviço implementado

    Para validar a implementação bem-sucedida, copie o URL do Cloud Run gerado e abra-o num navegador ou use este comando para enviar um pedido autenticado:

    curl --header "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

    Deve receber uma mensagem de proxy nginx que foi portada com êxito para o contentor sidecar hello com o estado de resposta 200.

    Experimente

    Para continuar este tutorial:

    gcloud

    1. Num terminal, clone o repositório da app de exemplo para a sua máquina local:

      git clone https://github.com/GoogleCloudPlatform/cloud-run-samples

    2. Altere para o diretório que contém o código de exemplo do Cloud Run:

      cd cloud-run-samples/multi-container/hello-nginx-sample/

    O que se segue?

    Para explorar mais sobre a utilização de sidecars num serviço do Cloud Run: