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 usando um anexo de serviço e permitir que 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 designs 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 do produtor correta fosse direcionada.

Agora, o Private Service Connect pode segmentar o destino correto de forma nativa 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) de mapeamento de portas 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 os produtores do Kafka. No entanto, qualquer produtor que precise de um cluster de VMs que exiba 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 de produtor + porta de destino. O produtor precisa compartilhar essas informações com o consumidor. O consumidor usa as portas predefinidas para identificar exclusivamente qual VM de produtor + porta de destino ele precisa alcançar. 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 requer recursos adicionais de PSC nem ciclos de CPU da VM do produtor. O preço é o mesmo de outros tipos de implantações do 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.
  • Escalabilidade e eficiência de IP:um endereço IP da VPC do consumidor pode acessar até 1.000 VMs de produtores e 1.000 mapeamentos de porta

3. Requisitos de rede

  • O mapeamento de portas exige o uso de um balanceador de carga de passagem de rede interno como o balanceador de carga do produtor.
  • Somente endpoints PSC podem ser usados com o mapeamento de portas, não back-ends PSC nem a interface PSC.
  • Os NEGs de mapeamento de portas são construções regionais.
  • Os NEGs de mapeamento de portas só podem ser usados em uma conexão PSC. Elas não vão funcionar se a VM cliente chamar a regra de encaminhamento do balanceador de carga do produtor diretamente. Isso é refletido na forma como o serviço de 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, um na porta 1000 e outro na porta 2000. Vamos testar cada serviço antes de configurar o NEG do Portmap, o balanceador de carga de passagem de rede interna e a vinculação 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

Ativar 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 PSC para fins de conversão de endereços de rede. Para casos de uso de produção, essa sub-rede precisa ter um tamanho adequado para suportar a quantidade de tráfego de entrada de todos os endpoints PSC conectados. Consulte a documentação de dimensionamento de sub-redes PSC NAT para mais informações.

Criar políticas e regras de firewall de rede

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 da VM que você quer que sejam acessíveis 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-2000 da sub-rede 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-2000. Essa regra será usada para testar se o serviço de produtor está funcionando adequadamente.

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 na porta 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, na 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 &

Abrir 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

No Cloud Shell, na sessão portmap-vm2

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 testes

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

Abrir 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

Sair da test-client-vm

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

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 terá o próprio método 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, extraia 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 resultado esperado

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 uma 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 políticas e regras de firewall de rede

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

Somente o SSH do acesso ao 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 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 uma 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

Sair 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