Concatenamento esplicito di bilanciatori del carico Google Cloud L7 con PSC

1. Introduzione

Il gruppo di endpoint di rete (NEG) di Private Service Connect (PSC) supporta l'accodamento di un bilanciatore del carico HTTPS interno con un bilanciatore del carico HTTPS esterno. In questo modo, vengono forniti controlli di integrità distribuiti e traffico del piano dati on-premise utilizzando intervalli definiti dal cliente. Inoltre, con questa topologia sono supportati anche più VPC che si connettono all'infrastruttura on-premise tramite più InterConnect regionali.

In questo codelab, dimostreremo come configurare l'intero processo in base alla topologia riportata di seguito. Da sinistra a destra, i clienti on-premise hanno una VM per simulare i servizi HTTP, sfruttano la connettività ibrida (HA-VPN o InterConnect) e il NEG ibrido per l'esposizione tramite il bilanciatore del carico HTTPS interno. PSC utilizza il bilanciatore del carico HTTPS interno come collegamenti a servizi. Il NEG PSC utilizza gli allegati come servizio di backend, esposto al bilanciatore del carico HTTPS esterno. Gli utenti di internet possono utilizzare la rete globale di Google per accelerare l'accesso ai servizi HTTP on-premise.

e3f26d8497323a42.png

Figura 1. Private Service Connect utilizza il gruppo di endpoint di rete e i collegamenti ai servizi per connettere il bilanciatore del carico HTTPS esterno al bilanciatore del carico HTTPS interno ed estendere il backend alla rete on-prem.

Cosa imparerai a fare

  • Bilanciatore del carico HTTPS interno con NEG ibrida e controllo dell'integrità distribuito
  • Collegamento del servizio PSC con il bilanciatore del carico HTTPS interno
  • Configurazione del gruppo di endpoint di rete PSC
  • Esponi il NEG PSC con il bilanciatore del carico HTTPS esterno

Che cosa ti serve

  • Conoscenza della connettività ibrida, ad esempio VPN ad alta disponibilità
  • Conoscenza del bilanciamento del carico HTTPS interno/esterno
  • Conoscenza di Private Service Connect

2. Prima di iniziare

Nota: il codelab offre i passaggi di configurazione e convalida in base alla topologia illustrata. Modifica la procedura in base alle esigenze della tua organizzazione. Le autorizzazioni IAM non rientrano nell'ambito del codelab.

Il Codelab utilizzerà un progetto per simulare l'intera procedura. Sono supportati anche più progetti.

Progetto singolo: aggiorna il progetto per supportare la rete di producer e consumer

All'interno di Cloud Shell, assicurati che l'ID progetto sia configurato

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

3. Crea risorse on-prem

Nella sezione seguente, configureremo un VPC e VM on-premise per simulare i servizi on-premise dei clienti.

Rete VPC

Da Cloud Shell

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

Crea subnet

Da 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

Crea regole firewall.

Il bilanciatore del carico HTTPS interno supporta il controllo di integrità distribuito, quindi le regole firewall devono consentire solo l'intervallo IP della subnet proxy. Leggi il documento seguente per includere i tuoi progetti nella lista consentita.

Da Cloud Shell, crea una regola firewall per abilitare i controlli di integrità del backend e il traffico del piano dati dalle sottoreti 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

Da Cloud Shell, crea una regola firewall per consentire a IAP di connettersi alle tue istanze 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. Creazione di istanze VM on-prem

Questa VM simula i servizi on-premise e deve essere esposta con il bilanciatore del carico HTTPS interno utilizzando NEG ibrida.

Crea l'istanza www01 da 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'

Nella sezione seguente utilizzeremo letsencrypt per generare i certificati e installarli su Nginx. Scarica il file della chiave pubblica e privata per il passaggio successivo. Per la generazione del certificato, devi aprire temporaneamente la porta TCP 80 su internet.

