Multi-Cluster-Mesh-Failover einrichten

Auf dieser Seite wird beschrieben, wie Sie eine Strategie für das Weiterleiten von Traffic mit hoher Verfügbarkeit mithilfe von Cloud Service Mesh in einer Multi-Cluster-Umgebung entwerfen und implementieren. In der folgenden Tabelle wird das erwartete Verhalten beschrieben:

Clusterstatus Traffic-Verhalten
Beide Cluster sind fehlerfrei 50% des Traffics an Cluster A, 50% an Cluster B
Cluster A ist nicht mehr verfügbar 100% des Traffics an Cluster B
Cluster A wird wiederhergestellt Stellt die Aufteilung 50/50 automatisch wieder her

Vorbereitung

Sie sollten Folgendes bereits haben:

  • Sie haben zwei GKE-Cluster erstellt, die im selben Flotten-Hostprojekt registriert sind, in zwei verschiedenen Regionen, die für Cloud Service Mesh konfiguriert sind.
  • Multi-Cluster-Mesh-Netzwerk in Cloud Service Mesh einrichten
  • Die Istio-Steuerungsebene ist in beiden Clustern installiert und konfiguriert.
  • istio-ingressgateway wird in mindestens einem Cluster (Cluster A) bereitgestellt und verfügbar gemacht.
  • Die hello-world-Anwendung wird in beiden Clustern mit aktivierter Sidecar-Injektion bereitgestellt.

In diesem Lab werden die folgenden Regionen verwendet:

  • Cluster A:europe-west1
  • Cluster B:us-central1

Failover für Multi-Cluster-Mesh einrichten

  1. Stellen Sie das öffentliche Ingress-Gateway mit dem Beispielmanifest aus dem Cloud Service Mesh-Repository bereit und wenden Sie es an:

    cat <<EOF> istio-ingressgateway.yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: public-gateway
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - '*'
    EOF
    
    kubectl apply -f istio-ingressgateway.yaml
    

    Dieses Gateway macht den hello-world-Dienst extern verfügbar.

  2. Erstellen Sie in Cluster A ein VirtualService und wenden Sie es an, um Traffic an den hello-world-Dienst weiterzuleiten:

    cat <<EOF> virtual-service.yaml
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: hello-world
      namespace: default
    spec:
      hosts:
      - '*'
      gateways:
      - public-gateway
      http:
      - route:
        - destination:
            host: hello-world.default.svc.cluster.local
    EOF
    
    kubectl apply -f virtual-service.yaml
    

    Bei dieser Konfiguration werden HTTP-Anfragen vom Gateway an den Dienst weitergeleitet.

  3. DestinationRule für standortbasiertes Failover konfigurieren und anwenden

    cat <<EOF> destination-rule.yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: hello-world
      namespace: default
    spec:
      host: hello-world.default.svc.cluster.local
      trafficPolicy:
        connectionPool:
          http:
            http2MaxRequests: 100
        outlierDetection:
          consecutive5xxErrors: 1
          interval: 1s
          baseEjectionTime: 30s
          maxEjectionPercent: 100
        loadBalancer:
          localityLbSetting:
            enabled: true
            distribute:
            - from: europe-west1
              to:
                europe-west1: 50
                us-central1: 50
            - from: us-central1
              to:
                us-central1: 50
                europe-west1: 50
    EOF
    
    kubectl apply -f destination-rule.yaml
    

Wichtige Hinweise:

  • Mit localityLbSetting unter DestinationRule können Sie den Traffic gleichmäßig aufteilen und ein automatisches Failover einrichten.
  • Mit maxEjectionPercent kann Istio den gesamten Traffic auf andere Endpunkte umleiten, wenn alle Endpunkte an einem Standort fehlerhaft sind.
  • distribute:sorgt für eine gleichmäßige Aufteilung (50/50) zwischen den Clustern basierend auf der Region des Quellclusters.
  • Failover:Wird implizit verarbeitet, wenn ein Standort nicht mehr verfügbar ist. Istio leitet 100% des Traffics an die fehlerfreie Region weiter.
  • outlierDetection:Schließt fehlerhafte Endpunkte nach Erreichen minimaler Fehlerschwellenwerte aus.

Validieren

Sie können dieses Verhalten jetzt so prüfen:

  1. Anfragen über das Ingress-Gateway in Cluster A senden.
  2. Herunterskalieren von hello-world-Pods in europe-west1 auf 0.
  3. Beobachten Sie, wie der Traffic auf us-central1 umgeleitet wird.
  4. Skalieren Sie die Pods in europe-west1 wieder hoch und prüfen Sie, ob die Trafficaufteilung wieder aufgenommen wird.