Internes TCP/UDP-Load-Balancing mit zonalen NEGs einrichten

In dieser Anleitung erfahren Sie, wie Sie einen internen TCP/UDP-Load-Balancer mit zonalen NEG-Back-Ends (Network Endpoint Group) bereitstellen. Zonale NEGs sind zonale Ressourcen, die Kombinationen aus IP-Adressen oder IP-Adressen/Port-Kombinationen für Google Cloud-Ressourcen in einem einzelnen Subnetz darstellen. Mit NEGs können Sie logische Gruppen von IP-Adressen oder IP-Adressen/Port-Kombinationen erstellen, die Softwaredienste anstelle von ganzen VMs darstellen.

Bevor Sie diese Anleitung durcharbeiten, sollten Sie sich mit Folgendem vertraut machen:

Internes TCP/UDP-Load-Balancing unterstützt nur zonale NEGs mit GCE_VM_IP-Endpunkten.

Berechtigungen

Damit Sie dieser Anleitung folgen können, müssen Sie Instanzen erstellen und ein Netzwerk in einem Projekt ändern können. Sie sollten entweder Inhaber oder Bearbeiter des Projekts sein oder über alle folgenden IAM-Rollen in Compute Engine verfügen:

Aufgabe Erforderliche Rolle
Netzwerke, Subnetze und Load-Balancer-Komponenten erstellen Netzwerkadministrator
Firewallregeln hinzufügen und löschen Sicherheitsadministrator
Instanzen erstellen Compute-Instanzadministrator

Weitere Informationen finden Sie in folgenden Leitfäden:

Einrichtung: Übersicht

Diese Anleitung zeigt Ihnen, wie Sie einen internen TCP/UDP-Load-Balancer mit zonalen GCE_VM_IP-NEG-Back-Ends konfigurieren und testen. Die Schritte in diesem Abschnitt zeigen, wie Sie folgende Elemente konfigurieren:

  1. Ein VPC-Netzwerk mit dem Namen lb-network und einem benutzerdefinierten Subnetz
  2. Firewall-Regeln, die eingehende Verbindung zu Back-End-VMs ermöglichen
  3. Vier VMs:
    • VMs vm-a1 und vm-a2 in Zone us-west1-a
    • VMs vm-c1 und vm-c2 in Zone us-west1-c
  4. Zwei zonale Back-End-NEGs, neg-a in Zone us-west1-a und neg-c in Zone us-west1-c. Jede NEG hat folgende Endpunkte:
    • neg-a enthält diese beiden Endpunkte:
      • Interne IP-Adresse der VM vm-a1
      • Interne IP-Adresse der VM vm-a2
    • neg-c enthält diese beiden Endpunkte:
      • Interne IP-Adresse der VM vm-c1
      • Interne IP-Adresse der VM vm-c2
  5. Eine Client-VM (vm-client) in us-west1-a zum Testen von Verbindungen
  6. Die folgenden Komponenten für den internen TCP/UDP-Load-Balancer:
    • Einen internen Back-End-Dienst in der Region us-west1, um die Verteilung von Verbindungen zu den zwei zonalen NEGs zu verwalten
    • Eine interne Weiterleitungsregel und eine interne IP-Adresse für das Front-End des Load-Balancers

Die Architektur dieses Beispiels sieht so aus:

Konfiguration des internen TCP/UDP-Load-Balancing mit zonalen NEGs
Konfiguration des internen TCP/UDP-Load-Balancings mit zonalen NEGs

Netzwerk, Region und Subnetz konfigurieren

Der auf dieser Seite beschriebene interne TCP/UDP-Load-Balancer wird in einem VPC-Netzwerk im benutzerdefinierten Modus mit dem Namen lb-network erstellt.

Die Back-End-VMs, die zonalen NEGs und die Komponenten des Load-Balancers aus diesem Beispiel befinden sich in dieser Region und diesem Subnetz:

  • Region: us-west1
  • Subnetz: lb-subnet, mit primärem IP-Adressbereich 10.1.2.0/24

Gehen Sie so vor, um das Netzwerk und das Subnetz zu erstellen:

