Private Service Connect: Usa los Controles del servicio de HTTP(S) del consumidor para el XLB global a los servicios administrados

1. Introducción

Private Service Connect permite que un productor de servicios ofrezca servicios a un consumidor de servicios. Una red de VPC del productor de servicios puede admitir varios consumidores de servicios.

Existen dos tipos de extremos de Private Service Connect que se pueden conectar a un servicio publicado:

  • Extremo de Private Service Connect (basado en una regla de reenvío)

Con este tipo de extremo, los consumidores se conectan a una dirección IP interna que definan. Private Service Connect realiza la traducción de direcciones de red (NAT) para enrutar la solicitud al productor de servicios.

  • Extremo de Private Service Connect con controles de servicios HTTP(S) de consumidor (basado en un balanceador de cargas HTTP(S) externo global)

Con este tipo de extremo, los consumidores se conectan a una dirección IP externa. Private Service Connect usa un grupo de extremos de red para enrutar la solicitud al productor de servicios.

El uso de un balanceador de cargas HTTP(S) externo global como punto de aplicación de políticas tiene los siguientes beneficios:

  • Puedes cambiar el nombre de los servicios y asignarlos a las URL que elijas.
  • Puedes configurar el balanceador de cargas para registrar todas las solicitudes en Cloud Logging.
  • Puedes usar certificados TLS administrados por el cliente. o certificados administrados por Google.

En este codelab, aprenderás a crear controles de servicio HTTP(S) de consumidor de extremo de Private Service Connect con el XLB global para acceder de forma privada a un servicio en otra red. Este patrón de PSC se puede hacer con uno o varios proyectos. A los fines de este lab, usaremos un solo proyecto con dos VPC independientes.

Qué aprenderás

  • Crea un extremo de Private Service Connect con Controles del servicio de HTTP(S) del consumidor a través del XLB global
  • Configurar un servicio administrado para que se exponga a través de un adjunto de servicio y poder aceptar conexiones L7 XLB.
  • Crea un certificado SSL y configura un servidor web Apache para que finalice TLS y acepte el tráfico en el puerto 443.
  • Crea un NEG de PSC.

Requisitos

  • Un proyecto de Google Cloud
  • Conocimiento sobre la implementación de instancias y la configuración de componentes de redes

2. Entorno de pruebas

El entorno que crearás constará de un balanceador de cargas de HTTP(S) externo y un NEG de PSC en una VPC de consumidor. La VPC del productor alojará un servicio web Apache simple configurado con HTTPS. Crearás un servicio de backend a partir del servicio web Apache y usarás un balanceador de cargas TCP interno configurado con un adjunto de servicio de PSC para usarlo.

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una string de caracteres que no se utiliza en las API de Google y se puede actualizar en cualquier momento.
  • El ID del proyecto debe ser único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). Cloud Console genera automáticamente una string única, que, por lo general, no importa cuál sea. En la mayoría de los codelabs, debes hacer referencia al ID del proyecto (suele ser PROJECT_ID). Por lo tanto, si no te gusta, genera otro aleatorio o prueba con uno propio y comprueba si está disponible. Después de crear el proyecto, este ID se “congela” y no se puede cambiar.
  • Además, hay un tercer valor, el Número de proyecto, que usan algunas API. 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 Cloud Console para usar las API o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Si quieres cerrar los recursos para no se te facture más allá de este instructivo, sigue las instrucciones de “limpieza” que se encuentran al final del codelab. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 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. Puedes realizar todo tu trabajo en este lab usando simplemente un navegador.

4. Antes de comenzar

Habilita las APIs

En Cloud Shell, asegúrate de que el 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

5. Configuración de VPC del productor, subred y reglas de firewall

Red de VPC

Desde Cloud Shell

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

Crea subredes

Se necesita una subred en el lado del productor para realizar la traducción de direcciones de red (NAT) de PSC. Ten en cuenta que el propósito es PRIVATE_SERVICE_CONNECT. Esto significa que esta subred no se puede usar para implementar cargas de trabajo.

Desde Cloud Shell

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

Implementaremos dos subredes en la VPC del productor. El primero en implementar el servicio de productor y otro adicional en otra región para implementar una client-vm a fin de probar la conectividad al servicio a través del Acceso global en el balanceador de cargas interno de TCP.

