Mapeamento de portas do Private Service Connect para produtores de serviços

1. Introdução

Com o Private Service Connect, os produtores de serviços podem expor serviços em um ambiente de VPC por um anexo de serviço e permitir que os consumidores em outro ambiente de VPC acessem esses serviços por um endpoint do Private Service Connect. Às vezes, esses serviços de produtor são projetados como clusters de VMs, com cada VM expondo os mesmos serviços em números de porta idênticos. Antes, esses projetos de serviço exigiam a implantação de vários endpoints do Private Service Connect no lado do consumidor ou o uso do encaminhamento de IP no lado do produtor para garantir que a VM correta fosse direcionada.

O Private Service Connect agora pode segmentar nativamente o destino correto usando o mapeamento de portas. Neste laboratório, você vai aprender sobre os casos de uso em que esse recurso é necessário e como implantar um NEG de mapeamento de portas em uma carga de trabalho do Private Service Connect.

O que você vai aprender

  • Casos de uso do mapeamento de portas do Private Service Connect
  • Principais benefícios do mapeamento de portas do PSC
  • Requisitos de rede
  • Crie um serviço de produtor do Private Service Connect usando o mapeamento de portas.
  • Criar um endpoint do Private Service Connect
  • Fazer chamadas por um endpoint do Private Service Connect para um serviço de produtor

O que é necessário

  • Projeto do Google Cloud com permissões de proprietário

2. Casos de uso do mapeamento de portas do Private Service Connect

O recurso de mapeamento de portas usa um NEG (grupo de endpoints de rede) específico para casos de uso do PSC.

Os tipos mais comuns de produtores que podem se beneficiar do uso do mapeamento de portas são os produtores de bancos de dados NoSQL e do Kafka. No entanto, qualquer produtor que precise de um cluster de VMs expondo os mesmos serviços em portas idênticas com requisitos específicos de mapeamento de VM pode usar esse recurso.

O produtor define o mapeamento entre uma porta do cliente e uma VM do produtor + porta de destino. Em seguida, o produtor precisa compartilhar essas informações com o consumidor. O consumidor usa as portas predefinidas para identificar de maneira exclusiva qual VM do produtor e porta de destino precisam ser alcançadas. A porta usada pelo consumidor é diferente da usada pelo produtor.

Principais benefícios do mapeamento de portas do PSC

  • Simples:os produtores implantam componentes do PSC com um mapeamento de portas, e os consumidores implantam um endpoint do PSC. O PSC processa a conversão de endereços de rede automaticamente.
  • Econômico:não exige recursos extras do PSC nem ciclos de CPU da VM produtora. O preço é o mesmo de outros tipos de implantações de PSC.
  • Alto desempenho:o mapeamento de portas oferece a mesma capacidade de processamento de taxa de linha e baixa latência que outros modos de PSC.
  • Escalonável e eficiente em termos de IP:um endereço IP da VPC do consumidor pode acessar até 1.000 VMs do produtor e 1.000 mapeamentos de portas.

3. Requisitos de rede

  • O mapeamento de portas exige o uso de um balanceador de carga de rede de passagem interna como o balanceador de carga do produtor.
  • Somente endpoints do PSC podem ser usados com o mapeamento de portas (não back-ends ou interface do PSC).
  • Os NEGs de mapeamento de portas são construções regionais.
  • As NEGs de mapeamento de portas só podem ser usadas em uma conexão do PSC. Elas não funcionam se a VM cliente chamar diretamente a regra de encaminhamento do balanceador de carga do produtor. Isso se reflete na maneira como o serviço do produtor é testado neste codelab.
  • O endpoint do PSC e a pilha de serviços do produtor precisam estar em VPCs diferentes.

4. Topologia do codelab

ad37cfc003475b7c.png

Na VPC do produtor, duas VMs serão criadas para executar dois servidores da Web cada, um na porta 1000 e outro na porta 2000. Vamos testar cada serviço antes de configurar o NEG Portmap, o balanceador de carga de rede de passagem interna e o anexo de serviço.

Na VPC do consumidor, vamos configurar um endpoint do PSC e testar a conectividade com o serviço do produtor em uma VM cliente.

5. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google e pode ser atualizada quando você quiser.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não vai ser muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou exclua o projeto. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Inicie o Cloud Shell

Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.

No Console do Google Cloud, clique no ícone do Cloud Shell na barra de ferramentas superior à direita:

