Proxylose gRPC-Dienste mit erweiterter Trafficverwaltung einrichten

Dieses Dokument bietet eine komplette Anleitung zum Konfigurieren von Traffic Director mit diesen Routing-Features:

  • Routenzuordnung
  • Trafficaufteilung

Konzeptionelle Informationen zu diesen Features finden Sie unter Erweiterte Trafficverwaltung.

Stellen Sie ein gRPC-Wallet-Beispiel zur Verfügung, um diese Features zu veranschaulichen. Wie im folgenden Diagramm dargestellt, erstellen Sie Back-End-Dienste für wallet-service, stats-service und account-service.

Beispielkonfiguration für das Traffic-Routing von gRPC-Wallet (zum Vergrößern anklicken)
Beispielkonfiguration für das Traffic-Routing von gRPC-Wallet (zum Vergrößern anklicken)

In diesem Beispiel stellen Sie mehrere Versionen jedes Dienstes bereit, um das Anfragerouting anhand der von Ihnen konfigurierten Regeln zu veranschaulichen. Wenn Sie das Erstellen und Bereitstellen verschiedener Versionen eines Dienstes simulieren möchten, verwenden Sie Server-Flags, um das Verhalten von Binärdateien zu ändern, die Sie nur einmal erstellen.

  • Das Flag --port gibt den Port an, den der Dienst auf der Back-End-VM überwacht.
  • Das Flag --hostname_suffix gibt einen Wert an, der an den Hostnamen der VM angehängt wird, die auf eine Anfrage antwortet. Der resultierende Wert wird als hostname-Metadaten in der Antwort hinzugefügt. So können Sie leichter feststellen, welche Instanz eines Back-End-Dienstes auf die Clientanfrage reagiert hat.
  • Das Flag --premium_only mit dem Wert true gibt an, dass der Dienst eine Premium-Version des Dienstes stats ist.
  • Das Flag --v1_behavior mit dem Wert true gibt an, dass sich die Wallet-Binärdatei als Version V1 verhält.
Dienst Instanzgruppe Instanzen Server-Flags
account account 2 --port=50053
--hostname_suffix="account"
stats stats 2 --port=50052
--hostname_suffix="stats"
--account_server="xds:///account.grpcwallet.io"
stats-premium stats-premium 2 --port=50052
--hostname_suffix="stats_premium"
--account_server="xds:///account.grpcwallet.io"
--premium_only=true
wallet-v1 wallet-v1 2 --port=50051
--hostname_suffix="wallet_v1"
--v1_behavior=true
--account_server="xds:///account.grpcwallet.io"
--stats_server="xds:///stats.grpcwallet.io"
wallet-v2 wallet-v2 2 --port=50051
--hostname_suffix "wallet_v2"
--account_server="xds:///account.grpcwallet.io"
--stats_server="xds:///stats.grpcwallet.io"

Anschließend konfigurieren Sie Traffic Director so, dass Anfragen an diese Dienste anhand der folgenden Routingregeln von einem Testclient weitergeleitet werden:

Host Übereinstimmungsregeln Routingaktion
wallet.grpcwallet.io Standardeinstellung wallet-v1
Vollständiger Pfad: /grpc.examples.wallet.Wallet/FetchBalance wallet-v1: 40 %
wallet-v2: 60 %
Pfadpräfix: /grpc.examples.wallet.Wallet/ wallet-v2
stats.grpcwallet.io Standardeinstellung stats
Pfadpräfix: "/"
Header: {"membership": "premium"}
stats-premium
account.grpcwallet.io Standardeinstellung account

gRPC-Systemdiagnose und -Firewallregel erstellen

In diesem Abschnitt erstellen Sie eine gRPC-Systemdiagnose und eine Firewallregel, damit gRPC-Systemdiagnoseanfragen Ihr Netzwerk erreichen. Später wird die gRPC-Systemdiagnose mit Back-End-Diensten verknüpft, um die Integrität der Back-Ends in diesen Back-End-Diensten zu prüfen.