Desde Cloud Shell

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

Desde Cloud Shell

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

Crea Cloud NAT

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

Desde Cloud Shell

gcloud compute routers create service-cr \
--region=$region --network=producer-vpc \
--asn=65501

Desde Cloud Shell

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

Crea reglas de firewall

En este lab, usarás IAP para conectarte a las instancias que crees. La siguiente regla de firewall te permitirá conectarte a instancias a través de IAP. Si prefieres no usar IAP, puedes omitir este paso y, en su lugar, agregar direcciones IP públicas en la instancia y crear una regla de firewall que permita la entrada al puerto TCP 22 desde 0.0.0.0/0.

Para permitir que IAP se conecte a tus instancias de VM, crea una regla de firewall que haga lo siguiente:

  • Se aplica a todas las instancias de VM a las que deseas que se pueda acceder mediante IAP.
  • Permite el tráfico de entrada del 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 firewall-rules create allow-ssh-iap \
    --network producer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20

El tráfico de clientes se originará en el balanceador de cargas HTTP(S) externo global, por lo que se debe crear una regla de firewall para permitir este tráfico a los servidores de destino etiquetados que alojarán nuestro servicio web. También abriremos la regla de firewall desde nuestra client-subnet con fines de prueba.

Desde Cloud Shell

gcloud compute firewall-rules create allow-xlb-client \
  --network=producer-vpc \
  --direction=ingress \
  --allow=tcp:443 \
  --target-tags=psc-service \
  --source-ranges=130.211.0.0/22,35.191.0.0/16,10.0.1.0/24

Crea un servicio web de Apache

Crearemos un servicio web Apache simple que muestre el mensaje "PSC Service"

Crea una plantilla de instancias

Desde Cloud Shell

gcloud compute instance-templates create producer-service-template \
    --network producer-vpc \
    --subnet service-subnet \
    --region $region \
    --no-address \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=psc-service \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    echo "PSC Service" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

Crear verificación de estado para MIG

Desde Cloud Shell

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

Crear un grupo de instancias administrado

Desde Cloud Shell

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

Configura SSL en los servidores web Apache

A continuación, deberemos configurar SSL en cada uno de los servidores web Apache. Para ello, generaremos un certificado y lo agregaremos a la configuración de Apache.

La terminación SSL debe configurarse en los servicios de backend, ya que el servicio debe estar en frente de un balanceador de cargas TCP/UDP (L4) interno para este patrón de PSC particular. El balanceador de cargas TCP/UDP interno no finaliza SSL en la capa del balanceador de cargas.

Para comenzar, establece una conexión SSH a la primera VM de tu MIG. La zona y el nombre de la VM se asignarán de forma dinámica por entorno. En la consola, ve a Compute Engine > Instancias de VM para encontrar el nombre y la zona de tus instancias.

Desde Cloud Shell

gcloud compute ssh --zone "<YOUR_VM_ZONE>" "<YOUR_MIG_VM_1>"  --tunnel-through-iap --project $project

A continuación, crearemos el certificado a través de OpenSSL. Se te pedirá que completes información sobre tu país, estado, localidad, organización, nombre de la unidad organizativa, nombre común y dirección de correo electrónico. La única información que debes completar debe ser el Common Name, que debe ser un FQDN interno de tu elección. A los fines de este lab, deberás elegir example.com.

Desde Cloud Shell

sudo openssl genrsa -out private-key-file.pem 2048

Desde Cloud Shell

cat <<'EOF' >config.txt
[req]
default_bits              = 2048
req_extensions            = extension_requirements
distinguished_name        = dn_requirements

[extension_requirements]
basicConstraints          = CA:FALSE
keyUsage                  = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName            = @sans_list

[dn_requirements]
countryName               = Country Name (2 letter code)
stateOrProvinceName       = State or Province Name (full name)
localityName              = Locality Name (eg, city)
0.organizationName        = Organization Name (eg, company)
organizationalUnitName    = Organizational Unit Name (eg, section)
commonName                = Common Name (e.g. server FQDN or YOUR name)
emailAddress              = Email Address

[sans_list]
DNS.1                     = example.com

