Externen Passthrough-Network-Load-Balancer mit Zielpool einrichten

Dieser Leitfaden enthält eine Anleitung zum Erstellen der Konfiguration eines externen Passthrough-Network-Load-Balancers mit Zielpool-Back-Ends. Im zugehörigen Beispiel wird davon ausgegangen, dass mehrere Webserver auf Compute Engine-Instanzen vorhanden sind, auf die der Traffic verteilt werden kann. In diesem Szenario wird ein Layer-4-Load-Balancing konfiguriert, um HTTP-Traffic an fehlerfreie Instanzen zu senden. Die Konfiguration grundlegender HTTP-Systemdiagnosen stellt dabei sicher, dass Traffic nur an fehlerfreie Instanzen gesendet wird.

In diesem Beispiel wird ein Load-Balancing für HTTP-Traffic festgelegt. Sie können jedoch zielpoolbasierte externe Passthrough-Network-Load-Balancer verwenden, um Load-Balancing für TCP-, UDP- und SSL-Traffic auszuführen. Lesen Sie vorher den Artikel Übersicht über externen Passthrough-Network-Load-Balancer, um konzeptionelle Informationen zu erhalten.

Hinweise

Installieren Sie die Google Cloud CLI. Eine vollständige Übersicht über das Tool finden Sie unter Überblick über das gcloud-Befehlszeilentool. Befehle für das Load-Balancing finden Sie in der Befehlsgruppe gcloud compute.

Ausführliche Hilfe zu jedem gcloud-Befehl erhalten Sie auch mit dem Flag --help:

gcloud compute http-health-checks create --help

Wenn Sie die Google Cloud CLI noch nicht ausgeführt haben, führen Sie zuerst gcloud init zur Authentifizierung aus.

Erstellen Sie außerdem für den Load-Balancer eine statische externe IP-Adresse. Wenn Sie ein von Compute Engine bereitgestelltes Image verwenden, werden die VM-Instanzen automatisch für diese IP-Adresse konfiguriert. Wenn Sie ein anderes Image verwenden, müssen Sie diese Adresse als Alias auf "eth0" oder als Loopback auf den einzelnen Instanzen konfigurieren.

In dieser Anleitung wird davon ausgegangen, dass Sie mit Bash vertraut sind.

Compute Engine-VM-Instanzen konfigurieren

Für dieses Load-Balancing-Szenario erstellen Sie drei Compute Engine-VM-Instanzen und installieren darauf Apache. Sie fügen außerdem eine Firewallregel hinzu, die HTTP-Traffic zu den Instanzen zulässt.

Instanzen, die als Backend-VMs für externe Passthrough-Network-Load-Balancer verwendet werden, müssen die entsprechende Linux-Gastumgebung, Windows-Gastumgebung oder andere Prozesse ausführen, die gleichwertige Funktionen bereitstellen.

Backend-Instanzen einrichten

Console

  1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zu Seite „VM-Instanzen“

  2. Klicken Sie auf Instanz erstellen.

  3. Legen Sie als Name www1 fest.

  4. Legen Sie für Region den Wert us-central1 fest.

  5. Setzen Sie Zone auf us-central1-b.

  6. Unter Bootlaufwerk ist bereits das Standard-Betriebssystem-Image von Debian GNU/Linux 10 (buster) ausgewählt.

  7. Klicken Sie auf Erweiterte Optionen.

  8. Klicken Sie auf Netzwerk und konfigurieren Sie das folgende Feld:

    1. Geben Sie bei Netzwerk-Tags den Wert network-lb-tag ein.
  9. Klicken Sie auf Verwaltung. Fügen Sie im Feld Startskript das nachfolgende Skript ein.

     #! /bin/bash
     sudo apt-get update
     sudo apt-get install apache2 -y
     sudo service apache2 restart
     echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html
     

    1. Klicken Sie auf Erstellen.
  10. Erstellen Sie eine Instanz namens www2 mit den gleichen Einstellungen, aber mit dem folgenden Skript im Feld Automatisierung/Startskript.

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html
     

  11. Erstellen Sie eine Instanz namens www3 mit den gleichen Einstellungen, aber mit dem folgenden Skript im Feld Automatisierung/Startskript.

        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html
      

gcloud

Alle im Folgenden aufgeführten Befehle werden auf dem lokalen System ausgeführt und beziehen sich auf eine Eingabeaufforderung vom Typ bash.

