HTTP(S)-Load-Balancing mit Cloud Run for Anthos einbinden

In dieser Anleitung wird gezeigt, wie HTTP(S)-Load-Balancing mit Cloud Run for Anthos in Google Cloud-Diensten anstelle von Netzwerk-Load-Balancing verwendet wird, um Dienste im Internet freizugeben.

HTTP(S)-Load-Balancing bietet globales Load-Balancing und lässt sich in verschiedene Produkte und Features der Google Cloud einbinden, wie Google Cloud Armor, Cloud CDN, Cloud Identity-Aware Proxy (Cloud IAP) und verwaltete TLS-Zertifikate für HTTPS-Traffic.

Kubernetes Ingress und Istio Ingress Gateway

In dieser Anleitung werden zwei ähnlich benannte und ähnliche Konzepte verwendet. Es ist wichtig, die folgenden Unterschiede bei der Durchführung dieser Anleitung zu verstehen:

  • Das Istio Ingress Gateway definiert Regeln für die Weiterleitung von externem HTTP-/TCP-Traffic zu Diensten in einem Kubernetes-Cluster. Es ist als Kubernetes-Dienst und als Kubernetes-Deployment implementiert.
  • Kubernetes Ingress definiert Regeln für die Weiterleitung von externem HTTP-Traffic an einen oder mehrere Kubernetes-Dienste in einem Cluster. Wenn Sie ein Kubernetes Ingress-Objekt in einem GKE-Cluster erstellen, stellt GKE die für das HTTP(S)-Load-Balancing erforderlichen Ressourcen bereit.

In dieser Anleitung verwenden Sie eine Kubernetes Ingress-Ressource, um externen Traffic an das Istio Ingress Gateway weiterzuleiten. Das Istio Ingress Gateway leitet dann den Traffic an die Dienste im Cluster weiter, wie das folgende Diagramm zeigt.

Diagramm, das zeigt, wie externer HTTP-/TCP-Traffic weitergeleitet wird.

Sie können das Istio Ingress Gateway für die Weiterleitung an mehrere Dienste innerhalb desselben GKE-Clusters verwenden.

Ziele

  • GKE-Cluster mit aktiviertem Cloud Run erstellen.
  • Einen virtuellen Istio-Dienst zur Verarbeitung von Systemdiagnoseanfragen erstellen.
  • Das Kubernetes-Dienstobjekt des Istio Ingress Gateways so ändern, dass es von einem Kubernetes Ingress-Objekt bereitgestellt werden kann.
  • Das HTTP(S)-Load-Balancing durch Erstellen eines Kubernetes Ingress-Objekts konfigurieren.
  • Einen Beispieldienst zur Überprüfung der Lösung bereitstellen.

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Vorbereitung

  1. Wählen Sie ein Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  2. Aktivieren Sie die Abrechnung für Ihr Cloud-Projekt.

  3. Aktivieren Sie die GKE, Cloud Run, and Google Cloud APIs.

    APIs aktivieren

  4. Öffnen Sie Cloud Shell in der Cloud Console.

    Cloud Shell öffnen

    Unten in der Cloud Console wird eine Cloud Shell-Sitzung mit einer Eingabeaufforderung geöffnet. Cloud Shell ist eine Shell-Umgebung, in der das Cloud SDK einschließlich des gcloud-Befehlszeilentools vorinstalliert ist. Die Werte sind bereits für Ihr aktuelles Projekt festgelegt. Das Initialisieren der Sitzung kann einige Sekunden dauern.

    Für alle Befehle in dieser Anleitung wird Cloud Shell verwendet.

GKE-Cluster mit Cloud Run erstellen

  • GKE-Cluster mit dem Cloud Run-Add-On erstellen:

    CLUSTER=cloudrun-gke-gclb-tutorial
    ZONE=us-central1-f
    
    gcloud container clusters create $CLUSTER \
        --addons HorizontalPodAutoscaling,HttpLoadBalancing,CloudRun \
        --enable-ip-alias \
        --enable-stackdriver-kubernetes \
        --release-channel regular \
        --zone $ZONE
    

    In dieser Anleitung wird cloudrun-gke-gclb-tutorial als Clustername und us-central1-f als Zone verwendet. Sie können diese Werte ändern. Weitere Informationen hierzu finden Sie unter Geografie und Regionen.

    Informationen zu den Optionen im Befehl finden Sie hier:

    • Mit dem HttpLoadBalancing-Add-on können Kubernetes Ingress-Objekte das HTTP(S)-Load-Balancing für den Cluster konfigurieren.

    • Die Option --enable-ip-alias macht den Cluster VPC-nativ. Diese Option ist erforderlich, wenn Sie – wie in dieser Anleitung vorgegeben – containernatives Load-Balancing verwenden möchten.

    • Die Option --enable-stackdriver-kubernetes aggregiert mithilfe von Cloud Operations for GKE Logs, Ereignisse und Messwerte aus dem Cluster. Sie ist für das Cloud Run-Add-on erforderlich.

Systemdiagnoseanfragen bearbeiten

  • Erstellen Sie einen virtuellen Istio-Dienst, mit dem der Cluster auf Load-Balancing-Systemdiagnoseanfragen dadurch reagieren kann, dass er die Anfragen an den Statusendpunkt auf dem Istio Ingress Gateway weiterleitet:

    Der von Ihnen erstellte virtuelle Dienst ist mit der Istio-Gateway-Ressource gke-system-gateway verknüpft, die vom Cloud Run-Add-on installiert wird.

    kubectl apply -f - <<EOF
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: health
      namespace: knative-serving
    spec:
      gateways:
      - gke-system-gateway
      hosts:
      - "*"
      http:
      - match:
        - headers:
            user-agent:
              prefix: GoogleHC
          method:
            exact: GET
          uri:
            exact: /
        rewrite:
          authority: istio-ingress.gke-system.svc.cluster.local:15020
          uri: /healthz/ready
        route:
        - destination:
            host: istio-ingress.gke-system.svc.cluster.local
            port:
              number: 15020
    EOF
    