EOF

Desde Cloud Shell

sudo openssl req -new -key private-key-file.pem \
    -out csr.pem \
    -config config.txt

Desde Cloud Shell

sudo openssl x509 -req \
    -signkey private-key-file.pem \
    -in csr.pem \
    -out cert.cert \
    -extfile config.txt \
    -extensions extension_requirements \
    -days 10

Ahora actualicemos la información de configuración de Apache con los detalles de nuestro nuevo certificado.

sudo vi /etc/apache2/sites-enabled/default-ssl.conf

Agregar una línea debajo de ServerAdmin que lea

ServerName example.com

Actualiza SSLCertificateFile y SSLCertificateKeyFile la ubicación del archivo cert.cert y las ubicaciones private-key-file.pem en la VM. A continuación, se muestra un ejemplo. Asegúrate de actualizar <profile> por el nombre de tu directorio.

SSLCertificateFile  /home/<profile>/cert.cert

SSLCertificateKeyFile /home/<profile>/private-key-file.pem

Cierra el editor y reinicia Apache.

sudo a2enmod ssl
sudo systemctl restart apache2

Salir de la instancia y repetir los mismos pasos en la otra instancia del grupo de instancias administrado

6. Crea el servicio de productor

A continuación, crearemos los componentes del balanceador de cargas para el servicio.

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

Desde Cloud Shell

gcloud compute health-checks create https service-lb-healthcheck \
    --port=443 \
    --region=$region

Crea el servicio de backend.

Desde Cloud Shell

 gcloud compute backend-services create psc-backend-service \
    --load-balancing-scheme=internal \
    --protocol=TCP \
    --region=$region \
    --health-checks=service-lb-healthcheck \
    --health-checks-region=$region

gcloud compute backend-services add-backend psc-backend-service \
--region=$region \
--instance-group=psc-service-mig

Crea la regla de reenvío. Ten en cuenta que la regla de reenvío debe configurarse en el puerto 443 y con Acceso global. Esto es necesario para que funcione este patrón de PSC.

Desde Cloud Shell

 gcloud compute forwarding-rules create producer-fr \
    --region=$region \
    --load-balancing-scheme=internal \
    --network=producer-vpc \
    --subnet=service-subnet \
    --address=10.0.0.100 \
    --ip-protocol=TCP \
    --ports=443 \
    --backend-service=psc-backend-service \
    --backend-service-region=$region \
    --allow-global-access

7. Prueba el Service

Antes de crear el adjunto de servicio, crearemos un cliente en una región diferente para probar el balanceador de cargas configurado con Acceso global, así como el servicio Apache configurado para finalizar TLS.

Desde Cloud Shell

gcloud compute instances create vm-client \
    --zone=us-east4-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --subnet=client-subnet \
    --no-address

Establecer una conexión SSH a la instancia

Desde Cloud Shell

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

Probar el servicio Apache conectándote a través de 443 a través del balanceador de cargas

curl https://example.com:443 -k --connect-to example.com:443:10.0.0.100:443

RESULTADO ESPERADO

PSC Service

8. Crea el adjunto de servicio

Desde Cloud Shell

gcloud compute service-attachments create pscservice \
    --region=$region \
    --producer-forwarding-rule=producer-fr \
    --connection-preference=ACCEPT-AUTOMATIC \
    --nat-subnets=producer-nat-subnet

Debes anotar el URI del adjunto de servicio, ya que lo necesitarás en el siguiente paso para la configuración del extremo. Para obtenerlo, ejecuta el siguiente comando en Cloud Shell.

Desde Cloud Shell

gcloud compute service-attachments describe pscservice --region $region

Copia el URI desde /projects

Ejemplo: /projects/<ID_del_proyecto>/regions/us-central1/serviceAttachments/pscservice

9. Configuración de la VPC del consumidor y la subred

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 donde se implementará el grupo de extremos de red (NEG) de Private Service Connect.

Desde Cloud Shell

gcloud compute networks subnets create psc-neg-subnet \
--network=consumer-vpc \
--region=$region \
--range=10.100.200.0/24 \
--purpose=private

10. Crea el extremo de Private Service Connect y prueba la conexión