Zum Aufrufen von Namen, Attributen und Status von Betriebssystem-Images verwenden Sie den Befehl gcloud compute images list.

  1. Erstellen Sie drei neue VMs in einer bestimmten Zone und legen Sie für alle das gleiche Tag fest. In diesem Beispiel wird die Zone auf us-central1-b gesetzt. Wenn Sie einen Wert für das Feld tags festlegen, können Sie auf alle diese Instanzen gleichzeitig verweisen, z. B. mit einer Firewallregel. Mit diesen Befehlen wird außerdem Apache auf den Instanzen installiert und jeder Instanz eine einmalige Homepage zugewiesen.

    gcloud compute instances create www1 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www2 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www3 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"

API

Instanz www1 in der Zone us-central1-b mit der Methode instances.insert erstellen

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances

{
  "canIpForward": false,
  "deletionProtection": false,
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "autoDelete": true,
      "deviceName": "www1",
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20220719",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
      }
    ]
  },
  "name": "www1",
  "networkInterfaces": [
    {
      "network": "projects/[PROJECT_ID]/global/networks/default",
      "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default"
    }
  ],
  "tags": {
    "items": [
      "network-lb-tag"
    ]
  }
}

Erstellen Sie die Instanzen www2 und www3 mit den gleichen Einstellungen, ersetzen Sie jedoch www1 in den Feldern deviceName, value und name.

Firewallregel erstellen, um externen Traffic zu diesen VM-Instanzen zuzulassen

Console

  1. Rufen Sie in der Google Cloud Console die Seite der Firewall-Richtlinien auf.

    Zu den Firewall-Richtlinien

  2. Klicken Sie auf Firewallregel erstellen.

  3. Geben Sie für www-firewall-network-lb einen Namen ein.

  4. Wählen Sie unter Netzwerk das Netzwerk aus, für das die Firewallregel gelten soll (Standard).

  5. Wählen Sie unter Ziele Angegebene Zieltags aus.

  6. Geben Sie im Feld Zieltags network-lb-tag ein.

  7. Legen Sie unter Quellfilter die Option IPv4-Bereiche fest.

  8. Legen Sie für IPv4-Quellbereiche den Wert 0.0.0.0/0 fest, damit Traffic von allen Quellen zulässig ist.

  9. Klicken Sie unter Angegebene Protokolle und Ports das Kästchen TCP an und geben Sie 80 ein.

  10. Klicken Sie auf Erstellen. Es kann einen Moment dauern, bis die neue Firewallregel in der Console angezeigt wird. Klicken Sie gegebenenfalls auf Aktualisieren, damit die Regel aufgeführt wird.

gcloud

gcloud compute firewall-rules create www-firewall-network-lb \
    --target-tags network-lb-tag --allow tcp:80

API

Firewallregel zum Zulassen des gesamten Traffics im Subnetz mit der **Methode** firewalls.insert erstellen

POST https://compute.googleapis.com/compute/projects/[PROJECT_ID]/global/firewalls

{
  "name": "www-firewall-network-lb",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [
    "network-lb-tag"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    }
  ],
  "sourceRanges": [
    "0.0.0.0/0"
  ]
}

Externe IP-Adressen der Instanzen abrufen und prüfen, ob sie ausgeführt werden

Console

  1. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zur Seite „VM-Instanzen“

  2. Rufen Sie die Adressen für die Instanzen in der Spalte Externe IP auf.

  3. Prüfen Sie, ob die Instanzen ausgeführt werden. Dies ist am grünen Häkchen links neben dem Instanznamen zu erkennen. Wenn kein grünes Häkchen angezeigt wird, finden Sie entsprechende Informationen unter Allgemeine Fehlerbehebung.

gcloud

  1. Listen Sie die Instanzen auf, um die IP-Adressen in der Spalte EXTERNAL_IP darzustellen.

    gcloud compute instances list
    
  2. Prüfen Sie, ob alle Instanzen ausgeführt werden.

    Führen Sie in der Befehlszeile den Befehl curl mit der externen IP-Adresse der einzelnen Instanzen aus, um festzustellen, ob die Instanzen antworten.

    curl http://[IP_ADDRESS]
    

API

Informationen zur Instanz www1 mit der Methode instances.get abrufen

Prüfen Sie, ob im Feld status der Wert RUNNING angegeben ist, und prüfen Sie im Feld natIP die externe IP-Adresse.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1

