Configure o Cloud Service Mesh para o Cloud Run

Esta página mostra como configurar a Cloud Service Mesh para ser executada numa variedade de infraestruturas de computação para serviços do Cloud Run.

O Cloud Service Mesh permite-lhe ativar capacidades avançadas de gestão de tráfego, como a divisão de tráfego ponderada e o balanceamento de carga global, bem como políticas de observabilidade e segurança para o tráfego de um serviço do Cloud Run para outro. Também lhe oferece uma solução de plano de dados totalmente gerida que remove o encargo operacional de manter os seus próprios sidecars de malha de serviço.

Antes de começar

  1. Ter familiaridade com o Cloud Service Mesh.

  2. Defina o projeto:

    gcloud config set core/project PROJECT_ID
  3. Na Google Cloud consola, ative as seguintes APIs para o seu projeto:

    Se estiver a usar um conetor do Acesso a VPC sem servidor e não a VPC direta para a saída de rede.

  4. Atualize os componentes gcloud para a versão mais recente (488.0.0 ou superior):

    gcloud components update

Limitações

Os serviços do Cloud Run que usam o Cloud Service Mesh podem ter um aumento na latência de início a frio. Consulte a secção Sugestões gerais de desenvolvimento na documentação do Cloud Run para obter sugestões sobre como melhorar os tempos de início.

Funções necessárias

Para receber as autorizações necessárias para configurar e implementar serviços do Cloud Run, peça ao seu administrador para lhe conceder as seguintes funções de IAM:

A conta de serviço do cliente do Cloud Run também tem de ter as seguintes funções:

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.

Chame serviços do Cloud Run através do Cloud Service Mesh

O Cloud Run usa as APIs de encaminhamento de serviços do Cloud Service Mesh. Estas APIs permitem que um serviço do Cloud Run chame outros serviços do Cloud Run através de um URL personalizado em vez do URL run.app fornecido. Além disso, o Cloud Run autentica-se automaticamente no serviço do Cloud Run de destino para que não tenha de configurar a sua própria autenticação para anexar credenciais de pedidos a outros serviços do Cloud Run.

Para ligar de um serviço do Cloud Run a outro através da Cloud Service Mesh, siga estes passos:

  1. Configure um Cloud Service Mesh
  2. Configure o Cloud DNS
  3. Crie o serviço do Cloud Run de destino
  4. Crie o NEG sem servidor
  5. Crie o serviço do Cloud Run do cliente
  6. Ligue para o serviço a partir do cliente de malha

Configure uma Cloud Service Mesh

  1. Para criar uma rota de serviço com o URL predefinido, guarde a especificação Mesh num ficheiro denominado mesh.yaml:

    name: MESH_NAME

    Substitua MESH_NAME pelo nome do recurso de malha.

  2. Importe o recurso Mesh da especificação executando o seguinte comando:

    gcloud network-services meshes import MESH_NAME \
      --source=mesh.yaml \
      --location=global

    Substitua MESH_NAME pelo nome do recurso de malha.

Configure o Cloud DNS

Pode ignorar a configuração do Cloud DNS e aceder à secção seguinte se usar um ponto final do Private Service Connect com o endereço URL run.app completo como nome do anfitrião, porque só são capturados endereços IP privados.

Quando um cliente de malha chama o serviço de destino, o nome do anfitrião usado no pedido tem de ser resolvível através do DNS. Qualquer endereço IP RFC 1918 válido é aceitável porque o sidecar captura todo o tráfego IP para estes intervalos de endereços IP e redireciona-o adequadamente.