Seguiremos el proceso para crear un NEG de PSC que se asociará con el adjunto de servicio que acabamos de crear, conectaremos el NEG de PSC a un servicio de backend y asociaremos el servicio de backend con una regla de reenvío.

Ten a mano el URI del adjunto de servicio que anotamos en el paso anterior. Reemplaza la siguiente URL por tu URI.

Desde Cloud Shell

gcloud beta compute network-endpoint-groups create xlb-psc-neg \
--network-endpoint-type=private-service-connect \
--psc-target-service=projects/<PROJECT-ID>/regions/us-central1/serviceAttachments/pscservice \
--region=$region \
--network=consumer-vpc \
--subnet=psc-neg-subnet

Crea la dirección IP pública de XLB y recopila la dirección IP real asignada para pruebas posteriores.

Desde Cloud Shell

gcloud compute addresses create xlb-psc-address \
--ip-version=IPv4 --global

gcloud compute addresses describe xlb-psc-address --format="get(address)" --global

A continuación, crearemos el extremo de PSC, que en este caso, en un balanceador de cargas externo.

Desde Cloud Shell

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

Desde Cloud Shell

gcloud beta compute backend-services add-backend pscneg-backend-service \
--network-endpoint-group=xlb-psc-neg \
--network-endpoint-group-region=$region \
--global

Desde Cloud Shell

gcloud beta compute url-maps create xlb-psc-map \
--default-service=pscneg-backend-service \
--global

Desde Cloud Shell

gcloud beta compute target-http-proxies create psc-http-proxy \
--url-map=xlb-psc-map

Desde Cloud Shell

gcloud beta compute forwarding-rules create xlb-psc-fr \
--load-balancing-scheme=EXTERNAL_MANAGED \
--network-tier=PREMIUM \
--address=xlb-psc-address \
--target-http-proxy=psc-http-proxy \
--ports=80 \
--global

Espera entre 5 y 7 minutos y, luego, ingresa la dirección IP asociada con xlb-psc-address en la barra de direcciones del navegador.

Si se trata de "Servicio de PDC" si configuraste correctamente la solución.

11. Pasos de limpieza

Borra los componentes del lab desde una sola terminal de Cloud Shell

gcloud beta compute forwarding-rules delete xlb-psc-fr --global --quiet

gcloud beta compute target-http-proxies delete psc-http-proxy --quiet

gcloud beta compute url-maps delete xlb-psc-map --global --quiet

gcloud beta compute backend-services delete pscneg-backend-service --global --quiet

gcloud compute addresses delete xlb-psc-address --global --quiet

gcloud beta compute network-endpoint-groups delete xlb-psc-neg --region $region --quiet

gcloud compute networks subnets delete psc-neg-subnet --region $region --quiet

gcloud compute networks delete consumer-vpc --quiet

gcloud compute service-attachments delete pscservice --region $region --quiet

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

gcloud compute forwarding-rules delete producer-fr --region $region --quiet

gcloud compute backend-services delete psc-backend-service --region $region --quiet

gcloud compute health-checks delete service-lb-healthcheck --region $region --quiet

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

gcloud compute health-checks delete psc-service-mig-healthcheck --region $region --quiet

gcloud compute instance-templates delete producer-service-template --quiet

gcloud compute firewall-rules delete allow-xlb-client --quiet

gcloud compute firewall-rules delete allow-ssh-iap --quiet

gcloud compute routers nats delete service-nat-gw –router service-cr --region $region --quiet

gcloud compute routers delete service-cr --region $region --quiet

gcloud compute networks subnets delete client-subnet --quiet

gcloud compute networks subnets delete service-subnet --quiet

gcloud compute networks subnets delete producer-nat-subnet --quiet

gcloud compute networks delete producer-vpc --quiet

12. ¡Felicitaciones!

Felicitaciones por completar el codelab.

Temas abordados

  • Crea un extremo de Private Service Connect con Controles del servicio de HTTP(S) del consumidor a través del XLB global
  • Configurar un servicio administrado para que se exponga a través de un adjunto de servicio y poder aceptar conexiones L7 XLB.
  • Crea un certificado SSL y configura un servidor web Apache para que finalice TLS y acepte el tráfico en el puerto 443.
  • Crea un NEG de PSC.