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
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
- 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.
- 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.
- 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:
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:
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