Configura il routing TLS del gateway
Questa guida illustra come configurare un gateway di ingresso basato su proxy Envoy con risorse Gateway
e TLSRoute
. Puoi anche collegare una risorsa TLSRoute
.
Il deployment configurato è illustrato nel seguente diagramma. R Il bilanciatore del carico di rete passthrough esterno regionale indirizza il traffico ai proxy Envoy che agiscono un gateway in entrata. I proxy Envoy utilizzano il routing passthrough TLS e il routing verso i server HTTPS in esecuzione sulle istanze VM di backend.
Prima di iniziare
Assicurati di completare le attività descritte in Preparati alla configurazione con Envoy e carichi di lavoro senza proxy.
Configurazione delle regole del firewall
In questa sezione crei regole firewall per consentire le connessioni in entrata dei controlli di integrità alle istanze VM nella tua rete.
Crea una regola firewall:
gcloud compute firewall-rules create allow-gateway-health-checks \ --network=NETWORK_NAME \ --direction=INGRESS \ --action=ALLOW \ --rules=tcp \ --source-ranges="35.191.0.0/16,209.85.152.0/22,209.85.204.0/22" \ --target-tags=gateway-proxy
Configura le regole del firewall per consentire il traffico da qualsiasi origine. Modifica i comandi per le porte e gli intervalli di indirizzi IP di origine:
gcloud compute firewall-rules create allow-gateway-ingress-traffic \ --network=NETWORK_NAME \ --direction=INGRESS \ --action=ALLOW \ --rules=tcp:443 \ --source-ranges="0.0.0.0/0" \ --target-tags=gateway-proxy
Configurazione delle autorizzazioni per Identity and Access Management
In questa sezione, definirai l'account di servizio per i proxy gateway e e assegnare i ruoli IAM corretti all'account di servizio.
Crea un'identità dell'account di servizio per i proxy gateway:
gcloud iam service-accounts create gateway-proxy
Assegna i ruoli IAM richiesti all'identità dell'account di servizio:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/trafficdirector.client"
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/logging.logWriter"
Configurazione della risorsa Gateway
In un file denominato
gateway443.yaml
, crea la specificaGateway
per il traffico HTTP:name: gateway443 scope: gateway-proxy ports: - 443 type: OPEN_MESH
Crea la risorsa
Gateway
usando la specificagateway443.yaml
:gcloud network-services gateways import gateway443 \ --source=gateway443.yaml \ --location=global
Creazione di un gruppo di istanze gestite con proxy Envoy
In questa sezione crei i proxy Envoy associati al gateway di ingresso.
Crea un modello di istanza per una VM che esegue un Envoy di cui è stato eseguito il deployment automatico proxy di servizio. L'ambito degli Envoy è impostato su
gateway-proxy
. Non passare la porta di pubblicazione come parametro del flag--service-proxy
.gcloud beta compute instance-templates create gateway-proxy \ --machine-type=n1-standard-1 \ --boot-disk-size=10GB \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=gateway-proxy \ --network-interface=network=NETWORK_NAME,no-address \ --service-account="gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \ --service-proxy=enabled,scope=gateway-proxy
Crea un gruppo di istanze gestite regionali dal modello di istanza:
gcloud compute instance-groups managed create gateway-proxy \ --region=REGION \ --size=1 \ --template=gateway-proxy
Imposta il nome della porta di gestione per il gruppo di istanze gestite:
gcloud compute instance-groups managed set-named-ports gateway-proxy \ --named-ports=https:443 \ --region=REGION
Configura il bilanciatore del carico di rete passthrough esterno regionale
In questa sezione viene creato il bilanciatore del carico di rete passthrough esterno.
Crea un indirizzo IP esterno statico a livello di regione:
gcloud compute addresses create xnlb-REGION \ --region=REGION
Ottieni l'indirizzo IP riservato per il bilanciatore del carico esterno:
gcloud compute addresses describe xnlb-REGION \ --region=REGION --format='value(address)'
Questo indirizzo IP viene utilizzato come variabile
IP_ADDRESS
più avanti in questa guida alla configurazione.Crea un controllo di integrità per i proxy gateway:
gcloud compute health-checks create tcp xnlb-REGION \ --region=REGION \ --use-serving-port
Crea un servizio di backend per i proxy del gateway:
gcloud compute backend-services create xnlb-REGION \ --health-checks=xnlb-REGION \ --health-checks-region=REGION \ --load-balancing-scheme=EXTERNAL \ --protocol=TCP \ --region=REGION \ --port-name=https
Aggiungi il gruppo di istanze gestite come backend:
gcloud compute backend-services add-backend xnlb-REGION \ --instance-group=gateway-proxy \ --instance-group-region=REGION \ --region=REGION
Crea una regola di inoltro per instradare il traffico ai proxy gateway:
gcloud compute forwarding-rules create xnlb-REGION \ --region=REGION \ --load-balancing-scheme=EXTERNAL \ --address=IP_ADDRESS \ --ip-protocol=TCP \ --ports=443 \ --backend-service=xnlb-REGION \ --backend-service-region=REGION
Configura un gruppo di istanze gestite che esegue un servizio HTTPS
A scopo dimostrativo, crea un servizio di backend con VM con scalabilità automatica in una
gruppo di istanze gestite. Le VM eseguono l'echo sui dettagli delle richieste web utilizzando il protocollo HTTPS
protocollo sulla porta 443
.
Crea un modello di istanza con un servizio HTTPS esposto sulla porta
443
:gcloud compute instance-templates create td-https-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=https-td-server \ --image-family=debian-10 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash sudo rm -rf /var/lib/apt/lists/* sudo apt-get -y clean sudo apt-get -y update sudo apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" sudo apt-get -y update sudo apt-get -y install docker-ce sudo which docker echo "{ \"registry-mirrors\": [\"https://mirror.gcr.io\"] }" | sudo tee -a /etc/docker/daemon.json sudo service docker restart sudo docker run -e HTTPS_PORT=9999 -p 443:9999 --rm -dt mendhak/http-https-echo:22'
Crea un gruppo di istanze gestite basato sul modello di istanza:
gcloud compute instance-groups managed create https-td-mig-us-REGION \ --zone=ZONE \ --size=2 \ --template=td-https-vm-template
Imposta il nome della porta di gestione per il gruppo di istanze gestite:
gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \ --named-ports=https:443 \ --zone=ZONE
Crea un controllo di integrità:
gcloud compute health-checks create https https-helloworld-health-check \ --port=443
Crea una regola firewall per consentire le connessioni del controllo di integrità in entrata a di Compute Engine nella tua rete:
gcloud compute firewall-rules create https-vm-allow-health-checks \ --network NETWORK_NAME --action allow --direction INGRESS \ --source-ranges 35.191.0.0/16,130.211.0.0/22 \ --target-tags https-td-server \ --rules tcp:443
Creare un servizio di backend globale con uno schema di bilanciamento del carico di
INTERNAL_SELF_MANAGED
e aggiungi l'integrità verifica:gcloud compute backend-services create https-helloworld-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --port-name=https \ --health-checks https-helloworld-health-check
Aggiungi il gruppo di istanze gestite come backend al servizio di backend:
gcloud compute backend-services add-backend https-helloworld-service \ --instance-group=https-td-mig-us-REGION \ --instance-group-zone=ZONE \ --global
Configura il routing con una risorsa TLSRoute
Nelle sezioni precedenti hai configurato una risorsa Gateway
e un server HTTPS.
Quindi, connettili utilizzando una risorsa TLSRoute
che associa un nome host SNI
a un servizio di backend.
In un file denominato
tls_route.yaml
, crea la specificaTLSRoute
:name: helloworld-tls-route gateways: - projects/PROJECT_NUMBER/locations/global/gateways/gateway443 rules: - matches: - sniHost: - example.com alpn: - h2 action: destinations: - serviceName: projects/PROJECT_NUMBER/locations/global/backendServices/https-helloworld-service
Nell'istruzione precedente,
TLSRoute
corrisponde aexample.com
come SNI eh2
come ALPN. Se le corrispondenze vengono modificate come segue,TLSRoute
corrisponde a SNI o ALPN:- matches: - sniHost: - example.com - alpn: - h2
Usa la specifica
tls_route.yaml
per creare la risorsaTLSRoute
:gcloud network-services tls-routes import helloworld-tls-route \ --source=tls_route.yaml \ --location=global
Cloud Service Mesh è configurato per bilanciare il carico del traffico per i servizi
specificati nella risorsa TLSRoute
tra i backend nel gruppo di istanze gestite.
Convalida il deployment
In questa sezione verifichi di poter accedere al servizio da un client esterno tramite il bilanciatore del carico di rete passthrough esterno e la risorsa Gateway
di Cloud Service Mesh.
Esegui questo comando
curl
per verificare la connettività HTTP al test che hai creato:curl https://example.com --resolve example.com:443:IP_ADDRESS -k
Il comando restituisce una risposta da una delle VM nel gruppo di istanze gestite. L'output è il seguente:
"path": "/", "headers": { "host": "example.com", "user-agent": "curl/7.81.0", "accept": "*/*" }, "method": "GET", "body": "", "fresh": false, "hostname": "example.com", "ip": "::ffff:10.142.0.2", "ips": [], "protocol": "https", "query": {}, "subdomains": [], "xhr": false, "os": { "hostname": "0cd3aec9b351" }, "connection": { "servername": "example.com" } }
Verifica con una verifica negativa
Puoi anche eseguire una verifica negativa. Se esegui i comandi in questa
sezione, la richiesta viene ignorata perché non corrisponde ai criteri di corrispondenza TLSRoute
.
Nel comando seguente, il valore SNI non corrisponde a example.com, quindi Gateway
rifiuta la connessione:
curl https://invalid-server.com --resolve invalid-server.com:443:IP_ADDRESS -k
Nel seguente comando, l'ALPN non corrisponde a h2 (protocollo HTTP2), quindi
Gateway
rifiuta la connessione:
curl https://example.com --resolve example.com:443:IP_ADDRESS -k --http1.1
Nel comando seguente, il client crea un testo normale (non criptato)
connessione, quindi Gateway
la rifiuta:
curl example.com:443 --resolve example.com:443:IP_ADDRESS -k
Tutti i comandi precedenti restituiscono il seguente errore:
curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection.
Passaggi successivi
- Per informazioni su come elencare le risorse di percorso associate a
Mesh
oGateway
risorsa, vedi Elenco di risorseRoute
. Questa funzionalità è in anteprima.