Private Service Connect: Usa backends de PSC para acceder a un servicio de productor

1. Introducción

Private Service Connect permite que los productores de servicios expongan servicios de forma privada de una red de VPC a otra. Los consumidores pueden acceder a los servicios de productor a través de extremos o backends de PSC.

El enfoque de este codelab son los backend de PSC. Los backends de PSC se usan junto con los balanceadores de cargas de proxy de Google Cloud (ya sea de aplicaciones o de red). El uso de backend de PSC proporciona controles más detallados para el consumidor, como los siguientes:

  • Observabilidad y registro más detallados
  • Integración de Cloud Armor
  • URL personalizadas
  • Administración avanzada del tráfico
  • Certificados TLS personalizados

En este codelab, aprenderás a crear un backend de Private Service Connect con el balanceador de cargas de aplicaciones externo global para acceder de forma privada a un servicio de productor en otra red.

Qué aprenderás

  • Crea y configura un backend de PSC asociado con el balanceador de cargas de aplicaciones externo global
  • Configura un servicio web administrado por Apache y expónlo como un servicio de PSC a través de un adjunto de servicio
  • Crea certificados SSL para finalizar la conexión SSL en balanceadores de cargas de aplicaciones internos y externos
  • Configura una zona pública de Cloud DNS para acceder al servicio de PSC

Requisitos

  • Un proyecto de Google Cloud con permisos de propietario

2. Entorno de pruebas

El entorno que crearás consistirá en una VPC de consumidor y una VPC de productor. En el VPC del productor, implementarás un grupo de instancias administrado a partir de una plantilla de instancias que compila un servicio web de Apache de código abierto. También implementarás una prueba de vm para garantizar la funcionalidad local adecuada del servicio. Exponerás el servicio de Apache como un servicio de productor de PSC a través de un adjunto de servicio

En la VPC de consumidor, implementarás un balanceador de cargas de aplicaciones externo global con un servicio de backend de PSC que apunte al servicio de Apache. Luego, configurarás una zona DNS pública para acceder al servicio de PSC en la Internet pública.

31e7497bf3d9035c.png

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

4. 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-NAME]
export project=YOUR-PROJECT-NAME
export region=us-central1
echo $project
echo $region

Habilita todos los servicios necesarios

gcloud services enable compute.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable dns.googleapis.com

5. Configuración de la VPC del productor

Crear red de VPC

Desde Cloud Shell

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

Crea subredes

Se implementarán dos subredes de propósito general en la VPC de productor. La subred de servicio se usará para implementar las VMs del servicio web de Apache, así como la regla de reenvío del balanceador de cargas. La subred de cliente de prueba estará en una región diferente y se usará para implementar una VM que pruebe el servicio de Apache con el acceso global habilitado.

Desde Cloud Shell

gcloud compute networks subnets create service-subnet \
    --network=producer-vpc \
    --range=10.0.0.0/28 \
    --region=$region

Desde Cloud Shell

gcloud compute networks subnets create test-client-subnet \
    --network=producer-vpc \
    --range=10.0.1.0/28 \
    --region=us-east4

También debemos implementar una subred de solo proxy para usarla con el balanceador de cargas de aplicaciones interno regional.

Desde Cloud Shell

gcloud compute networks subnets create central-proxy-subnet \
    --network=producer-vpc \
    --range=10.100.101.0/24 \
    --region=$region \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE

Cuando se implementa un servicio de PSC, cada servicio único necesita una subred de NAT de PSC correspondiente para asociarse con el adjunto de servicio. El tamaño de esta subred debe ser el adecuado según la cantidad de extremos conectados esperados.

Desde Cloud Shell

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

Crea Cloud NAT

Se requiere una Cloud NAT para instalar los paquetes adecuados para nuestros servicios de productor.

Desde Cloud Shell

gcloud compute routers create central-cr \
    --network=producer-vpc \
    --region=$region

Desde Cloud Shell

gcloud compute routers nats create central-nat \
    --router=central-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

Crea políticas y reglas de firewall de red

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

Se necesitarán dos reglas de firewall adicionales para permitir el tráfico de entrada a los backends del balanceador de cargas que provengan de la subred de solo proxy del balanceador de cargas (2000), así como una regla para permitir las verificaciones de estado del balanceador de cargas en las instancias de backend (2001).

Desde Cloud Shell