Assicurati che questa VM abbia un nome di dominio risolto pubblicamente. Ad esempio, in Cloud DNS aggiungi un record A [www01.yinghli.demo.altostrat.com](http://www01.yinghli.demo.altostrat.com) e punta all'indirizzo IP pubblico della 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"

Dalla console VM www01, segui le indicazioni per installare i certificati su Nginx e crea una copia di fullchain.pem e private.pem per i passaggi successivi.

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. Crea rete VPC dei producer

Nota: la configurazione della rete ibrida NON è inclusa in questa configurazione.

Rete VPC

Da Cloud Shell

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

Crea subnet

Da 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

Creare una subnet proxy

Da 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

Connettività ibrida

Segui la documentazione di Cloud VPN per implementare la connettività HA-VPN tra il VPC on-prem e del produttore. Mantieni la configurazione predefinita sul router Cloud, non è necessario aggiungere 130.211.0.0/22, 35.191.0.0/16 negli annunci BGP.

6. Crea NEG ibrido producer

Crea un gruppo di endpoint di rete ibrida e aggiungi l'IP:PORT della VM on-prem al NEG.

Da 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. Crea bilanciatore del carico HTTPS interno per i produttori

Al momento, il bilanciatore del carico HTTPS esterno supporta solo il protocollo HTTPS per PSC NEG (documentazione). Quando pubblichi i servizi, devi utilizzare il bilanciatore del carico HTTPS interno e attivare l'accesso globale alle regole di inoltro.

Da Cloud Shell, crea il controllo di integrità a livello di regione.

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

Da Cloud Shell crea il servizio di backend e aggiungi il NEG ibrido.

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

Crea la mappa URL da Cloud Shell

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

Da Cloud Shell crea i certificati SSL a livello di regione. Dalla VM vengono scaricati due file di certificato.

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

Da Cloud Shell crea 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

Da Cloud Shell, prenota un indirizzo IP interno statico e crea la regola di inoltro

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. Crea istanza VM del produttore

Crea una VM di produzione per la verifica.

Da 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

Per consentire a IAP di connettersi alle tue istanze VM, crea una regola firewall che:

Da 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

Dalla console della VM del produttore, accedi a [www01.yinghli.demo.altostrat.com](https://www01.yinghli.demo.altostrat.com) e risolvi l'indirizzo IP del bilanciatore del carico HTTPS interno. HTTP 200 indicava che la configurazione ha funzionato come previsto.

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

Nota: non puoi accedere direttamente ai servizi HTTPS della VM 10.0.0.2 perché il firewall on-premise consente l'accesso solo alla subnet proxy 10.0.3.0/24.

9. Crea la subnet NAT PSC

Da 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. Crea collegamento del servizio HTTPS

Crea l'allegato del servizio HTTPs da 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

Convalida il collegamento del servizio HTTPS

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

Nome del collegamento al servizio di record:

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

11. Crea la rete VPC dei consumatori

Nella sezione seguente, il VPC consumer è configurato nello stesso progetto, ma sono supportati anche progetti diversi. La comunicazione tra la rete del consumatore e del producer viene effettuata tramite il collegamento al servizio definito nella rete del producer.

Rete VPC

Da Cloud Shell

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

Crea subnet

Da 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. Crea gruppo di endpoint di rete PSC

Creare un NEG PSC

Copia il nome dell'allegato dei servizi https precedente e incolla i parametri --psc-target-service

Da 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

Dopo aver configurato correttamente il NEG PSC, dall'interfaccia utente, seguendo Private Service Connect -> Published Services -> Tieni presente che la connessione ilbserviceattach pubblicata ora indica 1 regola di forwarding.

320741b7dedc7984.png

13. Crea bilanciatore del carico HTTPS esterno per i consumatori

Crea un bilanciatore del carico HTTPS esterno e utilizza il NEG PSC come servizi di backend( documentazione).

Da 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

Aggiorna il record DNS per www01.yinghli.demo.altostrat.com e indica l'indirizzo IP pubblico del bilanciatore del carico HTTPS esterno

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

Dal tuo laptop, accedi all'indirizzo https://www01.yinghli.demo.altostrat.com con 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. Passaggi per la pulizia

Passaggi di pulizia della rete del producer

Nota: i passaggi di pulizia mostrano solo la configurazione relativa al bilanciatore del carico e a PSC, il VPC e la connettività ibrida non sono inclusi.

Elimina i componenti del lab da un'unica Cloud Shell nel terminale

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. Complimenti!

Complimenti per aver completato il codelab.

Argomenti trattati

  • Bilanciatore del carico HTTPS interno con NEG ibrida e controllo dell'integrità distribuito
  • Collegamento del servizio PSC con il bilanciatore del carico HTTPS interno
  • Configurazione del gruppo di endpoint di rete PSC
  • Esponi il NEG PSC con il bilanciatore del carico HTTPS esterno