gcloud

  1. Erstellen Sie die Systemdiagnose.

    gcloud compute health-checks create grpc grpcwallet-health-check \
      --use-serving-port
    
  2. Erstellen Sie die Firewallregel für die Systemdiagnose.

    gcloud compute firewall-rules create grpcwallet-allow-health-checks \
       --network default --action allow --direction INGRESS \
       --source-ranges 35.191.0.0/16,130.211.0.0/22 \
       --target-tags allow-health-checks \
       --rules tcp:50051-50053
    

Instanzvorlage erstellen

In diesem Abschnitt erstellen Sie eine Instanzvorlage, um den gRPC-Dienst account bereitzustellen, der über Port 50053 verfügbar gemacht wird.

gcloud

  1. Erstellen Sie die Instanzvorlage.

    gcloud compute instance-templates create grpcwallet-account-template \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=allow-health-checks \
      --image-family=debian-10 \
      --image-project=debian-cloud \
      --metadata-from-file=startup-script=<(echo '#! /bin/bash
    set -ex
    cd /root
    export HOME=/root
    sudo apt-get update -y
    curl -L https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples/archive/master.tar.gz | tar -xz
    cd traffic-director-grpc-examples-master/go/account_server/
    sudo apt-get install -y golang git
    go build .
    sudo systemd-run ./account_server --port 50053 --hostname_suffix account')
    

Verwaltete Instanzgruppe erstellen

Verwaltete Instanzgruppen verwenden bei Bedarf Autoscaling, um neue Back-End-VMs zu erstellen. In diesem Abschnitt erstellen Sie eine verwaltete Instanzgruppe mithilfe der Instanzvorlage, die Sie im vorherigen Abschnitt erstellt haben.

gcloud

  1. Erstellen Sie die Instanzgruppe.

    gcloud compute instance-groups managed create grpcwallet-account-mig-us-central1 \
      --zone us-central1-a \
      --size=2 \
      --template=grpcwallet-account-template
    

Benannten Port konfigurieren

In diesem Abschnitt konfigurieren Sie den benannten Port für den gRPC-Dienst. Der benannte Port ist der Port, den der gRPC-Dienst auf Anfragen überwacht. In diesem Beispiel lautet der benannte Port Port 50053.

gcloud

  1. Erstellen Sie den benannten Port.

    gcloud compute instance-groups set-named-ports grpcwallet-account-mig-us-central1 \
      --named-ports=grpcwallet-account-port:50053 \
      --zone us-central1-a
    

Back-End-Dienst erstellen

In diesem Abschnitt erstellen Sie einen globalen Back-End-Dienst mit einem Load-Balancing-Schema von INTERNAL_SELF_MANAGED und Protokoll GRPC. Sie verknüpfen dann die Systemdiagnose und die Instanzgruppe mit dem Back-End-Dienst. In diesem Beispiel verwenden Sie die verwaltete Instanzgruppe, die Sie unter Verwaltete Instanzgruppe erstellen erstellt haben. Diese verwaltete Instanzgruppe führt den gRPC-Dienst account aus. Der Port im Flag "--port-name" ist der benannte Port, den Sie unter Benannten Port konfigurieren erstellt haben.

gcloud

  1. Erstellen Sie den Back-End-Dienst und verknüpfen Sie die Systemdiagnose mit dem neuen Back-End-Dienst.

    gcloud compute backend-services create grpcwallet-account-service \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --protocol=GRPC \
        --port-name=grpcwallet-account-port \
        --health-checks grpcwallet-health-check
    
  2. Fügen Sie die verwaltete Instanzgruppe als Back-End hinzu.

    gcloud compute backend-services add-backend grpcwallet-account-service \
      --instance-group grpcwallet-account-mig-us-central1 \
      --instance-group-zone us-central1-a \
      --global
    

Die Schritte zum Erstellen der im gRPC-Wallet-Beispiel verwendeten verbleibenden Back-End-Dienste sind den obigen Schritten ähnlich. Sie erstellen die verbleibenden Dienste mit einem Shell-Skript. Das Skript stellt die folgenden Back-End-Dienste bereit:

  • stats
  • stats-premium
  • wallet-v1
  • wallet-v2

Führen Sie das Shell-Skript aus, mit dem die zusätzlichen Back-End-Dienste erstellt werden:

curl -O https://raw.githubusercontent.com/GoogleCloudPlatform/traffic-director-grpc-examples/master/scripts/create_service.sh
chmod +x ./create_service.sh

./create_service.sh go stats 50052 stats '--account_server="xds:///account.grpcwallet.io"'

./create_service.sh go stats 50052 stats-premium '--account_server="xds:///account.grpcwallet.io" --premium_only=true'

./create_service.sh java wallet 50051 wallet-v1 '--account_server="xds:///account.grpcwallet.io" --stats_server="xds:///stats.grpcwallet.io" --v1_behavior=true'

./create_service.sh java wallet 50051 wallet-v2 '--account_server="xds:///account.grpcwallet.io" --stats_server="xds:///stats.grpcwallet.io"'

Routingregeln erstellen

In diesem Abschnitt erstellen Sie eine URL-Zuordnung, die die virtuellen Hostnamen der Dienste in diesem Beispiel und die verknüpften Routingregeln angibt. Weitere Informationen finden Sie unter Routingregelzuordnungen.

In der URL-Zuordnung geben die hostRules die virtuellen Hostnamen der Dienste im Beispiel an. Das sind die Namen, die ein Client im Kanal-URI verwendet, um eine Verbindung zu einem bestimmten Dienst herzustellen. Um beispielsweise eine Anfrage an den Dienst account zu senden, verwendet ein Client xds:///account.grpcwallet.io im Kanal-URI. Sie müssen einen hosts-Eintrag mit dem Wert account.grpcwallet.io in den hostRules konfigurieren.

Der mit einem hosts-Eintrag verknüpfte pathMatcher gibt den Namen eines pathMatcher an, der alle Routingregeln für diesen virtuellen Host enthält. Eine pathMatcher-Konfiguration besteht aus übereinstimmenden Regeln und den entsprechenden Aktionsregeln. Das Beispiel führt zu folgender Konfiguration:

  • Wenn eine Anfrage an account.grpcwallet.io gesendet wird, senden Sie die Anfrage an den Back-End-Dienst grpcwallet-account-service.
  • Wenn eine Anfrage an stats.grpcwallet.io gesendet wird:
    • Wenn die Anfrage den Header membership mit dem Wert premium enthält, senden Sie die Anfrage an den Back-End-Dienst grpcwallet-stats-premium-service.
    • Andernfalls senden Sie die Anfrage an den Standard-Back-End-Dienst grpcwallet-stats-service.
  • Wenn eine Anfrage an wallet.grpcwallet.io gesendet wird:

    • Wenn der ServiceName/MethodName mit /grpc.examples.wallet.Wallet/FetchBalance übereinstimmt, werden 40 % dieser Anfragen an den Back-End-Dienst grpcwallet-wallet-v2-service und die verbleibenden Anfragen an den Back-End-Dienst grpcwallet-wallet-v1-service gesendet.
    • Wenn der ServiceName mit /grpc.examples.wallet.Wallet/ übereinstimmt, senden Sie die Anfrage unabhängig von der aufgerufenen Methode an den Back-End-Dienst grpcwallet-wallet-v1-service.

gcloud

Führen Sie folgenden Befehl aus, um die URL-Zuordnung zu erstellen:

export PROJECT_ID=$(gcloud config list --format 'value(core.project)')

gcloud compute url-maps import grpcwallet-url-map << EOF
defaultService: projects/$PROJECT_ID/global/backendServices/grpcwallet-account-service
name: grpcwallet-url-map
hostRules:
- hosts:
  - account.grpcwallet.io
  pathMatcher: grpcwallet-account-path-matcher
- hosts:
  - stats.grpcwallet.io
  pathMatcher: grpcwallet-stats-path-matcher
- hosts:
  - wallet.grpcwallet.io
  pathMatcher: grpcwallet-wallet-path-matcher
pathMatchers:
- defaultService: projects/$PROJECT_ID/global/backendServices/grpcwallet-account-service
  name: grpcwallet-account-path-matcher
- defaultService: projects/$PROJECT_ID/global/backendServices/grpcwallet-stats-service
  name: grpcwallet-stats-path-matcher
  routeRules:
  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: membership
        exactMatch: premium
    priority: 0
    service: projects/$PROJECT_ID/global/backendServices/grpcwallet-stats-premium-service
- defaultService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v1-service
  name: grpcwallet-wallet-path-matcher
  routeRules:
  - matchRules:
    - fullPathMatch: /grpc.examples.wallet.Wallet/FetchBalance
    priority: 0
    routeAction:
      weightedBackendServices:
      - backendService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v2-service
        weight: 40
      - backendService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v1-service
        weight: 60
  - matchRules:
    - prefixMatch: /grpc.examples.wallet.Wallet/
    priority: 1
    routeAction:
      weightedBackendServices:
      - backendService: projects/$PROJECT_ID/global/backendServices/grpcwallet-wallet-v2-service
        weight: 100
EOF

Zielproxy und Weiterleitungsregel erstellen

In diesem Abschnitt erstellen Sie den gRPC-Zielproxy und eine Weiterleitungsregel.

Der gRPC-Zielproxy verweist auf die URL-Zuordnung, die Sie im vorherigen Schritt erstellt haben. Das Flag --validate-for-proxyless aktiviert die Konfigurationsprüfungen, damit Sie nicht versehentlich ein Feature aktivieren, das nicht mit proxylosen gRPC-Bereitstellungen kompatibel ist.

gcloud

  1. Erstellen Sie den gRPC-Zielproxy.

    gcloud compute target-grpc-proxies create grpcwallet-proxy \
      --url-map grpcwallet-url-map \
      --validate-for-proxyless
    

Die Weiterleitungsregel verweist auf den von Ihnen erstellten gRPC-Zielproxy. Das Load-Balancing-Schema ist auf INTERNAL_SELF_MANAGED gesetzt, um anzugeben, dass diese Weiterleitungsregel von Traffic Director verwendet wird. Es muss eine globale Weiterleitungsregel sein. Die IP-Adresse wird auf 0.0.0.0 gesetzt, da ein proxyloser gRPC-Client den hostname:port im Ziel-URI auflöst. Dazu sendet er eine LDS-Anfrage an Traffic Director, anstatt eine DNS-Suche auszuführen. Weitere Informationen finden Sie unter Schema zur Namensauflösung.

Wenn im Ziel-URI kein Port angegeben ist, ist der Standardwert 80. Beispiel: Ein xds:///foo.myservice:8080-Ziel-URI stimmt mit einer Weiterleitungsregel überein, die mit Port 8080 konfiguriert ist. In diesem Beispiel wird die Weiterleitungsregel mit Port 80 konfiguriert.

gcloud

  1. Erstellen Sie die Weiterleitungsregel.

    gcloud compute forwarding-rules create grpcwallet-forwarding-rule \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --address=0.0.0.0 --address-region=us-central1 \
       --target-grpc-proxy=grpcwallet-proxy \
       --ports 80 \
       --network default
    

Konfiguration prüfen

Wenn der Konfigurationsvorgang abgeschlossen ist, prüfen Sie, ob die konfigurierten Back-End-Dienste verfügbar sind. Rufen Sie dazu die Seite "Traffic Director" in der Console auf. Prüfen Sie, ob die Back-End-Dienste und die zugehörigen Back-Ends als fehlerfrei gemeldet werden.

Routingkonfiguration prüfen

In diesem Abschnitt prüfen Sie, ob die Routingkonfiguration richtig funktioniert. Testen Sie die Konfiguration mit dem grpcurl-Tool.

gcloud

  1. Erstellen Sie eine Client-VM, auf der Sie die Clients ausführen, um den Dienst zu testen.

    gcloud compute instances create grpc-wallet-client \
      --zone us-central1-a \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --image-family=debian-10 \
      --image-project=debian-cloud \
      --metadata-from-file=startup-script=<(echo '#! /bin/bash
    set -e
    export GRPC_XDS_BOOTSTRAP=/run/td-grpc-bootstrap.json
    # Expose bootstrap variable to SSH connections
    echo export GRPC_XDS_BOOTSTRAP=$GRPC_XDS_BOOTSTRAP | sudo tee /etc/profile.d/grpc-xds-bootstrap.sh
    # Create the bootstrap file
    curl -L https://storage.googleapis.com/traffic-director/td-grpc-bootstrap-0.9.0.tar.gz | tar -xz
    ./td-grpc-bootstrap-0.9.0/td-grpc-bootstrap | tee $GRPC_XDS_BOOTSTRAP')
    
  2. Greifen Sie über SSH auf die VM zu.

Für den Zugriff auf die Dienste ohne Sidecar-Proxy muss der gRPC-Client das Namensauflösungsschema xds verwenden. Dieses Schema teilt der im Client verwendeten gRPC-Bibliothekmit, einen xDS-Server zur Auflösung des Hostnamens zu verwenden. Dazu ist eine Bootstrap-Konfiguration erforderlich. Das Startskript im vorherigen Abschnitt legt die Umgebungsvariable GRPC_XDS_BOOTSTRAP fest und verwendet ein Hilfsskript, um die Bootstrap-Datei zu erstellen. Die Werte für TRAFFICDIRECTOR_GCP_PROJECT_NUMBER, TRAFFICDIRECTOR_NETWORK_NAME und Zone in der erstellten Bootstrap-Datei werden vom Metadatenserver abgerufen, der diese Details zu Ihren Compute Engine-VM-Instanzen kennt. Sie können diese Werte mithilfe der Optionen -gcp-project-number und -vpc-network-name manuell im Hilfsskript angeben.

Konfiguration mit dem grpcurl-Tool prüfen

Installieren Sie zuerst das grpcurl-Tool.

curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.6.1/grpcurl_1.6.1_linux_x86_64.tar.gz | tar -xz
chmod +x grpcurl

Prüfen Sie dann mit den folgenden Befehlen, ob die Dienste Account, Stats und Wallet ausgeführt werden.

$ ./grpcurl -plaintext xds:///account.grpcwallet.io list
grpc.examples.wallet.account.Account
grpc.health.v1.Health
grpc.reflection.v1alpha.ServerReflection

$ ./grpcurl -plaintext -d '{"token": "2bd806c9"}' xds:///account.grpcwallet.io grpc.examples.wallet.account.Account/GetUserInfo
{
  "name": "Alice",
  "membership": "PREMIUM"
}

$ ./grpcurl -plaintext -H 'authorization:2bd806c9' -H 'membership:premium' xds:///stats.grpcwallet.io grpc.examples.wallet.stats.Stats/FetchPrice
{
  "price": "10295"
}

$ ./grpcurl -plaintext -H 'authorization:2bd806c9' -H 'membership:premium' -d '{"include_balance_per_address": true}' xds:///wallet.grpcwallet.io grpc.examples.wallet.Wallet/FetchBalance
{
  "balance": "5089953"
}

grpc-wallet-Clients zur Prüfung nutzen

Prüfen Sie die Konfiguration anhand der folgenden sprachspezifischen Anleitungen. Die Befehle senden mehrere RPCs, teilweise mit zusätzlichen Metadaten, um zu zeigen, dass Anfragen anhand der Zuordnungsregeln aus der URL-Zuordnung an Back-End-Dienste weitergeleitet werden. Der Befehl gibt auch für jede Antwort den Back-End-Hostnamen aus, um zu zeigen, an welchen Back-End-Dienst die Anfrage weitergeleitet wurde.

C++

  1. Führen Sie folgenden Befehl aus, um den Dienst mit einem gRPC-C++-Client zu prüfen:

    sudo apt-get update
    sudo apt-get install -y build-essential git
    
    git clone https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
    cd traffic-director-grpc-examples/cpp
    ../tools/bazel build :client
    
    # This command calls FetchBalance from the Wallet service in a loop, to demonstrate that
    # FetchBalance gets responses from wallet-v1 (40%) and wallet-v2 (60%).
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true
    
    # This command calls the streaming RPC WatchBalance from the Wallet
    # service. The RPC path matches the service prefix, so all requests are sent to wallet-v2.
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true
    
    # This command calls WatchPrice from the Stats service. It sends the
    # user's membership (premium or not) in metadata. Premium requests are
    # all sent to stats-premium, and get faster responses. Alice's requests
    # always go to premium, and Bob goes to regular.
    ../bazel-bin/cpp/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Bob
    ../bazel-bin/cpp/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Alice
    

Go

  1. Führen Sie folgenden Befehl aus, um den Dienst mit einem gRPC-Go-Client zu prüfen:

    sudo apt-get update
    sudo apt install -y golang git
    
    git clone https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
    cd traffic-director-grpc-examples/go/wallet_client
    go build .
    
    # This command calls FetchBalance from the Wallet service in a loop,
    # to demonstrate that FetchBalance gets responses from wallet-v1 (40%)
    # and wallet-v2 (60%).
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch
    
    # This command calls the streaming RPC WatchBalance from the Wallet
    # service. The RPC path matches the service prefix, so all requests
    # are sent to wallet-v2.
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch
    
    # This command calls WatchPrice from the Stats service. It sends the
    # user's membership (premium or not) in metadata. Premium requests are
    # all sent to stats-premium, and get faster responses. Alice's requests
    # always go to premium and Bob goes to regular.
    ./wallet_client price --stats_server="xds:///stats.grpcwallet.io" --watch --user=Bob
    ./wallet_client price --stats_server="xds:///stats.grpcwallet.io" --watch --user=Alice
    

Java

  1. Führen Sie folgenden Befehl aus, um den Dienst mit einem gRPC-Java-Client zu prüfen:

    sudo apt-get update
    sudo apt-get install -y openjdk-11-jdk-headless git
    
    git clone https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
    cd traffic-director-grpc-examples/java
    ./gradlew installDist
    
    # This command calls FetchBalance from the Wallet service in a loop,
    # to demonstrate that FetchBalance gets responses from wallet-v1 (40%)
    # and wallet-v2(60%).
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true
    
    # This command calls the streaming RPC WatchBalance from the Wallet
    # service. The RPC path matches the service prefix, so all requests are
    # sent to wallet-v2.
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true
    
    # This command calls WatchPrice from the Stats service. It sends the
    # user's membership (premium or not) in metadata. Premium requests are
    # all sent to stats-premium, and get faster responses. Alice's requests
    # always go to premium and Bob goes to regular.
    ./build/install/wallet/bin/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Bob
    ./build/install/wallet/bin/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Alice
    

Ressourcen bereinigen

Führen Sie dieses Skript aus, um die Ressourcen zu bereinigen.

bash <(curl -s https://raw.githubusercontent.com/GoogleCloudPlatform/traffic-director-grpc-examples/master/scripts/cleanup.sh)
gcloud compute instances delete grpc-wallet-client --zone us-central1-a -q

Weitere Informationen

Wenn während des Konfigurationsprozesses unerwartetes Verhalten aufgetreten ist, finden Sie entsprechende Informationen unter Fehlerbehebung bei proxylosen Traffic Director-Bereitstellungen und Traffic Director-Einschränkungen mit proxylosen gRPC-Diensten.