gcloud compute network-firewall-policies rules create 2000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow traffic from load balancer proxy subnet" \
    --direction INGRESS \
    --src-ip-ranges 10.100.101.0/24 \
    --layer4-configs tcp:443 \
    --global-firewall-policy


gcloud compute network-firewall-policies rules create 2001 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow load balancer health checks" \
    --direction INGRESS \
    --src-ip-ranges 130.211.0.0/22,35.191.0.0/16 \
    --layer4-configs tcp:443 \
    --global-firewall-policy

6. Crea un servicio web de Apache

Crearemos un servicio web Apache simple que muestre "Servicio de PSC".

Crea una plantilla de instancias

Desde Cloud Shell

gcloud compute instance-templates create apache-service-template \
    --network producer-vpc \
    --subnet service-subnet \
    --region $region \
    --no-address \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "PSC Service" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

Crea una verificación de estado para el MIG

Desde Cloud Shell

gcloud compute health-checks create https service-mig-healthcheck \
    --port=443 \
    --global

Crea un grupo de instancias administrado

Desde Cloud Shell

gcloud compute instance-groups managed create psc-service-mig \
    --region $region \
    --size=2 \
    --template=apache-service-template \
    --health-check=service-mig-healthcheck

gcloud compute instance-groups managed set-named-ports psc-service-mig \
    --named-ports=https:443 \
    --region=$region

7. Crea un certificado autofirmado

Completa el paso 1 de las instrucciones aquí para crear un certificado autofirmado. Puedes ejecutar todos los comandos en Cloud Shell. Regresa a esta página cuando completes el paso 1. TU NOMBRE COMÚN DEBE CONFIGURARSE CON EXAMPLE.COM.

Crea un recurso de certificado para asociarlo con tu balanceador de cargas. Reemplaza los parámetros de certificado y clave privada por los nombres de archivo específicos.

Desde Cloud Shell

gcloud compute ssl-certificates create producer-service-cert \
    --certificate=<your-producer-certfile.cert> \
    --private-key=<your-producer-keyfile.pem> \
    --region=$region

8. Crea el balanceador de cargas de aplicaciones interno regional

A continuación, crearemos los componentes del balanceador de cargas para el servicio. Usamos el balanceador de cargas de aplicaciones interno regional, pero puedes usar cualquier balanceador de cargas interno de Google Cloud. Sigue la documentación del balanceador de cargas correspondiente para el manejo de TLS.

Crea la dirección IP interna que se usará para la regla de reenvío de tu balanceador de cargas y toma nota de la IP que se usará más adelante cuando realices una llamada de prueba al servicio.

Desde Cloud Shell

gcloud compute addresses create apache-service-ip \
 --region=$region \
 --subnet=service-subnet

gcloud compute addresses describe apache-service-ip \
   --format="get(address)" \
   --region=$region

Crea la verificación de estado del balanceador de cargas.

Desde Cloud Shell

gcloud compute health-checks create https lb-apache-service-hc \
    --region=$region \
    --port-name=https

Crea el servicio de backend.

Desde Cloud Shell

gcloud compute backend-services create apache-bes\
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTPS \
  --port-name=https \
  --health-checks=lb-apache-service-hc \
  --health-checks-region=$region \
  --region=$region


gcloud compute backend-services add-backend apache-bes \
  --balancing-mode=UTILIZATION \
  --instance-group=psc-service-mig \
  --region=$region

Crea el mapa de URL.

Desde Cloud Shell

gcloud compute url-maps create producer-url-map \
  --default-service=apache-bes \
  --region=$region

Crea los proxies HTTPS de destino.

Desde Cloud Shell

gcloud compute target-https-proxies create https-proxy \
  --url-map=producer-url-map \
  --region=$region \
  --ssl-certificates=producer-service-cert

Crea la regla de reenvío.

Desde Cloud Shell

gcloud compute forwarding-rules create apache-fr \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=producer-vpc \
  --subnet=service-subnet \
  --address=apache-service-ip \
  --ports=443 \
  --region=$region \
  --target-https-proxy=https-proxy \
  --target-https-proxy-region=$region \
  --allow-global-access

9. Crea una VM de prueba y prueba el servicio de forma local

Antes de crear el adjunto de servicio, crearemos una VM de cliente de prueba en una región diferente para probar que el balanceador de cargas esté configurado correctamente con el acceso global y TLS.