Console

  1. Rufen Sie in der Google Cloud Console die Seite „VPC-Netzwerke“ auf.
    Zur VPC-Netzwerkseite
  2. Klicken Sie auf VPC-Netzwerk erstellen.
  3. Geben Sie als Name lb-network ein.
  4. Im Bereich Subnetze:
    • Legen Sie Modus für Subnetzerstellung auf Benutzerdefiniert fest.
    • Geben Sie im Bereich Neues Subnetz folgende Informationen ein:
      • Name: lb-subnet
      • Region: us-west1
      • IP-Adressbereich: 10.1.2.0/24
      • Klicken Sie auf Fertig.
  5. Klicken Sie auf Erstellen.

gcloud

  1. Erstellen Sie das benutzerdefinierte VPC-Netzwerk:

    gcloud compute networks create lb-network --subnet-mode=custom
    
    1. Erstellen Sie im Netzwerk lb-network ein Subnetz für Back-End-VMs in der Region us-west1:
    gcloud compute networks subnets create lb-subnet \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

Firewallregeln konfigurieren

Dieses Beispiel verwendet die folgenden Firewallregeln:

  • fw-allow-lb-access: Eine Regel für eingehenden Traffic, die für alle Ziele im VPC-Netzwerk gilt und Traffic aus Quellen im Bereich 10.1.2.0/24 zulässt. Diese Regel lässt eingehenden Traffic von jedem Client in lb-subnet zu.

  • fw-allow-ssh: eine Regel für eingehenden Traffic, die für die Instanzen mit Load-Balancing gilt und eingehende SSH-Verbindungen an TCP-Port 22 von jeder Adresse aus ermöglicht. Sie können einen restriktiveren IP-Quellbereich für diese Regel auswählen. Geben Sie dazu beispielsweise nur die IP-Bereiche des Systems an, von dem aus Sie SSH-Sitzungen initiieren. In diesem Beispiel wird das Ziel-Tag allow-ssh verwendet, um die VMs zu identifizieren, auf die sie angewendet werden soll.

Ohne diese Firewallregeln blockiert die Standardregel zum Ablehnen von eingehendem Traffic den eingehenden Traffic zu den Back-End-Instanzen.

Console

  1. Rufen Sie in der Google Cloud Console die Seite „Firewallregeln“ auf.
    Zur Seite "Firewallregeln"
  2. Klicken Sie auf Firewallregel erstellen und geben Sie folgende Informationen ein, um die Regel zu erstellen, die Subnetztraffic zulässt:
    • Name: fw-allow-lb-access
    • Netzwerk: lb-network
    • Priorität: 1000
    • Trafficrichtung: Eingehend
    • Aktion bei Übereinstimmung: Zulassen
    • Ziele: Alle Instanzen im Netzwerk
    • Quellfilter: IP ranges
    • Quell-IP-Bereiche: 10.1.2.0/24
    • Protokolle und Ports: Alle zulassen
  3. Klicken Sie auf Erstellen.
  4. Klicken Sie noch einmal auf Firewallregel erstellen, um die Regel zu erstellen, die eingehende SSH-Verbindungen zulässt:
    • Name: fw-allow-ssh
    • Netzwerk: lb-network
    • Priorität: 1000
    • Trafficrichtung: Eingehend
    • Aktion bei Übereinstimmung: Zulassen
    • Ziele: Angegebene Ziel-Tags
    • Ziel-Tags: allow-ssh
    • Quellfilter: IP ranges
    • Quell-IP-Bereiche: 0.0.0.0/0
    • Protokolle und Ports: Wählen Sie Angegebene Protokolle und Ports aus und geben Sie Folgendes ein: tcp:22
  5. Klicken Sie auf Erstellen.
  6. Klicken Sie ein drittes Mal auf Firewallregel erstellen, um die Regel zum Zulassen von Google Cloud-Systemdiagnosen zu erstellen:
    • Name: fw-allow-health-check
    • Netzwerk: lb-network
    • Priorität: 1000
    • Trafficrichtung: Eingehend
    • Aktion bei Übereinstimmung: Zulassen
    • Ziele: Angegebene Ziel-Tags
    • Ziel-Tags: allow-health-check
    • Quellfilter: IP ranges
    • Quell-IP-Bereiche: 130.211.0.0/22 und 35.191.0.0/16
    • Protokolle und Ports: Alle zulassen
  7. Klicken Sie auf Erstellen.