O exemplo seguinte mostra como criar uma entrada com carateres universais * na zona do Cloud DNS que é resolvida para um único endereço IP. Se não quiser usar uma zona do Cloud DNS exclusiva, crie uma entrada do Cloud DNS para cada nome de anfitrião correspondente aos serviços do Cloud Run que quer que sejam acessíveis a partir da malha.

  • Para criar um registo do Cloud DNS numa zona exclusiva, execute os seguintes comandos:

    1. Crie uma zona de DNS gerida privada no Cloud DNS para uma malha de serviço.

      gcloud dns managed-zones create MESH_NAME \
      --description="Domain for DOMAIN_NAME service mesh routes" \
      --dns-name=DOMAIN_NAME. \
      --networks=VPC_NETWORK_NAME \
      --visibility=private
    2. Crie um registo de DNS na zona gerida privada recém-criada. Certifique-se de que o endereço IP 10.0.0.1 não está a ser usado.

      gcloud dns record-sets create "*.DOMAIN_NAME." \
      --type=A \
      --zone="MESH_NAME" \
      --rrdatas=10.0.0.1 \
      --ttl=3600

      Substitua o seguinte:

      • DOMAIN_NAME: o nome do domínio DNS.
      • MESH_NAME: o nome do recurso da malha.
      • VPC_NETWORK_NAME: o nome da sua rede VPC; por exemplo, "default".

Aceda a serviços internos com o Cloud Service Mesh

O Cloud Run permite-lhe restringir o tráfego de rede de entrada a "interno". Se o seu serviço tiver esta restrição de entrada ativada, o tráfego que viaja da sua malha através da rede de nuvem privada virtual pode ser definido como "interno" quando ativa um caminho de acesso ao Cloud Run.

Para aceder a serviços internos com a Cloud Service Mesh, use um dos seguintes métodos:

Crie o serviço do Cloud Run de destino

Tenha em atenção que o destino do Cloud Run não pode ter o URL predefinido desativado.

  1. Implemente um serviço do Cloud Run novo ou existente:

    gcloud run deploy DESTINATION_SERVICE_NAME \
    --no-allow-unauthenticated \
    --region=REGION \
    --image=IMAGE_URL 

    Substitua o seguinte:

    • DESTINATION_SERVICE_NAME: o nome do serviço do Cloud Run de destino.
    • REGION: o nome da região.
    • IMAGE_URL: uma referência à imagem do contentor, como us-docker.pkg.dev/cloudrun/container/hello:latest.

Crie o grupo de pontos finais de rede (NEG) sem servidor

  1. Crie o NEG de destino executando o seguinte comando:

    gcloud compute network-endpoint-groups create DESTINATION_SERVICE_NAME-neg \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-service=DESTINATION_SERVICE_NAME

    Substitua o seguinte:

    • REGION: o nome da região.
    • DESTINATION_SERVICE_NAME: o nome do serviço do Cloud Run de destino.
  2. Crie um serviço de back-end autogerido interno que faça referência ao NEG sem servidor.

    1. Crie o serviço de back-end:

      gcloud compute backend-services create DESTINATION_SERVICE_NAME-REGION \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED

      Substitua DESTINATION_SERVICE_NAME pelo nome do serviço de destino e REGION pelo nome da região.

    2. Adicione o back-end sem servidor ao serviço de back-end:

      gcloud compute backend-services add-backend DESTINATION_SERVICE_NAME-REGION \
      --global \
      --network-endpoint-group=DESTINATION_SERVICE_NAME-neg \
      --network-endpoint-group-region=REGION

      Substitua DESTINATION_SERVICE_NAME pelo nome do serviço de destino e REGION pelo nome da região.

  3. Crie uma rota HTTP que faça referência ao serviço de back-end.

    O recurso Mesh e os serviços estão configurados. Associe-os a um recurso HTTPRoute que associa um nome do anfitrião a um serviço de back-end.

    1. Crie a especificação HTTPRoute e guarde-a num ficheiro denominado http_route.yaml:

      name: "DESTINATION_SERVICE_NAME-route"
      hostnames:
      - "DESTINATION_SERVICE_NAME.DOMAIN_NAME"
      meshes:
      - "projects/PROJECT_ID/locations/global/meshes/MESH_NAME"
      rules:
      - action:
         destinations:
         - serviceName: "projects/PROJECT_ID/locations/global/backendServices/DESTINATION_SERVICE_NAME-REGION"
      

      Defina os nomes dos anfitriões para os nomes que quer usar para se dirigir ao serviço. Todos os clientes na mesma malha de serviço podem chamar este serviço usando o URL http://<HOSTNAME>, independentemente da região e do projeto do autor da chamada. Se configurou o Cloud DNS para usar um endereço IP privado, o nome do anfitrião do trajeto também pode ser o endereço run.appURL completo. Nesse caso, pode ignorar o passo de configuração do Cloud DNS.

      Substitua o seguinte:

      • DESTINATION_SERVICE_NAME: o nome do serviço do Cloud Run de destino.
      • DOMAIN_NAME: o nome do domínio DNS.
      • PROJECT_ID: o ID do projeto.
      • MESH_NAME: o nome da malha.
      • REGION: o nome da região.
    2. Crie o recurso HTTPRoute usando a especificação no ficheiro http_route.yaml:

      gcloud network-services http-routes import DESTINATION_SERVICE_NAME-route \
      --source=http_route.yaml \
      --location=global
      
    3. Conceda a função de invocador do Cloud Run (roles/iam.invoker) no serviço de destino do Cloud Run executando o seguinte comando:

      gcloud run services add-iam-policy-binding DESTINATION_SERVICE_NAME \
      --region REGION \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.invoker

      Substitua o seguinte:

      • DESTINATION_SERVICE_NAME: o nome do serviço do Cloud Run de destino.
      • REGION: o nome da região.
      • PROJECT_NUMBER: o número do projeto.