Desde Cloud Shell

gcloud compute instances create vm-client \
    --zone=us-east4-a \
    --subnet=test-client-subnet \
    --no-address

Espera alrededor de un minuto para que se complete el aprovisionamiento y, luego, usa SSH para acceder a la instancia.

Desde Cloud Shell

gcloud compute ssh \
    --zone "us-east4-a" "vm-client" \
    --tunnel-through-iap \
    --project $project

Para probar el servicio de Apache, conéctate a través del puerto 443 mediante el balanceador de cargas. La dirección IP interna es la que reservaste y anotaste antes.

curl https://example.com:443 -k --connect-to example.com:443:<YOUR-INTERNAL-IP>:443

RESULTADO ESPERADO

PSC Service

Sal de la VM.

Desde vm-client

exit

10. Crea el adjunto del servicio

En este ejemplo, configuramos nuestro adjunto de servicio para permitir solo conexiones de PSC desde este proyecto. Se puede configurar para aceptar uno o más proyectos o redes específicos, pero no ambos. Establecimos el límite máximo de conexiones en 5. Cada proyecto o red debe tener un límite establecido.

Desde Cloud Shell

gcloud compute service-attachments create apache-service-attachment \
    --region=$region \
    --producer-forwarding-rule=apache-fr \
    --connection-preference=ACCEPT_MANUAL \
    --consumer-accept-list=$project=5 \
    --nat-subnets=psc-nat-subnet

Debes anotar el URI de archivo adjunto del servicio (selfLink), ya que lo necesitarás en el siguiente paso para la configuración del backend de PSC. Para obtenerlo, ejecuta lo siguiente en Cloud Shell.

Desde Cloud Shell

gcloud compute service-attachments describe apache-service-attachment \
    --region $region

Copia el URI a partir de projects.

Ejemplo: projects/$project/regions/$region/serviceAttachments/apache-service-attachment

11. Configuración de la VPC del consumidor

Crea una red de VPC

Desde Cloud Shell

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

Crear subred

Se necesita una subred en el lado del consumidor en la que se implementará el grupo de extremos de red (NEG) de Private Service Connect.

Desde Cloud Shell

gcloud compute networks subnets create consumer-subnet \
    --network=consumer-vpc \
    --region=$region \
    --range=10.0.0.0/28

12. Reserva una IP externa y crea un certificado autofirmado del lado del consumidor

IP externa

Crea la dirección IP estática externa que se usará más adelante para nuestra regla de reenvío del balanceador de cargas y captura la dirección IP en una variable de Cloud Shell.

Desde Cloud Shell

gcloud compute addresses create external-psc-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

export externalip=$(gcloud compute addresses describe external-psc-ip \
    --format="get(address)" \
    --global)

echo $externalip

Certificado autofirmado del consumidor

Por segunda vez, completa el paso 1 de las instrucciones aquí para crear un certificado autofirmado. Puedes ejecutar todos los comandos en Cloud Shell. Regresa a esta página cuando completes el paso 1. Usaremos un servicio de DNS comodín público de código abierto llamado nip.io en lugar de tener nuestra propia zona de DNS pública. La URL pública de tu servicio de PSC usará la dirección IP externa que acabas de configurar. TU NOMBRE COMÚN DEBE CONFIGURARSE CON <YOUR-EXTERNAL-IP.nip.io>

Crea un recurso de certificado para asociarlo con tu balanceador de cargas externo. Reemplaza los parámetros de certificado y clave privada por los nombres de archivo específicos.

Desde Cloud Shell

gcloud compute ssl-certificates create consumer-service-cert \
    --certificate=<your-consumer-certfile.cert> \
    --private-key=<your-consumer-keyfile.pem> \
    --global

13. Crea los componentes del balanceador de cargas

Crearemos un balanceador de cargas de aplicaciones externo global con un NEG de PSC que apunte a nuestro archivo adjunto de servicio recién creado como servicio de backend.

Ten a mano el URI del archivo adjunto de servicio que anotaste en el último paso. Reemplaza psc-target-service a continuación por tu URI.

Desde Cloud Shell

gcloud compute network-endpoint-groups create apache-psc-neg \
--network-endpoint-type=private-service-connect \
--psc-target-service=projects/$project/regions/$region/serviceAttachments/apache-service-attachment \
--region=$region \
--network=consumer-vpc \
--subnet=consumer-subnet