{
 "kind": "compute#instance",
 "id": "6734015273571474749",
 "creationTimestamp": "2018-11-09T11:45:23.487-08:00",
 "name": "www1",
 "description": "",
 "tags": {
  "items": [
   "network-lb-tag"
  ],
  "fingerprint": "9GVlO4gPawg="
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
 "status": "RUNNING",
 "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b",
 "canIpForward": false,
 "networkInterfaces": [
  {
   "kind": "compute#networkInterface",
   "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
   "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default",
   "networkIP": "10.128.0.2",
   "name": "nic0",
   "accessConfigs": [
    {
     "kind": "compute#accessConfig",
     "type": "ONE_TO_ONE_NAT",
     "name": "External NAT",
     "natIP": "35.192.37.233",
     "networkTier": "PREMIUM"
    }
   ],
   "fingerprint": "lxD5f5ua_sw="
  }
 ],
 "disks": [
  {
   "kind": "compute#attachedDisk",
   "type": "PERSISTENT",
   "mode": "READ_WRITE",
   "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1",
   "deviceName": "www1",
   "index": 0,
   "boot": true,
   "autoDelete": true,
   "licenses": [
    "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-10-buster"
   ],
   "interface": "SCSI",
   "guestOsFeatures": [
    {
     "type": "VIRTIO_SCSI_MULTIQUEUE"
    }
   ]
  }
 ],
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "IyHRmHoJx6E=",
  "items": [
   {
    "key": "startup-script",
    "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html"
   }
  ]
 },
 "serviceAccounts": [
  {
   "email": "674259759219-compute@developer.gserviceaccount.com",
   "scopes": [
    "https://www.googleapis.com/auth/devstorage.read_only",
    "https://www.googleapis.com/auth/logging.write",
    "https://www.googleapis.com/auth/monitoring.write",
    "https://www.googleapis.com/auth/servicecontrol",
    "https://www.googleapis.com/auth/service.management.readonly",
    "https://www.googleapis.com/auth/trace.append"
   ]
  }
 ],
 "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1",
 "scheduling": {
  "onHostMaintenance": "MIGRATE",
  "automaticRestart": true,
  "preemptible": false
 },
 "cpuPlatform": "Intel Haswell",
 "labelFingerprint": "42WmSpB8rSM=",
 "startRestricted": false,
 "deletionProtection": false
}

Wiederholen Sie diesen API-Aufruf für www2 und www3.

Load-Balancing-Dienst konfigurieren

Richten Sie als Nächstes den Load-Balancing-Dienst ein.

Durch entsprechende Konfiguration des Load-Balancing-Dienstes erhalten die VM-Instanzen Pakete für die von Ihnen konfigurierte statische externe IP-Adresse. Wenn Sie ein von Compute Engine bereitgestelltes Image verwenden, werden die Instanzen automatisch für diese IP-Adresse konfiguriert. Wenn Sie ein anderes Image verwenden, müssen Sie diese Adresse als Alias auf eth0 oder als Loopback auf den einzelnen Instanzen konfigurieren.

Console

Sie können die Google Cloud Console nicht verwenden, um zielpoolbasierte externe Passthrough-Network-Load-Balancer zu erstellen. Verwenden Sie stattdessen entweder gcloud oder die REST API.

gcloud

  1. Erstellen Sie eine statische externe IP-Adresse für den Load-Balancer.

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. Fügen Sie eine Ressource für die Legacy-Systemdiagnose hinzu.

    In diesem Beispiel werden die Standardeinstellungen für die Systemdiagnose verwendet. Sie können diese Einstellungen jederzeit anpassen.

    gcloud compute http-health-checks create basic-check
    
  3. Zielpool hinzufügen

    Fügen Sie den Zielpool in der Region hinzu, in der sich die VM-Instanzen befinden. Verwenden Sie für diesen Zielpool die im vorigen Schritt erstellte Systemdiagnose. Für das Funktionieren von Zielpools ist ein Systemdiagnosedienst erforderlich.

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. Fügen Sie die Instanzen dem Zielpool hinzu.

    gcloud compute target-pools add-instances www-pool \
        --instances www1,www2,www3 \
        --instances-zone us-central1-b
    

    Instanzen innerhalb eines Zielpools müssen zwar einer Region angehören, können aber über verschiedene Zonen in dieser Region verteilt sein. Beispielsweise kann ein Zielpool Instanzen in Zone us-central1-f und Instanzen in Zone us-central1-b enthalten, da sich diese in derselben Region (us-central1) befinden.

  5. Weiterleitungsregel hinzufügen

    Fügen Sie eine Weiterleitungsregel für einen externen IP-Adressbereich und Portbereich hinzu, die auf den Zielpool verweist. Geben Sie für das Feld --address entweder die numerische IP-Adresse oder den vollqualifizierten Namen an.

    gcloud compute forwarding-rules create www-rule \
        --region us-central1 \
        --ports 80 \
        --address network-lb-ip-1 \
        --target-pool www-pool
    