55efc1aaa7a4d3ad.png

O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:

7ffe5cbb04455448.png

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Neste codelab, todo o trabalho pode ser feito com um navegador. Você não precisa instalar nada.

6. Antes de começar

Ativar APIs

No Cloud Shell, verifique se o ID do projeto está configurado.

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

Ative todos os serviços necessários

gcloud services enable compute.googleapis.com

7. Criar rede VPC do produtor

Rede VPC

No Cloud Shell

gcloud compute networks create producer-vpc --subnet-mode custom

Criar sub-redes

No Cloud Shell

gcloud compute networks subnets create producer-service-subnet --network producer-vpc --range 10.0.0.0/24 --region $region --enable-private-ip-google-access

gcloud compute networks subnets create psc-nat-subnet --network producer-vpc --range 10.100.100.0/24 --region $region --purpose=PRIVATE_SERVICE_CONNECT

A sub-rede do PSC será associada ao anexo de serviço do PSC para fins de conversão de endereços de rede. Para casos de uso de produção, essa sub-rede precisa ter o tamanho adequado para oferecer suporte à quantidade de tráfego de entrada de todos os endpoints do PSC anexados. Consulte a documentação sobre dimensionamento de sub-rede NAT do PSC para mais informações.

Criar uma política de firewall de rede e regras de firewall

No Cloud Shell

gcloud compute network-firewall-policies create producer-vpc-policy --global

gcloud compute network-firewall-policies associations create --firewall-policy producer-vpc-policy --network producer-vpc --name network-producer-vpc --global-firewall-policy

Para permitir que o IAP se conecte às suas instâncias de VM, crie uma regra de firewall que:

  • Aplica-se a todas as instâncias de VM que você quer acessar usando o IAP.
  • Permite o tráfego de entrada do intervalo de IP 35.235.240.0/20. Esse intervalo contém todos os endereços IP que o IAP usa para o encaminhamento de TCP.

No Cloud Shell

gcloud compute network-firewall-policies rules create 1000 --action ALLOW --firewall-policy producer-vpc-policy --description "SSH with IAP" --direction INGRESS --src-ip-ranges 35.235.240.0/20 --layer4-configs tcp:22  --global-firewall-policy

A regra de firewall a seguir permite o tráfego nas portas TCP 1000 a 2000 da sub-rede do PSC para todas as instâncias na rede. Em um ambiente de produção, essa regra de firewall precisa ser limitada apenas às instâncias associadas ao serviço de produtor específico.

No Cloud Shell

gcloud compute network-firewall-policies rules create 2000 --action ALLOW --firewall-policy producer-vpc-policy --description "allow traffic from PSC NAT subnet" --direction INGRESS --src-ip-ranges 10.100.100.0/24 --layer4-configs tcp:1000-2000 --global-firewall-policy

A regra de firewall a seguir permite todo o tráfego na sub-rede de serviços nas portas TCP 1000 a 2000. Essa regra será usada para testar se o serviço de produtor está funcionando corretamente.

No Cloud Shell

gcloud compute network-firewall-policies rules create 2001 --action ALLOW --firewall-policy producer-vpc-policy --description "allow traffic within the service subnet" --direction INGRESS --src-ip-ranges 10.0.0.0/24 --layer4-configs tcp:1000-2000 --global-firewall-policy

Criar e configurar VMs de produtor

Criar VMs

No Cloud Shell

gcloud compute instances create portmap-vm1 --zone=$zone --subnet=producer-service-subnet --no-address

gcloud compute instances create portmap-vm2 --zone=$zone --subnet=producer-service-subnet --no-address

gcloud compute instances create test-client-vm --zone=$zone --subnet=producer-service-subnet --no-address

Na seção a seguir, inicie o servidor HTTP nas portas 1000 e 2000 em cada VM do produtor.

Configurar VMs

No Cloud Shell

gcloud compute ssh --zone $zone "portmap-vm1" --tunnel-through-iap --project $project

No Cloud Shell da sessão portmap-vm1

mkdir 1000
cd 1000
echo "portmap-vm1 1000">index.html
sudo python3 -m http.server 1000 &
cd ..
mkdir 2000
cd 2000
echo "portmap-vm1 2000">index.html
sudo python3 -m http.server 2000 &

Abra uma nova janela do Cloud Shell

Comece redefinindo as variáveis. No Cloud Shell, faça o seguinte:

project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