gcloud

  1. Erstellen Sie die Firewallregel fw-allow-lb-access, um die Kommunikation mit dem Subnetz zuzulassen:

    gcloud compute firewall-rules create fw-allow-lb-access \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24 \
        --rules=tcp,udp,icmp
    
  2. Erstellen Sie die Firewallregel fw-allow-ssh, um SSH-Verbindungen zu VMs mit dem Netzwerk-Tag allow-ssh zu ermöglichen. Wenn Sie source-ranges weglassen, bezieht Google Cloud die Regel auf jede Quelle.

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  3. Erstellen Sie die Regel fw-allow-health-check, um Google Cloud-Systemdiagnosen zuzulassen.

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

VMs und Netzwerk-Endpunktgruppen erstellen

Um den regionalen Charakter des internen TCP/UDP-Load-Balancings zu veranschaulichen, verwendet dieses Beispiel zwei zonale NEG-Back-Ends, neg-a und neg-c, in den Zonen us-west1-a und us- west1-c. Für den Traffic wird über beide NEGs und über die Endpunkte innerhalb jedes NEGs Load-Balancing durchgeführt.

VMs erstellen

Um dieses Beispiel zu unterstützen, führt jede der vier VMs einen Apache-Webserver aus, der die folgenden TCP-Ports überwacht: 80, 8008, 8080, 8088, 443 und 8443.

Jeder VM wird eine interne IP-Adresse im lb-subnet und eine sitzungsspezifische externe (öffentliche) IP-Adresse zugewiesen. Sie können die externen IP-Adressen später entfernen.

Externe IP-Adressen sind für Back-End-VMs nicht erforderlich. Für dieses Beispiel sind sie aber nützlich, da sie den VMs ermöglichen, Apache aus dem Internet herunterzuladen, und vereinfachen die Verbindung über SSH. Standardmäßig ist Apache so konfiguriert, dass eine Bindung an eine beliebige IP-Adresse erfolgt. Interne TCP/UDP-Load-Balancer stellen Pakete unter Übernahme der Ziel-IP-Adresse bereit.

Stellen Sie sicher, dass die Serversoftware, die auf Ihren VMs läuft, auf die IP-Adresse der internen Weiterleitungsregel des Load-Balancers hört.

Der Einfachheit halber wird auf diesen Back-End-VMs Debian GNU/Linux 10 ausgeführt.

Console

VMs erstellen

  1. Rufen Sie in der Google Cloud Console die Seite „VM-Instanzen” auf.
    Zur Seite "VM-Instanzen"
  2. Wiederholen Sie die nachstehenden Schritte, um vier VMs mit den folgenden Kombinationen aus Name und Zone zu erstellen.
    • Name: vm-a1, Zone: us-west1-a
    • Name: vm-a2, Zone: us-west1-a
    • Name: vm-c1, Zone: us-west1-c
    • Name: vm-c2, Zone: us-west1-c
  3. Klicken Sie auf Instanz erstellen.
  4. Legen Sie den Namen wie in Schritt 2 angegeben fest.
  5. Wählen Sie für die Region us-west1 aus und legen Sie die Zone wie in Schritt 2 angegeben fest.
  6. Achten Sie im Bereich Bootlaufwerk darauf, dass als Bootlaufwerk-Optionen das Betriebssystem Debian und die Version 10 (Buster) ausgewählt sind. Klicken Sie auf Auswählen, um das Image bei Bedarf zu ändern.
  7. Klicken Sie auf Verwaltung, Sicherheit, Laufwerke, Netzwerke, einzelne Mandanten und nehmen Sie die folgenden Änderungen vor:

    • Klicken Sie auf Netzwerk und fügen Sie die folgenden Netzwerk-Tags hinzu: allow-ssh und allow-health-check
    • Klicken Sie unter Netzwerkschnittstellen auf Bearbeiten , nehmen Sie die folgenden Änderungen vor und klicken Sie dann auf Fertig:
      • Netzwerk: lb-network
      • Subnetz: lb-subnet
      • Primäre interne IP: flüchtig (automatisch)
      • Externe IP: sitzungsspezifisch
    • Klicken Sie auf Verwaltung. Kopieren Sie den folgenden Skriptinhalt und fügen Sie ihn im Feld Startskript ein. Der Skriptinhalt ist für alle vier VMs gleich:

      #! /bin/bash
      if [ -f /etc/startup_script_completed ]; then
      exit 0
      fi
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      file_ports="/etc/apache2/ports.conf"
      file_http_site="/etc/apache2/sites-available/000-default.conf"
      file_https_site="/etc/apache2/sites-available/default-ssl.conf"
      http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
      http_vh_prts="*:80 *:8008 *:8080 *:8088"
      https_listen_prts="Listen 443\nListen 8443"
      https_vh_prts="*:443 *:8443"
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      prt_conf="$(cat "$file_ports")"
      prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
      prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
      echo "$prt_conf" | tee "$file_ports"
      http_site_conf="$(cat "$file_http_site")"
      http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
      echo "$http_site_conf_2" | tee "$file_http_site"
      https_site_conf="$(cat "$file_https_site")"
      https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
      echo "$https_site_conf_2" | tee "$file_https_site"
      systemctl restart apache2
      touch /etc/startup_script_completed
      
  8. Klicken Sie auf Erstellen.