Istio Ingress Gateway für die Verwendung mit Kubernetes Ingress ändern

  1. Erstellen Sie eine JSON Patch-Datei, um Änderungen am Istio Ingress Gateway vorzunehmen:

    cat <<EOF > istio-ingress-patch.json
    [
      {
        "op": "replace",
        "path": "/spec/type",
        "value": "NodePort"
      },
      {
        "op": "remove",
        "path": "/status"
      }
    ]
    EOF
    
  2. Wenden Sie die Patchdatei an und fügen Sie das Ingress Gateway als Back-End hinzu:

    kubectl -n gke-system patch svc istio-ingress \
        --type=json -p="$(cat istio-ingress-patch.json)" \
        --dry-run=true -o yaml | kubectl apply -f -
    kubectl annotate svc istio-ingress -n gke-system cloud.google.com/neg='{"exposed_ports": {"80":{}}}'
    

    Mit diesem Patch werden die folgenden Änderungen am Kubernetes-Dienstobjekt des Istio Ingress Gateways vorgenommen:

    • Fügt die Anmerkung cloud.google.com/neg: '{"ingress": true}' hinzu. Diese Anmerkung erstellt eine Netzwerk-Endpunktgruppe und aktiviert containernatives Load-Balancing, wenn das Kubernetes Ingress-Objekt erstellt wird.
    • Der Kubernetes-Diensttyp wird von LoadBalancer in NodePort geändert. Durch diese Änderung werden die Ressourcen für das Netzwerk-Load-Balancing entfernt.

Kubernetes Ingress-Objekt erstellen

  1. Erstellen Sie ein Kubernetes Ingress-Objekt mit dem Namen my-ingress:

    kubectl apply -f - <<EOF
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: my-ingress
      namespace: gke-system
    spec:
      backend:
        serviceName: istio-ingress
        servicePort: 80
    EOF
    

    Dieses Ingress-Objekt sendet den gesamten eingehenden Traffic an den Kubernetes-Dienst istio-ingress im Namespace gke-system.

    Wenn Sie ein Kubernetes Ingress-Objekt in einem GKE-Cluster erstellen, erstellt GKE die für das HTTP(S)-Load-Balancing erforderlichen Ressourcen.

  2. Beobachten Sie den Fortschritt des vorhergehenden Befehls und warten Sie, bis sich die my-ingress ADDRESS in eine IP-Adresse ändert:

    kubectl get ingress my-ingress -n gke-system --watch
    

    Wenn Sie nicht mehr warten möchten, drücken Sie Control+C.

  3. Erstellen Sie eine Umgebungsvariable, um die IP-Adresse des Kubernetes Ingress-Objekts zu speichern:

    INGRESS_IP=$(kubectl get ingress my-ingress -n gke-system \
        --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
    

Dienst bereitstellen und Lösung prüfen

  1. Beispieldienst namens my-service für Cloud Run for Anthos bereitstellen:

    gcloud run deploy my-service \
        --namespace default \
        --image gcr.io/knative-samples/simple-api \
        --platform gke \
        --cluster $CLUSTER \
        --cluster-location $ZONE
    

    Nach Erstellen des Kubernetes Ingress-Objekts kann es einige Minuten dauern, bis das HTTP-Load-Balancing Traffic weiterleiten kann. In der Zwischenzeit erhalten Sie unter Umständen Fehler wie HTTP/1.1 404 Not Found oder HTTP/1.1 502 Bad Gateway, wenn Sie Anfragen an Dienste im Cluster senden.

  2. Senden Sie alle zwei Sekunden eine HTTP-GET-Anfrage an den Beispieldienst:

    while sleep 2; do
      curl -siH "Host: my-service.default.example.com" $INGRESS_IP | head -n1
    done
    

    Beobachten Sie die Ausgabe, bis Sie Folgendes sehen:

    HTTP/1.1 200 OK
    

    Drücken Sie Control+C, um das Senden von Anfragen zu beenden.

  3. Senden Sie eine HTTP-GET-Anfrage an den Beispieldienst:

    curl -s -w"\n" -H "Host: my-service.default.example.com" $INGRESS_IP
    

    Die Ausgabe sieht so aus:

    OK
    

Fehlerbehebung

Wenn Sie Probleme mit dieser Anleitung haben, lesen Sie diese Dokumente:

Bereinigen

Wenn Sie Kosten für Ihr Google Cloud-Konto für die in dieser Anleitung verwendeten Ressourcen vermeiden möchten, können Sie das Cloud-Projekt, das Sie für diese Anleitung erstellt haben, oder die mit dieser Anleitung verknüpften Ressourcen löschen.

Cloud-Projekt löschen

Am einfachsten können Sie die Abrechnung deaktivieren, wenn Sie das Cloud-Projekt löschen, das Sie für die Anleitung erstellt haben.

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Ressourcen löschen

Wenn Sie das in dieser Anleitung verwendete Cloud-Projekt beibehalten möchten, löschen Sie den GKE-Cluster:

gcloud container clusters delete $CLUSTER --zone $ZONE --async --quiet

Nächste Schritte