gcloud compute ssh --zone $zone "portmap-vm2" --tunnel-through-iap --project $project

Na sessão portmap-vm2 do Cloud Shell

mkdir 1000
cd 1000
echo "portmap-vm2 1000">index.html
sudo python3 -m http.server 1000 &
cd ..
mkdir 2000
cd 2000
echo "portmap-vm2 2000">index.html
sudo python3 -m http.server 2000 &

8. Serviço de produtor de teste

Primeiro, precisamos conseguir os endereços IP das instâncias do portmap. Anote os dois endereços IP.

Abra uma nova janela do Cloud Shell

Comece redefinindo as variáveis. No Cloud Shell, faça o seguinte:

project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

gcloud compute instances describe portmap-vm1 \
  --format='get(networkInterfaces[0].networkIP)' --zone $zone

gcloud compute instances describe portmap-vm2\
  --format='get(networkInterfaces[0].networkIP)' --zone $zone

Faça login na instância de teste. No Cloud Shell, faça o seguinte:

gcloud compute ssh --zone $zone "test-client-vm" --tunnel-through-iap --project $project

curl [portmap-vm1 IP]:1000

Resultado esperado

portmap-vm1 1000

No Cloud Shell, faça o seguinte:

curl [portmap-vm1 IP]:2000

Resultado esperado

portmap-vm1 2000

No Cloud Shell, faça o seguinte:

curl [portmap-vm2 IP]:1000

Resultado esperado

portmap-vm2 1000

No Cloud Shell, faça o seguinte:

curl [portmap-vm2 IP]:2000

Resultado esperado

portmap-vm2 2000

Saia da test-client-vm

9. Criar um serviço do produtor com NEG de mapeamento de portas

Criar componentes do balanceador de carga

No Cloud Shell

gcloud compute network-endpoint-groups create portmap-neg --region=$region --network=producer-vpc --subnet=producer-service-subnet --network-endpoint-type=GCE_VM_IP_PORTMAP

Adicione endpoints ao NEG de mapeamento de portas para criar o mapeamento da porta do cliente para a porta do produtor. O produtor cria esse mapeamento e tem um método próprio para comunicar essas informações aos consumidores. O mapeamento de portas específico não é compartilhado pelo PSC.

No Cloud Shell, faça o seguinte:

gcloud compute network-endpoint-groups update portmap-neg --region=$region --add-endpoint=client-destination-port=1001,instance=projects/$project/zones/$zone/instances/portmap-vm1,port=1000 --add-endpoint=client-destination-port=1002,instance=projects/$project/zones/$zone/instances/portmap-vm1,port=2000 --add-endpoint=client-destination-port=1003,instance=projects/$project/zones/$zone/instances/portmap-vm2,port=1000 --add-endpoint=client-destination-port=1004,instance=projects/$project/zones/$zone/instances/portmap-vm2,port=2000

Conclua a criação do balanceador de carga.

No Cloud Shell, faça o seguinte:

gcloud compute backend-services create portmap-bes --load-balancing-scheme=internal --region=$region --network=producer-vpc

gcloud compute backend-services add-backend portmap-bes --network-endpoint-group=portmap-neg --network-endpoint-group-region=$region

gcloud compute forwarding-rules create portmap-fr --load-balancing-scheme=INTERNAL --network=producer-vpc --subnet=producer-service-subnet --ports=ALL --region=$region --backend-service=portmap-bes

Criar anexo de serviço

No Cloud Shell

gcloud compute service-attachments create portmap-service-attachment --region=$region --producer-forwarding-rule=portmap-fr --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet

Em seguida, recupere e anote o URI do anexo de serviço para configurar o endpoint do PSC no ambiente do consumidor.

No Cloud Shell, faça o seguinte:

gcloud compute service-attachments describe portmap-service-attachment --region=$region

Exemplo de resposta esperada

connectionPreference: ACCEPT_AUTOMATIC
creationTimestamp: '2024-07-19T10:02:29.432-07:00'
description: ''
enableProxyProtocol: false
fingerprint: LI8D6JNQsLA=
id: '6207474793859982026'
kind: compute#serviceAttachment
name: portmap-service-attachment
natSubnets:
- https://www.googleapis.com/compute/v1/projects/$project/regions/$zone/subnetworks/psc-nat-subnet
pscServiceAttachmentId:
  high: '94288091358954472'
  low: '6207474793859982026'
