Benutzerdefinierte Header-Routing und Routing anhand von Abfrageparametern für externe HTTP(S)-Load-Balancer einrichten

Routing anhand von Abfrageparametern einrichten

In diesem Beispiel wird gezeigt, wie Anfrageparameter für A/B Testing verwendet werden, indem der Abfragestring abgeglichen wird.

Zwei Back-End-Instanzgruppen hinzufügen

Damit das Routing funktioniert, müssen Sie mehrere Back-Ends haben.

Zum Einrichten von zwei Back-Ends müssen sich die VMs in zwei Instanzgruppen befinden. In dieser Anleitung wird beschrieben, wie Sie verwaltete Instanzgruppen mit Linux-VMs erstellen, auf denen Apache ausgeführt wird, und wie Sie dann das Load-Balancing einrichten.

Die verwalteten Instanzgruppen stellen VMs bereit, die die Back-End-Server eines externen HTTP-Load-Balancers ausführen. Zu Demonstrationszwecken stellen Back-Ends ihre eigenen Hostnamen bereit.

Der Einfachheit halber befinden sich die Back-Ends in derselben Region. Wenn ein multiregionaler Standort eingerichtet werden soll, müssen Sie für die zweite Region eine Instanzvorlage einrichten.

Console

  1. Öffnen Sie in der Cloud Console die Seite Instanzgruppen.

    Zur Seite "Instanzgruppen"

  2. Klicken Sie auf Instanzgruppe erstellen.
  3. Wählen Sie links Neue verwaltete Instanzgruppe aus.
  4. Geben Sie im Feld Name first-example-ig ein.
  5. Wählen Sie unter Ort die Option Einzelne Zone aus.
  6. Wählen Sie als Region Ihre bevorzugte Region aus. In diesem Beispiel wird us-east1 verwendet.
  7. Wählen Sie us-east1-b als Zone aus.
  8. Wählen Sie unter Instanzvorlage die Option Neue Instanzvorlage erstellen aus.
  9. Geben Sie im Feld Name lb-backend-template ein.
  10. Das Bootlaufwerk sollte auf ein Debian-Image wie Debian GNU/Linux 9 (Stretch) eingestellt sein. Diese Anleitungen verwenden Befehle, die nur für Debian verfügbar sind, z. B. apt-get.
  11. Fügen Sie unter Verwaltung, Sicherheit, Laufwerke, Netzwerke, einzelne Mandanten auf dem Tab Verwaltung das folgende Skript in das Feld Startskript ein.

    #! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    
  12. Fügen Sie unter Netzwerk die Netzwerk-Tags hinzu: allow-health-check

  13. Klicken Sie auf Speichern und fortfahren.

  14. Geben Sie 2 bei Anzahl der Instanzen ein.

  15. Wählen Sie unter Autoscaling-Modus die Option Kein Autoscaling aus.

  16. Klicken Sie auf Erstellen, um die neue Instanzgruppe anzulegen.

Erstellen Sie eine weitere verwaltete Instanzgruppe wie diese. Nennen Sie den zweiten Namen second-example-ig und verwenden Sie die Vorlage lb-backend-template.

gcloud

  1. Erstellen Sie die Vorlage.

    gcloud compute instance-templates create lb-backend-template \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-9 \
       --image-project=debian-cloud \
       --metadata=startup-script='#! /bin/bash
         apt-get update
         apt-get install apache2 -y
         a2ensite default-ssl
         a2enmod ssl
         vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
         http://169.254.169.254/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
  2. Erstellen Sie die erste verwaltete Instanzgruppe anhand der Vorlage.

    gcloud compute instance-groups managed create first-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    
  3. Erstellen Sie die zweite verwaltete Instanzgruppe anhand der Vorlage.

    gcloud compute instance-groups managed create second-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-c
    

Firewallregel konfigurieren

In diesem Beispiel erstellen Sie die Firewallregel fw-allow-health-check. Dies ist eine Ingress-Regel, die Traffic von den Systemdiagnosen von Google Cloud (130.211.0.0/22 und 35.191.0.0/16) zulässt. In diesem Beispiel wird das Ziel-Tag allow-health-check zur Identifizierung der VMs verwendet.

Console

  1. Rufen Sie in der Google Cloud Console die Seite "Firewalls" auf.
    Zur Seite "Firewalls"
  2. Klicken Sie auf Firewallregel erstellen, um die zweite Firewallregel zu erstellen:
  3. Geben Sie als Namen fw-allow-health-check ein.
  4. Wählen Sie unter Netzwerk die Option Default aus.
  5. Wählen Sie unter Ziele Angegebene Ziel-Tags aus.
  6. Tragen Sie im Feld Ziel-Tags allow-health-check ein.
  7. Legen Sie für Quellfilter IP ranges fest.
  8. Legen Sie für Quell-IP-Bereiche die Werte 130.211.0.0/22 und 35.191.0.0/16 fest.
  9. Wählen Sie unter Protokolle und Ports die Option Angegebene Protokolle und Ports aus.
  10. Klicken Sie das Kästchen neben tcp an und geben Sie 80 als Portnummer ein.
  11. Klicken Sie auf Erstellen.

gcloud

gcloud compute firewall-rules create fw-allow-health-check \
    --network=default \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp

Externe IP-Adresse reservieren

Nachdem die Instanzen nun ausgeführt werden, richten Sie eine globale statische externe IP-Adresse ein, über die Ihre Kunden den Load-Balancer erreichen können.

