Chaîne explicite d'équilibreurs de charge GCP L7 avec PSC

1. Introduction

Le groupe de points de terminaison du réseau (NEG) Private Service Connect (PSC) permet d'associer un équilibreur de charge HTTPS interne à un équilibreur de charge HTTPS externe. Cela permet de fournir des vérifications d'état distribuées et du trafic de plan de données sur site à l'aide de plages définies par le client. Cette topologie permet également de connecter plusieurs VPC sur site via plusieurs interconnexions régionales.

Dans cet atelier de programmation, nous allons vous montrer comment configurer cette configuration de bout en bout en fonction de la topologie ci-dessous. De gauche à droite, les clients sur site disposent d'une VM pour simuler les services HTTP, d'une connectivité hybride (HA-VPN ou InterConnect) et d'un NEG hybride pour les exposer via un équilibreur de charge HTTPS interne. PSC utilise un équilibreur de charge HTTPS interne en tant que rattachement de service. Le NEG PSC utilise les rattachements en tant que service de backend, exposé à l'équilibreur de charge HTTPS externe. Les internautes peuvent utiliser le réseau mondial de Google pour accélérer l'accès aux services HTTP sur site.

e3f26d8497323a42.png

Figure 1. Private Service Connect utilise un groupe de points de terminaison du réseau et des rattachements de service pour connecter l'équilibreur de charge HTTPS externe à l'équilibreur de charge HTTPS interne, et étendre le backend sur site.

Points abordés

  • Équilibreur de charge HTTPS interne avec NEG hybride et vérification d'état distribuée
  • Rattachement de service PSC avec équilibreur de charge HTTPS interne
  • Configuration du groupe de points de terminaison du réseau PSC
  • Exposer le NEG PSC avec un équilibreur de charge HTTPS externe

Prérequis

  • Connaissances de la connectivité hybride, comme le VPN haute disponibilité
  • Connaissance de l'équilibrage de charge HTTPS interne/externe
  • Connaissances de Private Service Connect

2. Avant de commencer

Remarque: L'atelier de programmation propose des étapes de configuration et de validation basées sur la topologie illustrée. Modifiez la procédure si nécessaire pour répondre aux exigences de votre organisation. Les autorisations IAM ne sont pas prises en compte dans cet atelier de programmation.

L'atelier de programmation utilisera un projet pour simuler l'ensemble du processus. Vous pouvez également créer plusieurs projets.

Single Project - Update project to support producer and consumer network

Dans Cloud Shell, assurez-vous que l'ID de votre projet est configuré.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

3. Créer des ressources sur site

Dans la section suivante, nous allons configurer un VPC sur site et des VM pour simuler les services sur site du client.

Réseau VPC

Depuis Cloud Shell

gcloud compute networks create vpc-demo-onprem --project=$prodproject --subnet-mode=custom

Créer un sous-réseau

Depuis Cloud Shell

gcloud compute networks subnets create vpc-demo-onprem-asia-southeast1 --project=$prodproject --range=10.0.0.0/24 --network=vpc-demo-onprem --region=asia-southeast1

Créez des règles de pare-feu.

L'équilibreur de charge HTTPS interne est compatible avec la vérification de l'état distribuée. Les règles de pare-feu ne doivent autoriser que la plage d'adresses IP du sous-réseau proxy. Consultez la documentation pour ajouter vos projets à la liste d'autorisation.

Dans Cloud Shell, créez une règle de pare-feu pour activer les vérifications d'état du backend et le trafic du plan de données à partir des sous-réseaux proxy.

gcloud compute firewall-rules create vpc-demo-health-checks --allow tcp:80,tcp:443 --network vpc-demo-onprem --source-ranges 10.0.3.0/24 --enable-logging

Dans Cloud Shell, créez une règle de pare-feu pour autoriser IAP à se connecter à vos instances de VM.

gcloud compute firewall-rules create psclab-iap-prod --network vpc-demo-onprem --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

4. Créer des instances de VM sur site