reconcileConnections: false
region: https://www.googleapis.com/compute/v1/projects/$project/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/serviceAttachments/portmap-service-attachment
targetService: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/forwardingRules/portmap-fr

10. Criar rede VPC do consumidor

Rede VPC

No Cloud Shell

gcloud compute networks create consumer-vpc --subnet-mode custom

Criar sub-rede

No Cloud Shell

gcloud compute networks subnets create consumer-client-subnet --network consumer-vpc --range=10.0.0.0/24 --region $region --enable-private-ip-google-access

Criar uma política de firewall de rede e regras de firewall

No Cloud Shell

gcloud compute network-firewall-policies create consumer-vpc-policy --global

gcloud compute network-firewall-policies associations create --firewall-policy consumer-vpc-policy --network consumer-vpc --name network-consumer-vpc --global-firewall-policy

gcloud compute network-firewall-policies rules create 1000 --action ALLOW --firewall-policy consumer-vpc-policy --description "SSH with IAP" --direction INGRESS --src-ip-ranges 35.235.240.0/20 --layer4-configs tcp:22  --global-firewall-policy

Apenas o acesso SSH do IAP é necessário para a rede do consumidor.

11. Criar VM, endpoint do PSC e testar a conectividade

Neste ponto, três janelas do Cloud Shell devem estar abertas. Uma sessão precisa estar aberta com portmap-vm1. Uma deve ter uma sessão aberta com portmap-vm2, e a outra deve ser a sessão de trabalho.

Criar VM de teste

No Cloud Shell

gcloud compute instances create consumer-client-vm --zone $zone --subnet=consumer-client-subnet --no-address

Criar endpoint do PSC

No Cloud Shell

gcloud compute addresses create psc-endpoint-ip --region=$region --subnet=consumer-client-subnet --addresses 10.0.0.10

gcloud compute forwarding-rules create psc-portmap-endpoint --region=$region --network=consumer-vpc --address=psc-endpoint-ip --target-service-attachment=[SERVICE ATTACHMENT URI]

Testar a conectividade

No Cloud Shell

gcloud compute ssh --zone $zone "consumer-client-vm" --tunnel-through-iap --project $project

curl 10.0.0.10:1001

Resposta esperada

portmap-vm1 1000

No Cloud Shell

curl 10.0.0.10:1002

Resposta esperada

portmap-vm1 2000

No Cloud Shell

curl 10.0.0.10:1003

Resposta esperada

portmap-vm2 1000

No Cloud Shell

curl 10.0.0.10:1004

Resposta esperada

portmap-vm2 2000

12. Etapas de limpeza

Saia da instância de VM (todas as janelas)

exit

Excluir componentes do laboratório em um único terminal do Cloud Shell

gcloud compute forwarding-rules delete psc-portmap-endpoint --region=$region -q

gcloud compute addresses delete psc-endpoint-ip --region=$region -q

gcloud compute instances delete consumer-client-vm --zone=$zone -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy=consumer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=consumer-vpc-policy  --name=network-consumer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete consumer-vpc-policy --global -q

gcloud compute networks subnets delete consumer-client-subnet  --region=$region -q

gcloud compute networks delete consumer-vpc -q

gcloud compute service-attachments delete portmap-service-attachment --region=$region -q

gcloud compute forwarding-rules delete portmap-fr --region=$region -q

gcloud compute backend-services delete portmap-bes --region=$region -q

gcloud compute network-endpoint-groups delete portmap-neg --region=$region -q

gcloud compute instances delete test-client-vm --zone=$zone -q

gcloud compute instances delete portmap-vm2 --zone=$zone -q

gcloud compute instances delete portmap-vm1 --zone=$zone -q

gcloud compute network-firewall-policies rules delete 2001 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 2000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=producer-vpc-policy  --name=network-producer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete producer-vpc-policy --global -q

gcloud compute networks subnets delete psc-nat-subnet --region $region -q

gcloud compute networks subnets delete producer-service-subnet --region $region -q

gcloud compute networks delete producer-vpc -q

13. Parabéns!

Parabéns por concluir o codelab.

O que vimos

  • Casos de uso do mapeamento de portas do Private Service Connect
  • Principais benefícios do mapeamento de portas do PSC
  • Requisitos de rede
  • Crie um serviço de produtor do Private Service Connect usando o mapeamento de portas.
  • Criar um endpoint do Private Service Connect
  • Fazer chamadas por um endpoint do Private Service Connect para um serviço de produtor