Console

  1. Rufen Sie in der Google Cloud Console die Seite "Externe IP-Adressen" auf.
    Zur Seite "Externe IP-Adressen"
  2. Klicken Sie auf Statische Adresse reservieren, um eine IPv4-Adresse zu reservieren.
  3. Weisen Sie als Name lb-ipv4-1 zu.
  4. Legen Sie für die Netzwerkstufe Standard fest.
  5. Setzen Sie die IP-Version auf IPv4.
  6. Legen Sie für Typ Global fest.
  7. Klicken Sie auf Reservieren.
  8. Prüfen Sie, dass der Typ auf Global festgelegt ist.
  9. Klicken Sie auf Reservieren.

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --global

Notieren Sie sich die reservierte IPv4-Adresse:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

Load-Balancer-Back-Ends einrichten

Console

In der Cloud Console lassen sich aktuell kein headerbasiertes und parameterbasiertes Routing einrichten. Verwenden Sie stattdessen gcloud oder die API.

gcloud

  1. Erstellen Sie eine Systemdiagnose.
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. Erstellen Sie den ersten Back-End-Dienst.
        gcloud compute backend-services create service-a \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  3. Erstellen Sie den zweiten Back-End-Dienst.
        gcloud compute backend-services create service-b \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  4. Fügen Sie dem ersten Back-End-Dienst Ihre erste Instanzgruppe als Back-End hinzu.
        gcloud compute backend-services add-backend service-a \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=first-example-ig \
            --instance-group-zone=us-east1-b \
            --global
        
  5. Fügen Sie Ihre zweite Instanzgruppe als Back-End zum zweiten Back-End-Dienst hinzu.
        gcloud compute backend-services add-backend service-b \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=second-example-ig \
            --instance-group-zone=us-east1-c \
            --global
        

URL-Zuordnung erstellen

Console

In der Cloud Console lassen sich aktuell kein headerbasiertes und parameterbasiertes Routing einrichten. Verwenden Sie stattdessen gcloud oder die API.

gcloud

  1. Erstellen Sie eine YAML-Datei /tmp/web-map-http.yaml und ersetzen Sie dabei PROJECT_ID durch Ihre Projekt-ID.

    defaultService: https://www.googleapis.com/compute/v1/projects/[project-id]/global/backendServices/service-a
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    name: web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/[project-id]/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/[project-id]/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/[project-id]/global/backendServices/service-b
    selfLink: https://www.googleapis.com/compute/v1/projects/[project-id]/global/urlMaps/web-map-http
    
  2. Aktualisieren Sie die URL-Zuordnung.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

Zielproxy und Weiterleitungsregel erstellen

Console

In der Cloud Console lassen sich aktuell kein headerbasiertes und parameterbasiertes Routing einrichten. Verwenden Sie stattdessen gcloud oder die API.

gcloud

  1. Erstellen Sie einen HTTP-Ziel-Proxy, um Anfragen an Ihre URL-Zuordnung zu leiten.
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. Erstellen Sie eine globale Weiterleitungsregel, um eingehende Anfragen an den Proxy weiterzuleiten.
        gcloud compute forwarding-rules create http-content-rule \
            --address=lb-ipv4-1\
            --global \
            --target-http-proxy=http-lb-proxy \
            --ports=80
        

Testen

Notieren Sie sich die reservierte IPv4-Adresse:

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

Führen Sie folgenden Befehl aus, um diese Einrichtung zu testen:

curl http://[IP_ADDRESS]?ABTest=A
curl http://[IP_ADDRESS]?ABTest=B

Öffnen Sie http://[IP_ADDRESS]?ABTest=A und http://[IP_ADDRESS]?ABTest=B in einem Browser.

Routing anhand von benutzerdefinierten HTTP-Headern einrichten

In diesem Beispiel wird das Hinzufügen und Entfernen von benutzerdefinierten HTTP-Headern für intelligentes Routing veranschaulicht.

Vorbereitung

Sie können einen vorhandenen externen HTTP(S)-Load-Balancer verwenden oder einen neuen erstellen.

Sie können dieses Feature mit jedem der unterstützten Back-End-Typen verwenden. In diesem Beispiel wird davon ausgegangen, dass Sie VMs in einer Instanzgruppe verwenden.

Informationen zum Einrichten eines einfachen Load-Balancers finden Sie oben im Beispiel für die Einrichtung anhand von Abfrageparametern.

URL-Zuordnung aktualisieren

Console

In der Cloud Console lassen sich aktuell kein headerbasiertes und parameterbasiertes Routing einrichten. Verwenden Sie stattdessen gcloud oder die API.

gcloud

  1. Erstellen Sie eine YAML-Datei vom Typ /tmp/web-map-http.yaml.

    In diesem Beispiel wird gezeigt, wie HTTP-Anfrage-Header für A/B Testing verwendet werden, indem Werte in den HTTP-Headern der Anfrage abgeglichen werden.

    defaultService: $[DEFAULT_SERVICE_URL]
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: matcher1
    pathMatchers:
    - defaultService: $[DEFAULT_SERVICE_URL]
      name: matcher1
      routeRules:
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/[project-id]/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/[project-id]/global/backendServices/service-b
    
  2. Aktualisieren Sie die URL-Zuordnung.

    gcloud compute url-maps import web-map-http \
       --source /tmp/http-lb.yaml \
       --global