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'enchaîner un équilibreur de charge HTTPS interne avec un équilibreur de charge HTTPS externe. Cela permet de distribuer les vérifications d'état et le trafic du plan de données sur site à l'aide de plages définies par le client. De plus, cette topologie est compatible avec plusieurs VPC se connectant sur site via plusieurs interconnexions régionales.

Dans cet atelier de programmation, nous allons vous montrer comment configurer cette solution de bout en bout en fonction de la topologie ci-dessous. De gauche à droite, les clients sur site disposent d'une VM pour simuler des services HTTP, tirer parti de la connectivité hybride (HA-VPN ou Interconnect) et d'un NEG hybride pour exposer via un équilibreur de charge HTTPS interne. PSC utilise l'équilibreur de charge HTTPS interne comme rattachement de service. Le NEG PSC consomme les rattachements en tant que service de backend, exposé à l'équilibreur de charge HTTPS externe. Les utilisateurs d'Internet 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 un équilibreur de charge HTTPS externe à un é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 en connectivité hybride, comme HA-VPN
  • Connaissances en équilibrage de charge HTTPS interne/externe
  • Connaissances en Private Service Connect

2. Avant de commencer

Remarque : Cet 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 abordées dans cet atelier de programmation.

Cet atelier de programmation utilise un seul projet pour simuler l'ensemble du processus. Plusieurs projets sont également compatibles.

Projet unique : mettre à jour le projet pour qu'il soit compatible avec le réseau producteur et consommateur

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 et des VM sur site 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éer des règles de pare-feu

L'équilibreur de charge HTTPS interne est compatible avec la vérification d'état distribuée. Les règles de pare-feu n'ont besoin d'autoriser que la plage d'adresses IP du sous-réseau proxy. Suivez ce document pour ajouter vos projets à la liste d'autorisation.

Depuis 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

Depuis 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 un équilibreur de charge HTTPS interne à l'aide d'un NEG hybride.

Depuis Cloud Shell, créez l'instance www01.

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 le fichier de clé publique et privée pour l'étape suivante. Vous devez ouvrir temporairement le port TCP 80 sur Internet pour générer le certificat.

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 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"

Depuis 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 un réseau VPC producteur

Remarque : La configuration du réseau 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é HA-VPN entre le VPC sur site et le VPC producteur. Conservez la configuration par défaut sur le Cloud Router. Nous n'avons pas besoin d'ajouter 130.211.0.0/22, 35.191.0.0/16 dans les annonces BGP.

6. Créer un NEG hybride producteur

Créez un groupe de points de terminaison du réseau hybride et ajoutez l'adresse 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 producteur

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

Depuis 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

Depuis 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

Depuis Cloud Shell, créez le mappage d'URL.

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

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

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

Depuis Cloud Shell, créez https-target-proxy.

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

Depuis Cloud Shell, réservez une adresse IP statique interne et créez 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 producteur

Créez une VM producteur à des fins de vérification.

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

Depuis Cloud Shell, créez le rattachement de service HTTPS.

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

Validez 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 un réseau VPC consommateur

Dans la section suivante, le VPC consommateur est configuré dans le même projet, mais d'autres projets sont également compatibles. La communication entre le réseau consommateur et le réseau producteur s'effectue via le rattachement de service défini dans le réseau 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-le dans 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 du NEG PSC terminée, dans l'interface utilisateur, accédez à Private Service Connect > Published Services (Services publiés). 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 consommateur

Créez un équilibreur de charge HTTPS externe et utilisez le NEG PSC comme service 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 pointez 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. Procédure de nettoyage

Procédure de nettoyage du réseau producteur

Remarque : La procédure de nettoyage n'affiche que la configuration associée à l'équilibreur de charge et au PSC. Le VPC et la connectivité hybride ne sont pas inclus.

Depuis une seule interface Cloud Shell dans le terminal, supprimez les composants de l'atelier.

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