API

  1. Erstellen Sie eine statische externe IP-Adresse für den Load-Balancer.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. Fügen Sie eine Legacy-HTTP-Systemdiagnose hinzu.

    In diesem Beispiel werden die Standardeinstellungen für die Systemdiagnose verwendet. Sie können diese Einstellungen jederzeit anpassen.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
    {
      "name": "basic-check"
    }
    
  3. Fügen Sie einen Zielpool hinzu.

    Fügen Sie den Zielpool in der Region hinzu, in der sich die VM-Instanzen befinden. Verwenden Sie für diesen Zielpool die im vorigen Schritt erstellte Systemdiagnose. Für das Funktionieren von Zielpools ist ein Systemdiagnosedienst erforderlich.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools
    {
      "name": "www-pool",
      "healthChecks": [
        "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check"
      ]
    }
    
  4. Fügen Sie die Instanzen dem Zielpool hinzu.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance
    {
      "instances": [
        {
          "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1"
        }
      ]
    }
    

    Wiederholen Sie diesen API-Aufruf für die Instanzen www2 und www3.

    Instanzen innerhalb eines Zielpools müssen zwar einer Region angehören, können aber über verschiedene Zonen in dieser Region verteilt sein. Beispielsweise kann ein Zielpool Instanzen in Zone us-central1-f und Instanzen in Zone us-central1-b enthalten, da sich diese in derselben Region (us-central1) befinden.

  5. Weiterleitungsregel hinzufügen

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules
    {
      "name": "www-rule",
      "portRange": "80",
      "loadBalancingScheme": "EXTERNAL",
      "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb"
    }
    

Traffic an die Instanzen senden

Nachdem Sie den Load-Balancing-Dienst konfiguriert haben, können Sie Traffic an die Weiterleitungsregel senden und feststellen, wie dieser auf verschiedene Instanzen verteilt wird.

Externe IP-Adresse der Weiterleitungsregel abrufen

Console

  1. Wechseln Sie in der Google Cloud Console auf der Load-Balancing-Seite Erweitert zum Tab Weiterleitungsregeln.
    Zum Tab "Weiterleitungsregeln"
  2. Suchen Sie die vom Load-Balancer verwendete Weiterleitungsregel www-rule.
  3. Notieren Sie die in der Spalte IP-Adresse für www-rule angegebene externe IP-Adresse.

gcloud

Geben Sie den folgenden Befehl ein, um die externe IP-Adresse der vom Load-Balancer verwendeten Weiterleitungsregel www-rule aufzurufen:

gcloud compute forwarding-rules describe www-rule --region us-central1

API

Externe IP-Adresse der Weiterleitungsregel www-rule mit der Methode forwardingRules.get aufrufen

Suchen Sie in der Ausgabe nach dem Feld IPAddress.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule
{
  "kind": "compute#forwardingRule",
  "id": "5133886346582800002",
  "creationTimestamp": "2018-11-09T14:21:33.574-08:00",
  "name": "www-rule",
  "description": "",
  "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1",
  "IPAddress": "35.232.228.9",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule",
  "loadBalancingScheme": "EXTERNAL",
  "networkTier": "PREMIUM"
}

ICMP wird für Backend-Instanzen nicht unterstützt

Externe Passthrough-Network-Load-Balancer liefern keine ICMP-Pakete an Backend-Instanzen. Wenn Sie ein ICMP-Paket senden, z. B. mit ping oder traceroute, stammt die Antwort nicht von den Backend-Instanzen des Load-Balancers.

Die Google Cloud-Infrastruktur kann eine ICMP-Antwort senden, auch wenn Sie Firewallregeln verwenden, die ICMP-Traffic auf den Back-End-Instanzen des Load-Balancers verbieten. Dieses Verhalten kann nicht geändert werden.

Auf die externe IP-Adresse mit dem Befehl curl zugreifen

Die Antwort des Befehls curl wechselt nach dem Zufallsprinzip zwischen den drei Instanzen. Wenn anfangs keine Antwort zurückgegeben wird, müssen Sie vor einem erneuten Versuch unter Umständen etwa 30 Sekunden warten, bis die Konfiguration vollständig geladen ist und die Instanzen als fehlerfrei markiert werden:

$ while true; do curl -m1 IP_ADDRESS; done

Nächste Schritte