Cette VM simule des services sur site et doit être exposée avec l'équilibreur de charge HTTPS interne à l'aide d'un NEG hybride.

Créer une instance www01 depuis Cloud Shell

gcloud compute instances create www01 \
    --zone=asia-southeast1-b \
    --image-family=debian-11 \
    --image-project=debian-cloud \
    --network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=vpc-demo-onprem-asia-southeast1 \
    --shielded-secure-boot \
    --shielded-vtpm \
    --shielded-integrity-monitoring \
    --metadata=startup-script='#! /bin/bash
sudo apt-get update
sudo apt-get install nginx -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
filter="{print \$NF}"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone \
| awk -F/ "${filter}")"
echo "Page on $vm_hostname in $vm_zone" | \
tee /var/www/html/index.nginx-debian.html
sudo systemctl restart nginx'

Dans la section suivante, nous allons utiliser letsencrypt pour générer des certificats et les installer sur Nginx. Téléchargez les fichiers de clés publique et privée pour l'étape suivante. Vous devez ouvrir temporairement le port TCP 80 sur Internet pour générer des certificats.

Assurez-vous que cette VM dispose d'un nom de domaine résolu publiquement. Par exemple, dans Cloud DNS, ajoutez un enregistrement A [www01.yinghli.demo.altostrat.com](http://www01.yinghli.demo.altostrat.com) et pointez-le vers l'adresse IP publique de la VM.

gcloud dns --project=$prodproject record-sets create www01.yinghli.demo.altostrat.com. --zone="yinghli-demo" --type="A" --ttl="300" --rrdatas="34.87.77.186"

Dans la console de la VM www01, suivez les instructions pour installer les certificats sur Nginx et créez une copie de fullchain.pem et private.pem pour les étapes suivantes.

sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx

5. Créer le réseau VPC des producteurs

Remarque : La configuration de la connectivité hybride n'est PAS incluse dans cette configuration.

Réseau VPC

Depuis Cloud Shell

gcloud compute networks create vpc-demo-producer --project=$prodproject --subnet-mode=custom

Créer un sous-réseau

Depuis Cloud Shell

gcloud compute networks subnets create vpc-demo-asia-southeast1 --project=$prodproject --range=10.0.2.0/24 --network=vpc-demo-producer --region=asia-southeast1

Créer un sous-réseau proxy

Depuis Cloud Shell

gcloud compute networks subnets create proxy-subnet-asia-southeast1 \
  --purpose=REGIONAL_MANAGED_PROXY \
  --role=ACTIVE \
  --region=asia-southeast1 \
  --network=vpc-demo-producer \
  --range=10.0.3.0/24

Connectivité hybride

Suivez la documentation Cloud VPN pour implémenter la connectivité VPN haute disponibilité entre le VPC sur site et le VPC de producteur. Conservez la configuration par défaut sur le routeur Cloud Router. Nous n'avons pas besoin d'ajouter 130.211.0.0/22, 35.191.0.0/16 aux annonces BGP.

6. Créer un NEG hybride de producteurs

Créez un groupe de points de terminaison du réseau hybride et ajoutez "IP:PORT" de la VM sur site au NEG.

Depuis Cloud Shell

gcloud compute network-endpoint-groups create on-prem-service-neg \
    --network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
    --zone=asia-southeast1-b \
    --network=vpc-demo-producer

gcloud compute network-endpoint-groups update on-prem-service-neg \
    --zone=asia-southeast1-b \
    --add-endpoint="ip=10.0.0.2,port=443"

7. Créer un équilibreur de charge HTTPS interne pour les producteurs

Actuellement, l'équilibreur de charge HTTPS externe n'est compatible qu'avec le protocole HTTPS pour les NEG PSC (documentation). Pour les services publiés, nous devons utiliser un équilibreur de charge HTTPS interne et activer l'accès mondial aux règles de transfert.

Dans Cloud Shell, créez la vérification d'état régionale.

gcloud compute health-checks create https on-prem-service-hc \
    --region=asia-southeast1 \
    --use-serving-port