gcloud

Erstellen Sie die vier VMs. Führen Sie dazu den folgenden Befehl viermal aus und verwenden Sie die nachstehenden vier Kombinationen für [VM-NAME] und [ZONE]. Der Skriptinhalt ist für alle vier VMs identisch.

  • [VM-NAME]: vm-a1; [ZONE]: us-west1-a
  • [VM-NAME]: vm-a2; [ZONE]: us-west1-a
  • [VM-NAME]: vm-c1; [ZONE]: us-west1-c
  • [VM-NAME]: vm-c2; [ZONE]: us-west1-c

    gcloud compute instances create VM-NAME \
        --zone=ZONE \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    

Zonale GCE_VM_IP-NEGs erstellen

Die NEGs (neg-a und neg-c) müssen in den Zonen erstellt werden, in denen sich die im vorherigen Schritt erstellten VMs befinden.

Console

In der Cloud Console können Sie die zonalen GCE_VM_IP-NEGs nicht erstellen oder verwalten. Verwenden Sie stattdessen gcloud oder die REST API.

gcloud

  1. Erstellen Sie mit dem Befehl gcloud compute network-endpoint-groups create eine zonale GCE_VM_IP-NEG mit dem Namen neg-a in us-west1-a:

    gcloud compute network-endpoint-groups create neg-a \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-a \
        --network=lb-network \
        --subnet=lb-subnet
    
  2. Fügen Sie Endpunkte zu neg-a hinzu:

    gcloud compute network-endpoint-groups update neg-a \
        --zone=us-west1-a \
        --add-endpoint='instance=vm-a1' \
        --add-endpoint='instance=vm-a2'
    
  3. Erstellen Sie mit dem Befehl gcloud compute network-endpoint-groups create eine zonale GCE_VM_IP-NEG mit dem Namen neg-c in us-west1-c:

    gcloud compute network-endpoint-groups create neg-c \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-c \
        --network=lb-network \
        --subnet=lb-subnet
    
  4. Fügen Sie Endpunkte zu neg-c hinzu:

    gcloud compute network-endpoint-groups update neg-c \
        --zone=us-west1-c \
        --add-endpoint='instance=vm-c1' \
        --add-endpoint='instance=vm-c2'
    

Client-VM erstellen

In diesem Beispiel wird eine Client-VM (vm-client) erstellt, die sich in derselben Region wie die Back-End-VMs (Server) befindet. Der Client validiert die Konfiguration des Load-Balancers und demonstriert das erwartete Verhalten, wie im Abschnitt "Test" beschrieben.

