Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Acceso privado a servicios en redes superpuestas en GCP

By Chimbu ChinnaduraiMay 16, 20235 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

En Google Cloud Platform (GCP), cada nuevo proyecto arranca con una red VPC por defecto al habilitar la API de Compute Engine, salvo que la deshabilites.

Esto simplifica el uso de GCP, ya que no hace falta crear una VPC personalizada ni subredes. El problema con la red por defecto es que todas las subredes que se crean automáticamente usan un conjunto de rangos IPv4 predefinidos que entran dentro del bloque CIDR 10.128.0.0/9.

La comunicación interna privada entre proyectos no se permite por la superposición de redes. Esta limitación aplica tanto a VPC Peering como a Cloud VPN.

En este blog te mostramos cómo usar Private Service Connect para acceder de forma privada a servicios que corren en clusters de VM/GKE con redes superpuestas. Esto aplica a redes superpuestas dentro de la misma organización de GCP o en organizaciones distintas.

Arquitectura de referencia

Configuración objetivo de Private Service Connect

El Proyecto B es el proyecto productor del servicio y tiene un servicio nginx de muestra desplegado en una instancia de un grupo de instancias administrado.

El Proyecto A es el proyecto consumidor y necesita acceder de forma privada al servicio del Proyecto B. Las instancias en ambos proyectos no tienen asignada ninguna IP externa.

  • La región de GCP para los recursos es us-west4
  • La API compute.googleapis.com está habilitada en el Proyecto A y en el Proyecto B
  • Cloud NAT para que las instancias privadas tengan acceso a internet y descarguen paquetes

Desplegar el servicio de muestra y la instancia de prueba

Actualiza las variables en los comandos que aparecen a continuación.

  • Crea una plantilla de instancia en el Proyecto B.
gcloud compute instance-templates create nginx-service-instance-template \
--machine-type=e2-medium \
--network-interface=network=default,no-address \
--metadata=startup-script=\ \#\!\ /bin/bash$'\n'yum\ install\ epel-release$'\n'yum\ -y\ install\ nginx$'\n'systemctl\ start\ nginx \
--maintenance-policy=MIGRATE \
--provisioning-model=STANDARD \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--create-disk=auto-delete=yes,boot=yes,device-name=nginx-service-instance-template,image=projects/centos-cloud/global/images/centos-7-v20230411,mode=rw,size=20,type=pd-balanced \
--no-shielded-secure-boot \
--shielded-vtpm \
--shielded-integrity-monitoring \
--reservation-affinity=any \
--project=$PROJECT_B

  • Crea un grupo de instancias administrado en el Proyecto B.
gcloud beta compute instance-groups managed create nginx-service-instance-group \
--base-instance-name=nginx-service \
--size=1 \
--template=nginx-service-instance-template \
--zone=us-west4-a \
--list-managed-instances-results=PAGELESS \
--no-force-update-on-repair \
--project=$PROJECT_B

Una vez creado correctamente, el grupo de instancias administrado lanza una instancia en la zona objetivo.

Conéctate por SSH a la instancia y verifica el estado del servicio nginx.

  • Crea una instancia de prueba de conectividad en el Proyecto A.
gcloud compute instances create instance-1 \
    --zone=us-west4-b \
    --machine-type=e2-medium \
    --network-interface=stack-type=IPV4_ONLY,subnet=default,no-address \
    --maintenance-policy=MIGRATE \
    --provisioning-model=STANDARD \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --create-disk=auto-delete=yes,boot=yes,device-name=instance-2,image=projects/centos-cloud/global/images/centos-7-v20230411,mode=rw,size=20,type=projects/project-a-385206/zones/us-west4-b/diskTypes/pd-balanced \
    --no-shielded-secure-boot \
    --shielded-vtpm \
    --shielded-integrity-monitoring \
    --labels=ec-src=vm_add-gcloud \
    --reservation-affinity=any \
    --project=$PROJECT_A

Las redes del Proyecto A y del Proyecto B no tienen conectividad interna entre sí, por lo que la instancia del Proyecto A no puede acceder al servicio que corre en el Proyecto B.

El VPC Peering tampoco está permitido, ya que los rangos en la red por defecto se superponen.

Configurar el balanceador de carga interno

Para que Private Service Connect exponga el servicio mediante un service attachment se requiere un balanceador de carga interno. Para esta configuración crearemos un balanceador de carga TCP interno en el Proyecto B.

  • Crea una nueva verificación de estado HTTP regional para probar la conectividad HTTP a las VMs en el puerto 80.
gcloud compute health-checks create http nginx-service-health-check \
    --region=us-west4 \
    --port=80 \
    --project=$PROJECT_B
  • Crea el backend service para el tráfico HTTP.