Dans Cloud Shell, créez le service de backend et ajoutez le NEG hybride.

gcloud compute backend-services create on-premise-service-backend \
   --load-balancing-scheme=INTERNAL_MANAGED \
   --protocol=HTTPS \
   --region=asia-southeast1 \
   --health-checks=on-prem-service-hc \
   --health-checks-region=asia-southeast1

gcloud compute backend-services add-backend on-premise-service-backend \
   --network-endpoint-group=on-prem-service-neg \
   --network-endpoint-group-zone=asia-southeast1-b \
   --region=asia-southeast1 \
   --balancing-mode=RATE \
   --max-rate-per-endpoint=100

Créer le mappage d'URL depuis Cloud Shell

gcloud compute url-maps create on-premise-url \
    --default-service on-premise-service-backend \
    --region=asia-southeast1

Dans Cloud Shell, créez les certificats SSL régionaux. Deux fichiers de certificat sont téléchargés à partir de la VM.

gcloud compute ssl-certificates create www01 \
    --certificate=fullchain.pem \
    --private-key=private.pem \
    --region=asia-southeast1

Depuis Cloud Shell, créez le proxy cible

gcloud compute target-https-proxies create on-premise-httpsproxy \
    --ssl-certificates=www01 \
    --url-map=on-premise-url \
    --url-map-region=asia-southeast1 \
    --region=asia-southeast1

Réserver une adresse IP statique interne dans Cloud Shell et créer la règle de transfert

gcloud compute addresses create ilbaddress \
  --region=asia-southeast1 \
  --subnet=vpc-demo-asia-southeast1  \
  --addresses=10.0.2.100 

gcloud compute forwarding-rules create https-ilb-psc \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=vpc-demo-producer \
      --subnet=vpc-demo-asia-southeast1  \
      --address=ilbaddress \
      --ports=443 \
      --region=asia-southeast1 \
      --target-https-proxy=on-premise-httpsproxy \
      --target-https-proxy-region=asia-southeast1
      --allow-global-access

8. Créer une instance de VM de producteur

Créer une VM de producteur pour la validation

Depuis Cloud Shell

gcloud compute instances create test01 \
    --zone=asia-southeast1-b \
    --image-family=debian-11 \
    --image-project=debian-cloud \
    --network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=vpc-demo-asia-southeast1 \
    --shielded-secure-boot \
    --shielded-vtpm \
    --shielded-integrity-monitoring

Pour autoriser IAP à se connecter à vos instances de VM, créez une règle de pare-feu qui:

Depuis Cloud Shell

gcloud compute firewall-rules create psclab-iap-prod --network vpc-demo-producer --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