Console

  1. Rufen Sie in der Google Cloud Console die Seite „VM-Instanzen” auf.
    Zur Seite „VM-Instanzen”
  2. Klicken Sie auf Instanz erstellen.
  3. Legen Sie als Name vm-client fest.
  4. Setzen Sie Zone auf us-west1-a.
  5. Klicken Sie auf Verwaltung, Sicherheit, Laufwerke, Netzwerke, einzelne Mandanten und nehmen Sie die folgenden Änderungen vor:
    • Klicken Sie auf Vernetzung und fügen Sie allow-ssh an die Netzwerk-Tags hinzu.
    • Klicken Sie unter Netzwerkschnittstellen auf die Schaltfläche "Bearbeiten", nehmen Sie die folgenden Änderungen vor und klicken Sie auf Fertig:
      • Netzwerk: lb-network
      • Subnetz: lb-subnet
      • Primäre interne IP: flüchtig (automatisch)
      • Externe IP: sitzungsspezifisch
  6. Klicken Sie auf Erstellen.

gcloud

Die Client-VM kann sich in einer beliebigen Zone in derselben Region wie der Load-Balancer befinden. Außerdem kann sie jedes Subnetz in dieser Region verwenden. In diesem Beispiel befindet sich der Client in der Zone us-west1-a und verwendet dasselbe Subnetz wie die Back-End-VMs.

gcloud compute instances create vm-client \
    --zone=us-west1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=lb-subnet

Komponenten für den Load-Balancer konfigurieren

Mit den folgenden Schritten konfigurieren Sie alle internen TCP/UDP-Load-Balancer-Komponenten:

  • Back-End-Dienst: In diesem Beispiel müssen Sie HTTP-Traffic über den Load-Balancer weiterleiten. Sie müssen also TCP anstelle von UDP verwenden.

  • Weiterleitungsregel: Dieses Beispiel erstellt eine einzelne interne Weiterleitungsregel.

  • Interne IP-Adresse: In diesem Beispiel geben Sie beim Erstellen der Weiterleitungsregel eine interne IP-Adresse (10.1.2.99) an.

Console

gcloud

  1. Erstellen Sie eine neue regionale HTTP-Systemdiagnose.

    gcloud compute health-checks create http hc-http-80 \
        --region=us-west1 \
        --port=80
    
  2. Erstellen Sie den Back-End-Dienst:

    gcloud compute backend-services create bs-ilb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  3. Fügen Sie dem Back-End-Dienst die beiden zonalen NEGs neg-a und neg-c hinzu:

    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-a \
        --network-endpoint-group-zone=us-west1-a
    
    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-c \
        --network-endpoint-group-zone=us-west1-c
    
  4. Erstellen Sie eine Weiterleitungsregel für den Back-End-Dienst. Wenn Sie die Weiterleitungsregel erstellen, geben Sie für die interne IP-Adresse im Subnetz den Wert 10.1.2.99 an.

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=bs-ilb \
        --backend-service-region=us-west1
    

Test

Dieser Test nimmt von einer separaten Client-VM Verbindung mit dem Load-Balancer auf, also nicht von einer Back-End-VM des Load-Balancers. Dabei wird folgendes Verhalten erwartet: Der Traffic wird zwischen den vier Back-End-VMs verteilt, da keine Sitzungsaffinität konfiguriert wurde.

  1. Stellen Sie eine Verbindung zur Client-VM-Instanz her.

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. Stellen Sie mit curl eine Webanfrage an den Load-Balancer, um dessen IP-Adresse zu kontaktieren. Wiederholen Sie die Anfrage. So können Sie sehen, dass Antworten von verschiedenen Back-End-VMs stammen. Der Name der VM, die die Antwort generiert, wird aufgrund des Inhalts von /var/www/html/index.html auf jeder Back-End-VM im Text der HTML-Antwort angezeigt. Die erwarteten Antworten sehen so aus: Page served from: vm-a1, Page served from: vm-a2, usw.

    curl http://10.1.2.99
    

    Die Weiterleitungsregel ist für die Bereitstellung der Ports 80, 8008, 8080 und 8088 konfiguriert. Um Traffic an diese anderen Ports zu senden, hängen Sie nach der IP-Adresse einen Doppelpunkt (:) und die Portnummer an:

    curl http://10.1.2.99:8008
    

Nächste Schritte