gcloud compute backend-services create nginx-service-internal-lb-backend \
    --load-balancing-scheme=internal \
    --protocol=tcp \
    --region=us-west4 \
    --health-checks=nginx-service-health-check \
    --health-checks-region=us-west4 \
    --project=$PROJECT_B
  • Agrega el grupo de instancias del servicio nginx al backend service.
gcloud compute backend-services add-backend nginx-service-internal-lb-backend \
    --region=us-west4 \
    --instance-group=nginx-service-instance-group \
    --instance-group-zone=us-west4-a \
    --project=$PROJECT_B
  • Crea una regla de reenvío para el backend service.
gcloud compute forwarding-rules create nginx-service-internal-fr \
    --region=us-west4 \
    --load-balancing-scheme=internal \
    --network=default \
    --subnet=default \
    --ip-protocol=TCP \
    --ports=80 \
    --backend-service=nginx-service-internal-lb-backend \
    --backend-service-region=us-west4 \
    --project=$PROJECT_B
  • Configura una regla de firewall que permita las verificaciones de estado del balanceador de carga.
gcloud compute firewall-rules create allow-internal-lb-health-check \
--direction=INGRESS \
--priority=1000 \
--network=default \
--action=ALLOW \
--rules=tcp:80 \
--source-ranges=35.191.0.0/16,130.211.0.0/22
--project=$PROJECT_B

Publicar servicios en el proyecto productor

Publica el servicio en el Proyecto B (el proyecto productor) para que los consumidores en otras redes VPC se puedan conectar de forma privada y accedan al servicio de manera segura.

  • Reserva una subred para Private Service Connect. Su rango no debe superponerse con la red por defecto.
gcloud compute networks subnets create private-service-connect \
--network default \
--region us-west4 \
--range 10.0.1.0/24 \
--purpose=PRIVATE_SERVICE_CONNECT \
--project=$PROJECT_B
  • Publica el servicio nginx hacia el Proyecto A con aprobación explícita del proyecto.
gcloud compute service-attachments create nginx-service \
    --region=us-west4 \
    --producer-forwarding-rule=nginx-service-internal-fr  \
    --connection-preference=ACCEPT_MANUAL \
    --nat-subnets=private-service-connect \
    --consumer-accept-list=$PROJECT_A=10 \
    --project=$PROJECT_B

Puedes controlar la lista de consumidores que pueden acceder a los servicios publicados, ya sea con aprobación automática o manual. Consulta Publish services by using Private Service Connect.

  • Configura una regla de firewall que permita a Private Service Connect acceder a las instancias de destino.
gcloud compute firewall-rules create allow-private-service-connect \
--direction=INGRESS \
--priority=1000 \
--network=default \
--action=ALLOW \
--rules=tcp:80 \
--source-ranges=10.0.1.0/24
--project=$PROJECT_B

Configurar el endpoint en el proyecto consumidor

Un endpoint en el proyecto consumidor se conecta a los servicios de la red VPC del productor mediante una regla de reenvío de Private Service Connect.

Cuando creas un endpoint, este se registra automáticamente en Service Directory, ya sea con el namespace que elijas o con el namespace por defecto, goog-psc-default.

Para que el endpoint esté disponible desde más de una región, activa el acceso global. El acceso global está en Preview.

  • Reserva una dirección IP interna para asignársela al endpoint.
gcloud compute addresses create private-service-connect-endpoint \
    --region=us-west4 \
    --subnet=default \
    --project=$PROJECT_A
  • Crea una regla de reenvío para conectar el endpoint con el service attachment del Proyecto B.
PSC_SERVICE_ATTACHMENT=$(gcloud compute service-attachments describe nginx-service \
   --region=us-west4 \
   --project=$PROJECT_B \
   --format="value(selfLink.scope(projects))")

gcloud compute forwarding-rules create nginx-service \
  --region=us-west4 \
  --network=default \
  --address=private-service-connect-endpoint \
  --target-service-attachment="projects/$PSC_SERVICE_ATTACHMENT" \
  --project=$PROJECT_A

Probar la conectividad desde el proyecto consumidor

Los componentes de Private Service Connect ya están configurados en el Proyecto A y en el Proyecto B. Usa la IP del endpoint del Proyecto A para acceder al servicio nginx del Proyecto B.

La prueba confirma que las instancias en redes superpuestas pueden comunicarse de forma privada a través del endpoint de Private Service Connect.

Este ejemplo muestra cómo aprovechar Private Service Connect para publicar y consumir servicios de forma segura en redes superpuestas.

El tráfico se mantiene en todo momento dentro de Google Cloud, lo que brinda un acceso orientado a servicios entre consumidores y productores con un control granular sobre cómo se accede a ellos.

Conoce más sobre Private Service Connect en la página del producto.