Asignación de puertos privados de Private Service Connect para productores de servicios

1. Introducción

Con Private Service Connect, los productores de servicios pueden exponer servicios en un entorno de VPC a través de un adjunto de servicio y permitir que los consumidores de otro entorno de VPC accedan a esos servicios a través de un extremo de Private Service Connect. A veces, estos servicios de productor se diseñan como clústeres de VMs, y cada VM expone los mismos servicios en números de puerto idénticos. Anteriormente, estos diseños de servicios requerían que se implementaran varios extremos de Private Service Connect en el lado del consumidor o el uso del reenvío de IP en el lado del productor para asegurarse de que se segmentara la VM del productor correcta.

Private Service Connect ahora puede orientarse de forma nativa al destino correcto con la asignación de puertos. En este lab, aprenderás sobre los casos de uso en los que se requiere esta función y cómo implementar un NEG de asignación de puertos en una carga de trabajo de Private Service Connect.

Qué aprenderás

  • Casos de uso de la asignación de puertos de Private Service Connect
  • Beneficios clave de la asignación de puertos de PSC
  • Requisitos de red
  • Crea un servicio de productor de Private Service Connect con la asignación de puertos.
  • Crear un extremo de Private Service Connect
  • Realiza llamadas a través de un extremo de Private Service Connect a un servicio de productor

Requisitos

  • Proyecto de Google Cloud con permisos de propietario

2. Casos de uso de la asignación de puertos de Private Service Connect

La función de asignación de puertos usa un NEG (grupo de extremos de red) de asignación de puertos específico para los casos de uso de PSC.

Los tipos de productores más comunes que pueden beneficiarse del uso de la asignación de puertos son los productores de bases de datos NoSQL y los productores de Kafka. Sin embargo, cualquier productor que requiera un clúster de VMs que exponga los mismos servicios en puertos idénticos con requisitos de asignación de VM específicos puede usar esta función.

El productor define la asignación entre un puerto de cliente y una VM de productor + puerto de destino. Luego, el productor debe compartir esta información con el consumidor. El consumidor usa los puertos predefinidos para identificar de forma única a qué VM de productor y puerto de destino debe llegar. El puerto que usa el consumidor es diferente del que usa el productor.

Beneficios clave de la asignación de puertos de PSC

  • Simple: Los productores implementan componentes de PSC con una asignación de puertos, y los consumidores implementan un extremo de PSC. PSC controla la traducción de direcciones de red automáticamente.
  • Económica: No requiere recursos de PSC adicionales ni ciclos de CPU de la VM del productor. Los precios son los mismos que para otros tipos de implementaciones de PSC.
  • Alto rendimiento: La asignación de puertos ofrece la misma capacidad de procesamiento de la tasa de línea y latencia baja que otros modos de PSC.
  • Escalable y eficiente en términos de IP: Una dirección IP de la VPC del consumidor puede acceder a hasta 1,000 VMs de productor y 1,000 asignaciones de puertos.

3. Requisitos de red

  • La asignación de puertos requiere el uso de un balanceador de cargas de red de transferencia interno como el balanceador de cargas del productor.
  • Solo se pueden usar extremos de PSC con la asignación de puertos (no backends ni interfaces de PSC).
  • Los NEG de asignación de puertos son construcciones regionales.
  • Los NEG de asignación de puertos solo se pueden usar en una conexión de PSC. No funcionarán si la VM del cliente llama directamente a la regla de reenvío del balanceador de cargas del productor. Esto se refleja en la forma en que se prueba el servicio de productor en este codelab.
  • El extremo de PSC y la pila de servicios del productor deben estar en VPC diferentes.

4. Topología del codelab

ad37cfc003475b7c.png

En la VPC del productor, se crearán dos VMs que ejecutarán dos servidores web cada una, uno en el puerto 1000 y otro en el puerto 2000. Probaremos cada servicio antes de configurar el NEG de Portmap, el balanceador de cargas de red de transferencia interna y la vinculación de servicios.

En la VPC del consumidor, configuraremos un extremo de PSC y probaremos la conectividad al servicio de productor desde una VM cliente.

5. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla cuando quieras.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID de tu proyecto (suele identificarse como PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usa el mismo durante todo el proyecto.
  • Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Inicia Cloud Shell

Si bien Google Cloud y Spanner se pueden operar de manera remota desde tu laptop, en este codelab usarás Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

En Google Cloud Console, haz clic en el ícono de Cloud Shell en la barra de herramientas en la parte superior derecha:

55efc1aaa7a4d3ad.png

El aprovisionamiento y la conexión al entorno deberían tomar solo unos minutos. Cuando termine el proceso, debería ver algo como lo siguiente:

7ffe5cbb04455448.png

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Todo tu trabajo en este codelab se puede hacer en un navegador. No es necesario que instales nada.

6. Antes de comenzar

Habilita las APIs

En Cloud Shell, asegúrate de que tu ID del proyecto 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

Habilita todos los servicios necesarios

gcloud services enable compute.googleapis.com

7. Crea una red de VPC del productor

Red de VPC

Desde Cloud Shell

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

Crea subredes

Desde 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

La subred de PSC se asociará con el adjunto de servicio de PSC para la traducción de direcciones de red. En el caso de los casos de uso de producción, el tamaño de esta subred debe ser el adecuado para admitir la cantidad de tráfico entrante de todos los extremos de PSC adjuntos. Consulta la documentación sobre el tamaño de subred de NAT de PSC para obtener más información.

Crea una política de firewall de red y reglas de firewall

Desde 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 IAP se conecte a tus instancias de VM, crea una regla de firewall que cumpla con lo siguiente:

  • Se aplica a todas las instancias de VM a las que deseas acceder mediante IAP.
  • Permite el tráfico de entrada desde el rango de IP 35.235.240.0/20. Este rango contiene todas las direcciones IP que IAP usa para el reenvío de TCP.

Desde 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

La siguiente regla de firewall permite el tráfico en los puertos TCP del 1000 al 2000 de la subred de PSC a todas las instancias de la red. En un entorno de producción, esta regla de firewall debe limitarse solo a las instancias asociadas con el servicio de productor específico.

Desde 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

La siguiente regla de firewall permite todo el tráfico dentro de la subred de servicios en los puertos TCP del 1000 al 2000. Esta regla se usará para probar que nuestro servicio de productor funcione correctamente.

Desde 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

Crea y configura VMs de productor

Crea VM

Desde 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

En la siguiente sección, inicia el servidor HTTP en los puertos 1000 y 2000 en cada VM de productor.

Configura las VMs

Desde Cloud Shell

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

En Cloud Shell, desde la sesión de 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 &

Abre una nueva ventana de Cloud Shell

Comienza por restablecer las variables. En Cloud Shell, haga lo siguiente:

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

En Cloud Shell, desde la sesión de 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. Servicio de productor de prueba

Primero, debemos obtener las direcciones IP de las instancias de portmap. Anota ambas direcciones IP.

Abre una nueva ventana de Cloud Shell

Comienza por restablecer las variables. En Cloud Shell, haga lo siguiente:

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

Accede a la instancia de prueba. En Cloud Shell, haga lo siguiente:

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

curl [portmap-vm1 IP]:1000

Resultado esperado

portmap-vm1 1000

En Cloud Shell, haga lo siguiente:

curl [portmap-vm1 IP]:2000

Resultado esperado

portmap-vm1 2000

En Cloud Shell, haga lo siguiente:

curl [portmap-vm2 IP]:1000

Resultado esperado

portmap-vm2 1000

En Cloud Shell, haga lo siguiente:

curl [portmap-vm2 IP]:2000

Resultado esperado

portmap-vm2 2000

Sal de test-client-vm

9. Crea un servicio de productor con un NEG de Portmap

Crea componentes del balanceador de cargas

Desde 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

Agrega extremos al NEG de Portmap para crear la asignación del puerto del cliente al puerto del productor. El productor crea esta asignación y tendrá su propio método para comunicar esta información a los consumidores. La asignación de puertos específica no se comparte a través de PSC.

En Cloud Shell, haga lo siguiente:

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

Completa la compilación del balanceador de cargas.

En Cloud Shell, haga lo siguiente:

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

Cómo crear un archivo adjunto de servicio

Desde 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

A continuación, recupera y toma nota del URI del archivo adjunto de servicio para configurar el extremo de PSC en el entorno del consumidor.

En Cloud Shell, haga lo siguiente:

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

Ejemplo 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. Crea una red de VPC de consumidor

Red de VPC

Desde Cloud Shell

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

Crear subred

Desde 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

Crea una política de firewall de red y reglas de firewall

Desde 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

Solo se necesita SSH desde el acceso de IAP para la red del consumidor.

11. Crea una VM, un extremo de PSC y prueba la conectividad

En este punto, debería haber tres ventanas de Cloud Shell abiertas. Se debe tener una sesión abierta con portmap-vm1. Una debe tener una sesión abierta con portmap-vm2 y la otra debe ser la sesión de trabajo.

Crea una VM de prueba.

Desde Cloud Shell

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

Crea un extremo de PSC

Desde 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]

Cómo probar la conectividad

Desde Cloud Shell

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

curl 10.0.0.10:1001

Resultado esperado

portmap-vm1 1000

Desde Cloud Shell

curl 10.0.0.10:1002

Resultado esperado

portmap-vm1 2000

Desde Cloud Shell

curl 10.0.0.10:1003

Resultado esperado

portmap-vm2 1000

Desde Cloud Shell

curl 10.0.0.10:1004

Resultado esperado

portmap-vm2 2000

12. Pasos de limpieza

Sal de la instancia de VM (todas las ventanas)

exit

Borra componentes del lab desde una sola terminal de 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. ¡Felicitaciones!

Felicitaciones por completar el codelab.

Temas abordados

  • Casos de uso de la asignación de puertos de Private Service Connect
  • Beneficios clave de la asignación de puertos de PSC
  • Requisitos de red
  • Crea un servicio de productor de Private Service Connect con la asignación de puertos.
  • Crear un extremo de Private Service Connect
  • Realiza llamadas a través de un extremo de Private Service Connect a un servicio de productor