Depuis la console de la VM producteur, accédez à [www01.yinghli.demo.altostrat.com](https://www01.yinghli.demo.altostrat.com) et résolvez l'adresse IP de l'équilibreur de charge HTTPS interne. Le code HTTP 200 indique que la configuration a fonctionné comme prévu.

curl -v --resolve www01.yinghli.demo.altostrat.com:443:10.0.2.100 https://www01.yinghli.demo.altostrat.com

* Added www01.yinghli.demo.altostrat.com:443:10.0.2.100 to DNS cache
* Hostname www01.yinghli.demo.altostrat.com was found in DNS cache
*   Trying 10.0.2.100:443...
* Connected to www01.yinghli.demo.altostrat.com (10.0.2.100) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=www01.yinghli.demo.altostrat.com
*  start date: Jun  4 10:36:43 2023 GMT
*  expire date: Sep  2 10:36:42 2023 GMT
*  subjectAltName: host "www01.yinghli.demo.altostrat.com" matched cert's "www01.yinghli.demo.altostrat.com"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55865ef982e0)
> GET / HTTP/2
> Host: www01.yinghli.demo.altostrat.com
> user-agent: curl/7.74.0
> accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200 
< server: nginx/1.18.0
< date: Mon, 05 Jun 2023 02:29:38 GMT
< content-type: text/html
< content-length: 35
< last-modified: Sun, 04 Jun 2023 09:02:16 GMT
< etag: "647c5318-23"
< accept-ranges: bytes
< via: 1.1 google
< 
Page on www01 in asia-southeast1-b
* Connection #0 to host www01.yinghli.demo.altostrat.com left intact

Remarque: Vous ne pouvez pas accéder directement aux services HTTPS de la VM 10.0.0.2, car le pare-feu sur site n'autorise l'accès qu'au sous-réseau proxy 10.0.3.0/24.

9. Créer un sous-réseau NAT PSC

Depuis Cloud Shell

gcloud compute networks subnets create psc-nat-subnet \
--network=vpc-demo-producer \
--region=asia-southeast1 \
--range=10.0.5.0/24 \
--purpose=private-service-connect

10. Créer un rattachement de service HTTPS

Créer l'attachement de service HTTPS dans Cloud Shell

gcloud compute service-attachments create ilbserviceattach \
--region=asia-southeast1 \
--producer-forwarding-rule=https-ilb-psc \
--connection-preference=ACCEPT_AUTOMATIC \
--nat-subnets=psc-nat-subnet

Valider le rattachement de service HTTPS

gcloud compute service-attachments describe ilbserviceattach --region asia-southeast1

Enregistrez le nom du rattachement de service :

projects/<project>/regions/asia-southeast1/serviceAttachments/ilbserviceattach

11. Créer le réseau VPC de clients

Dans la section suivante, le VPC client est configuré dans le même projet, mais différents projets sont également acceptés. La communication entre le réseau du client et celui du producteur s'effectue via le rattachement de service défini dans le réseau du producteur.

Réseau VPC

Depuis Cloud Shell

gcloud compute networks create vpc-demo-consumer --project=$prodproject --subnet-mode=custom

Créer un sous-réseau

Depuis Cloud Shell

gcloud compute networks subnets create consumer-subnet --project=$prodproject  --range=10.0.6.0/24 --network=vpc-demo-consumer --region=asia-southeast1

12. Créer un groupe de points de terminaison du réseau PSC

Créer un NEG PSC

Copiez le nom du rattachement de service HTTPS précédent et collez les paramètres --psc-target-service

Depuis Cloud Shell

gcloud beta compute network-endpoint-groups create consumerpscneg \
--project=$prodproject \
--region=asia-southeast1 \
--network-endpoint-type=PRIVATE_SERVICE_CONNECT \
--psc-target-service=projects/<project>/regions/asia-southeast1/serviceAttachments/ilbserviceattach \
--network=vpc-demo-consumer \
--subnet=consumer-subnet

Une fois la configuration de la négociation PSC réussie, dans l'UI, après Private Service Connect -> Published Services -> Notez que la connexion ilbserviceattach publiée indique désormais une règle de transfert.

320741b7dedc7984.png

13. Créer un équilibreur de charge HTTPS externe pour le client

Créez un équilibreur de charge HTTPS externe et utilisez le NEG PSC en tant que services de backend( documentation).

Depuis Cloud Shell

gcloud compute addresses create httpspsclb \
    --ip-version=IPV4 --global

gcloud compute backend-services create consumer-bs \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTPS \
    --global

gcloud compute backend-services add-backend consumer-bs \
  --network-endpoint-group=consumerpscneg \
  --network-endpoint-group-region=asia-southeast1 \
  --global

gcloud compute url-maps create consumer-url \
  --default-service=consumer-backend-service \
  --global

gcloud compute ssl-certificates create wwwglobal \
    --certificate=fullchain.pem \
    --private-key=private.pem \
    --global

gcloud compute target-https-proxies create consumer-url-target-proxy \
  --url-map=consumer-url \
  --ssl-certificates=wwwglobal

gcloud compute forwarding-rules create consumer-url-forwarding-rule \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --network-tier=PREMIUM \
    --address=httpspsclb \
    --target-https-proxy=consumer-url-target-proxy \
    --ports=443 \
    --global

Mettez à jour l'enregistrement DNS pour www01.yinghli.demo.altostrat.com et faites pointer vers l'adresse IP publique de l'équilibreur de charge HTTPS externe

gcloud dns --project=$prodproject record-sets update www01.yinghli.demo.altostrat.com. --type="A" --zone="yinghli-demo" --rrdatas="34.102.178.214" --ttl="300"

14. Validation

Depuis votre ordinateur portable, accédez à https://www01.yinghli.demo.altostrat.com avec curl.

curl -v https://www01.yinghli.demo.altostrat.com
*   Trying 34.102.178.214:443...
* Connected to www01.yinghli.demo.altostrat.com (34.102.178.214) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=www01.yinghli.demo.altostrat.com
*  start date: Jun  4 10:36:43 2023 GMT
*  expire date: Sep  2 10:36:42 2023 GMT
*  subjectAltName: host "www01.yinghli.demo.altostrat.com" matched cert's "www01.yinghli.demo.altostrat.com"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* using HTTP/2
* h2h3 [:method: GET]
* h2h3 [:path: /]
* h2h3 [:scheme: https]
* h2h3 [:authority: www01.yinghli.demo.altostrat.com]
* h2h3 [user-agent: curl/8.0.0]
* h2h3 [accept: */*]
* Using Stream ID: 1 (easy handle 0x149019a00)
> GET / HTTP/2
> Host: www01.yinghli.demo.altostrat.com
> user-agent: curl/8.0.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
< HTTP/2 200
< server: nginx/1.18.0
< date: Mon, 05 Jun 2023 02:48:43 GMT
< content-type: text/html
< content-length: 35
< last-modified: Sun, 04 Jun 2023 09:02:16 GMT
< etag: "647c5318-23"
< accept-ranges: bytes
< via: 1.1 google, 1.1 google
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
<
Page on www01 in asia-southeast1-b
* Connection #0 to host www01.yinghli.demo.altostrat.com left intact

15. Étapes de nettoyage

Procédure de nettoyage du réseau du producteur

Remarque: Les étapes de nettoyage n'affichent que la configuration liée à l'équilibreur de charge et à PSC. Le VPC et la connectivité hybride ne sont pas inclus.

Supprimer des composants de l'atelier à partir d'un seul cloud shell dans le terminal

gcloud compute forwarding-rules delete consumer-url-forwarding-rule --global
gcloud compute target-https-proxies delete consumer-url-target-proxy
gcloud compute ssl-certificates delete wwwglobal --global
gcloud compute url-maps delete consumer-url
gcloud compute backend-services delete consumer-bs --global
gcloud compute addresses delete httpspsclb --global

gcloud beta compute network-endpoint-groups delete consumerpscneg --region=asia-southeast1

gcloud compute service-attachments delete ilbserviceattach --region=asia-southeast1
gcloud compute networks subnets delete psc-nat-subnet --region=asia-southeast1

gcloud compute forwarding-rules delete https-ilb-psc --region=asia-southeast1
gcloud compute addresses delete ilbaddress --region=asia-southeast1
gcloud compute target-https-proxies delete on-premise-httpsproxy --region=asia-southeast1
gcloud compute ssl-certificates delete www01 --region=asia-southeast1
gcloud compute url-maps delete on-premise-url --region=asia-southeast1
gcloud compute backend-services delete on-premise-service-backend --region=asia-southeast1
gcloud compute health-checks delete on-prem-service-hc --region=asia-southeast1

gcloud compute network-endpoint-groups delete on-prem-service-neg --zone=asia-southeast1-b
gcloud compute networks subnets delete proxy-subnet-asia-southeast1 --region=asia-southeast1

16. Félicitations !

Bravo ! Vous avez terminé cet atelier de programmation.

Points abordés

  • Équilibreur de charge HTTPS interne avec NEG hybride et vérification d'état distribuée
  • Rattachement de service PSC avec équilibreur de charge HTTPS interne
  • Configuration du groupe de points de terminaison du réseau PSC
  • Exposer le NEG PSC avec un équilibreur de charge HTTPS externe