Crea el servicio de backend.

Desde Cloud Shell

gcloud compute backend-services create apache-pscneg-bes \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTPS \
    --global

gcloud compute backend-services add-backend apache-pscneg-bes \
    --network-endpoint-group=apache-psc-neg \
    --network-endpoint-group-region=$region \
    --global

Crea el mapa de URL

Desde Cloud Shell

gcloud compute url-maps create consumer-url-map \
    --default-service=apache-pscneg-bes \
    --global

Crea los proxies HTTPS de destino.

Desde Cloud Shell

gcloud compute target-https-proxies create psc-https-proxy \
    --url-map=consumer-url-map \
    --ssl-certificates=consumer-service-cert

Crea la regla de reenvío

Desde Cloud Shell

gcloud compute forwarding-rules create external-fr \
  --load-balancing-scheme=EXTERNAL_MANAGED \
  --network-tier=PREMIUM \
  --address=external-psc-ip \
  --global \
  --target-https-proxy=psc-https-proxy \
  --ports=443

14. Crea una zona del DNS pública

Desde Cloud Shell

gcloud dns managed-zones create "psc-service" \
    --dns-name=$externalip.nip.io. \
    --description="public dns for psc service" \
    --visibility=public

Desde Cloud Shell

gcloud dns record-sets transaction start \
   --zone="psc-service"

gcloud dns record-sets transaction add $externalip \
   --name=$externalip.nip.io \
   --ttl=300 \
   --type=A \
   --zone="psc-service"

gcloud dns record-sets transaction execute \
   --zone="psc-service"

15. Prueba la conexión del PSC del consumidor

Espera entre 7 y 10 minutos antes de realizar la prueba para permitir que se propague el DNS público.

Desde Cloud Shell

curl https://$externalip.nip.io -k

También puedes realizar pruebas desde tu navegador. Para ello, ingresa https://<TU-IP-EXTERNA>.nip.io en el navegador o la terminal de escritorio.

RESULTADO ESPERADO

PSC Service

16. Pasos de limpieza

Borra componentes del lab desde una sola terminal de Cloud Shell

gcloud dns record-sets delete $externalip.nip.io --zone="psc-service" --type=A -q

gcloud dns managed-zones delete "psc-service" -q

gcloud compute forwarding-rules delete external-fr --global -q 

gcloud compute target-https-proxies delete psc-https-proxy -q

gcloud compute url-maps delete consumer-url-map --global -q

gcloud compute backend-services delete apache-pscneg-bes --global -q

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

gcloud compute ssl-certificates delete consumer-service-cert --global -q

gcloud compute addresses delete external-psc-ip --global -q

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

gcloud compute networks delete consumer-vpc -q

gcloud compute instances delete vm-client --zone=us-east4-a -q

gcloud compute service-attachments delete apache-service-attachment --region $region -q

gcloud compute forwarding-rules delete apache-fr --region $region -q

gcloud compute target-https-proxies delete https-proxy --region $region -q

gcloud compute url-maps delete producer-url-map --region $region -q

gcloud compute backend-services delete apache-bes --region $region -q

gcloud compute health-checks delete lb-apache-service-hc --region $region -q

gcloud compute addresses delete apache-service-ip --region $region -q

gcloud compute ssl-certificates delete producer-service-cert --region $region -q

gcloud compute instance-groups managed delete psc-service-mig --region $region -q

gcloud compute health-checks delete service-mig-healthcheck --global -q

gcloud compute instance-templates delete apache-service-template -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 routers nats delete central-nat --router=central-cr --region $region -q

gcloud compute routers delete central-cr --region $region -q

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

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

gcloud compute networks subnets delete test-client-subnet --region us-east4 -q 

gcloud compute networks subnets delete central-proxy-subnet --region $region -q

gcloud compute networks delete producer-vpc -q

17. ¡Felicitaciones!

Felicitaciones por completar el codelab.

Temas abordados

  • Crea y configura un backend de PSC asociado con el balanceador de cargas de aplicaciones externo global
  • Configura un servicio web administrado por Apache y expónlo como un servicio de PSC a través de un adjunto de servicio
  • Crea certificados SSL para finalizar la conexión SSL en balanceadores de cargas de aplicaciones internos y externos
  • Configura una zona pública de Cloud DNS para acceder al servicio de PSC