Crie o serviço do Cloud Run do cliente

A criação de um serviço do Cloud Run do cliente cria um Envoy sidecar cujos recursos estão relacionados com o seu CPS e tamanho total da configuração. Na maioria das vezes, a utilização da CPU é inferior a 1% de uma CPU virtual e a utilização de memória é inferior a 50 MB.

Tem de ter acesso de saída de rede a uma rede de nuvem privada virtual.

  • Para criar o serviço de cliente para testes, implemente a app fortio no Cloud Run para permitir o encaminhamento de tráfego para rotas HTTP:

    gcloud beta run deploy CLIENT_SERVICE_NAME \
    --region=REGION \
    --image=fortio/fortio \
    --network=VPC_NETWORK_NAME \
    --subnet=SUBNET_NAME \
    --mesh="projects/PROJECT_ID/locations/global/meshes/MESH_NAME"

    Substitua o seguinte:

    • CLIENT_SERVICE_NAME: o nome do serviço do Cloud Run do cliente.
    • REGION: o nome da sua região.
    • VPC_NETWORK_NAME: o nome da sua rede VPC; por exemplo, "default".
    • SUBNET_NAME: o nome da sua sub-rede; por exemplo, "default".
    • PROJECT_ID: o ID do seu projeto.
    • MESH_NAME: o nome do recurso de malha.

Serviço de chamadas a partir de um cliente de malha

Para encaminhar um pedido para a rota de destino através da app de teste fortio da secção Crie um serviço de cliente anterior:

  1. Obtenha o URL do serviço do cliente do Cloud Run que criou executando o seguinte comando:

    TEST_SERVICE_URL=$(gcloud run services describe CLIENT_SERVICE_NAME \
    --region=REGION --format="value(status.url)" \
    --project=PROJECT_ID)

    Substitua o seguinte:

    • CLIENT_SERVICE_NAME: o nome do serviço do Cloud Run do cliente.
    • REGION: o nome da sua região.
    • PROJECT_ID: o ID do seu projeto.
  2. Use o comando curl para enviar um pedido para a rota de destino do ponto final do fortio do passo anterior:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/DESTINATION_SERVICE_NAME.DOMAIN_NAME"

    Substitua o seguinte:

    • DESTINATION_SERVICE_NAME: o nome do serviço do Cloud Run de destino.
    • DOMAIN_NAME: o nome do domínio DNS.

Chame o back-end do Compute Engine a partir do Cloud Run

Para implementar uma rota de serviço do Compute Engine e do Cloud Service Mesh usando grupos de instâncias geridos como back-ends, configure o servidor HTTP baseado no Compute Engine no Cloud Service Mesh. Isto permite que os clientes do Cloud Run usem esta rota de serviço de back-end para enviar pedidos diretamente para instâncias do Compute Engine.

Passos seguintes