Gateway-TLS-Routing einrichten
In dieser Anleitung wird gezeigt, wie Sie ein Envoy-Proxy-basiertes Ingress-Gateway mit den Ressourcen Gateway
und TLSRoute
einrichten. Eine TLSRoute
-Ressource kann auch an eine Mesh
-Ressource angehängt werden, um das TLS-Passthrough-Routing mit einem Sidecar-Proxy einzurichten.
Die von Ihnen konfigurierte Bereitstellung wird im folgenden Diagramm dargestellt. Ein regionaler Netzwerk-Load-Balancer leitet den Traffic an Envoy-Proxys weiter, die als Ingress-Gateway fungieren. Die Envoy-Proxys verwenden TLS-Passthrough-Routing und leiten Traffic an HTTPS-Server weiter, die auf den Back-End-VM-Instanzen ausgeführt werden.
Hinweis
Prüfen Sie, ob Ihre Bereitstellung die in den folgenden Anleitungen beschriebenen Voraussetzungen erfüllt:
- Einrichten von Traffic Director mit Envoy vorbereiten
- Leitfaden für die Einrichtung von Dienstrouting für Traffic Director
Firewallregeln konfigurieren
In diesem Abschnitt erstellen Sie Firewallregeln, um eingehende Systemdiagnoseverbindungen zu VM-Instanzen in Ihrem Netzwerk zuzulassen.
Firewallregel erstellen
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
Konfigurieren Sie Firewallregeln, um Traffic von jeder Quelle zuzulassen. Bearbeiten Sie die Befehle für Ihre Ports und Quell-IP-Adressbereiche:
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
IAM-Berechtigungen (Identity and Access Management) konfigurieren
In diesem Abschnitt legen Sie das Dienstkonto für die Gateway-Proxys fest und weisen dem Dienstkonto die richtigen IAM-Rollen zu.
Erstellen Sie eine Dienstkontoidentität für die Gateway-Proxys:
gcloud iam service-accounts create gateway-proxy
Weisen Sie der Dienstkontoidentität die erforderlichen IAM-Rollen zu:
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"
Gateway
-Ressource konfigurieren
Erstellen Sie in einer Datei mit dem Namen
gateway443.yaml
dieGateway
-Spezifikation für HTTP-Traffic:name: gateway443 scope: gateway-proxy ports: - 443 type: OPEN_MESH
Erstellen Sie die
Gateway
-Ressource mit der Spezifikationgateway443.yaml
:gcloud network-services gateways import gateway443 \ --source=gateway443.yaml \ --location=global
Verwaltete Instanzgruppe mit Envoy-Proxys erstellen
In diesem Abschnitt erstellen Sie die Envoy-Proxys, die dem Ingress-Gateway zugeordnet sind.
Erstellen Sie eine Instanzvorlage für eine VM, auf der ein automatisch bereitgestellter Envoy-Dienstproxy ausgeführt wird. Bei den Envoys ist der Bereich auf
gateway-proxy
festgelegt. Übergeben Sie den Bereitstellungsport nicht als Parameter des Flags--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
Erstellen Sie eine regional verwaltete Instanzgruppe anhand der Instanzvorlage.
gcloud compute instance-groups managed create gateway-proxy \ --region=REGION \ --size=1 \ --template=gateway-proxy
Legen Sie den Namen des Bereitstellungsports für die verwaltete Instanzgruppe fest:
gcloud compute instance-groups managed set-named-ports gateway-proxy \ --named-ports=https:443 \ --region=REGION
Regionales Netzwerk-Load-Balancing einrichten
In diesem Abschnitt erstellen Sie einen Netzwerk-Load-Balancer.
Erstellen Sie eine statische, externe, regionale IP-Adresse:
gcloud compute addresses create xnlb-REGION \ --region=REGION
Rufen Sie die IP-Adresse ab, die für den externen Load-Balancer reserviert ist:
gcloud compute addresses describe xnlb-REGION \ --region=REGION --format='value(address)'
Diese IP-Adresse wird später in dieser Einrichtungsanleitung als die Variable
IP_ADDRESS
verwendet.Erstellen Sie eine Systemdiagnose für die Gateway-Proxys.
gcloud compute health-checks create tcp xnlb-REGION \ --region=REGION \ --use-serving-port
Erstellen Sie einen Back-End-Dienst für die Gateway-Proxys:
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
Fügen Sie die verwaltete Instanzgruppe als Back-End hinzu.
gcloud compute backend-services add-backend xnlb-REGION \ --instance-group=gateway-proxy \ --instance-group-region=REGION \ --region=REGION
Erstellen Sie eine Weiterleitungsregel, um Traffic an die Gateway-Proxys weiterzuleiten:
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
Verwaltete Instanzgruppe konfigurieren, die einen HTTPS-Dienst ausführt
Zu Demonstrationszwecken erstellen Sie einen Back-End-Dienst mit automatisch skalierten VMs in einer verwalteten Instanzgruppe. Die VMs geben Details zu Webanfragen mithilfe des HTTPS-Protokoll an Port 443
zurück.
Erstellen Sie eine Instanzvorlage mit einem HTTPS-Dienst, der über Port
443
verfügbar gemacht wird: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'
Erstellen Sie anhand der Instanzvorlage eine verwaltete Instanzgruppe:
gcloud compute instance-groups managed create https-td-mig-us-REGION \ --zone=ZONE \ --size=2 \ --template=td-https-vm-template
Legen Sie den Namen des Bereitstellungsports für die verwaltete Instanzgruppe fest:
gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \ --named-ports=https:443 \ --zone=ZONE
Erstellen Sie eine Systemdiagnose.
gcloud compute health-checks create https https-helloworld-health-check \ --port=443
Erstellen Sie eine Firewallregel, um eingehende Systemdiagnoseverbindungen zu Instanzen in Ihrem Netzwerk zuzulassen.
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
Erstellen Sie einen globalen Back-End-Dienst mit dem Load-Balancing-Schema
INTERNAL_SELF_MANAGED
und fügen Sie die Systemdiagnose hinzu:gcloud compute backend-services create https-helloworld-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --port-name=https \ --health-checks https-helloworld-health-check
Fügen Sie dem Back-End-Dienst die verwaltete Instanzgruppe als Back-End hinzu:
gcloud compute backend-services add-backend https-helloworld-service \ --instance-group=https-td-mig-us-REGION \ --instance-group-zone=ZONE \ --global
Routing mit einer TLSRoute
-Ressource einrichten
In den vorherigen Abschnitten haben Sie eine Gateway
-Ressource und einen HTTPS-Server konfiguriert.
Als Nächstes verbinden Sie sie mithilfe einer TLSRoute
-Ressource, die einen SNI-Hostnamen mit einem Back-End-Dienst verknüpft.
Erstellen Sie in einer Datei mit dem Namen
tls_route.yaml
die SpezifikationTLSRoute
.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
In der vorherigen Anweisung stimmt
TLSRoute
mitexample.com
als SNI undh2
als ALPN überein. Wenn die Übereinstimmungen so geändert werden, stimmtTLSRoute
mit SNI oder ALPN überein:- matches: - sniHost: - example.com - alpn: - h2
Verwenden Sie die Spezifikation
tls_route.yaml
, um dieTLSRoute
-Ressource zu erstellen.gcloud network-services tls-routes import helloworld-tls-route \ --source=tls_route.yaml \ --location=global
Traffic Director ist so konfiguriert, dass der Traffic für die in der TLSRoute
-Ressource angegebenen Dienste über die Back-Ends in der Netzwerk-Endpunktgruppe verteilt wird.
Deployment validieren
In diesem Abschnitt überprüfen Sie, ob Sie von einem externen Client über den Netzwerk-Load-Balancer und die Gateway
-Ressource von Traffic Director auf den Dienst zugreifen können.
Führen Sie den folgenden
curl
-Befehl aus, um die HTTP-Konnektivität zu den von Ihnen erstellten Testdiensten zu überprüfen:curl https://example.com --resolve example.com:443:IP_ADDRESS -k
Der Befehl gibt eine Antwort von einer der VMs in der verwalteten Instanzgruppe zurück. Die Ausgabe sieht so aus:
"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" } }
Mit negativer Verifizierung prüfen
Sie können auch eine negative Verifizierung ausführen. Wenn Sie die Befehle in diesem Abschnitt ausführen, wird die Anfrage verworfen, da sie nicht den Übereinstimmungskriterien von TLSRoute
entspricht.
Im folgenden Befehl stimmt die SNI nicht mit „example.com” überein, sodass Gateway
die Verbindung ablehnt.
curl https://invalid-server.com --resolve invalid-server.com:443:IP_ADDRESS -k
Im folgenden Befehl stimmt die ALPN nicht mit h2 (HTTP2-Protokoll) überein, sodass Gateway
die Verbindung ablehnt.
curl https://example.com --resolve example.com:443:IP_ADDRESS -k --http1.1
Im folgenden Befehl erstellt der Client eine Nur-Text-Verbindung (unverschlüsselt), also lehnt Gateway
die Verbindung ab:
curl example.com:443 --resolve example.com:443:IP_ADDRESS -k
Die obigen Befehle geben alle den folgenden Fehler zurück:
curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection.