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-ingressgatewaywird 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
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.yamlDieses Gateway macht den
hello-world-Dienst extern verfügbar.Erstellen Sie in Cluster A ein
VirtualServiceund wenden Sie es an, um Traffic an denhello-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.yamlBei dieser Konfiguration werden HTTP-Anfragen vom Gateway an den Dienst weitergeleitet.
DestinationRulefür standortbasiertes Failover konfigurieren und anwendencat <<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:
- Anfragen über das Ingress-Gateway in Cluster A senden.
- Herunterskalieren von
hello-world-Pods ineurope-west1auf 0. - Beobachten Sie, wie der Traffic auf
us-central1umgeleitet wird. - Skalieren Sie die Pods in
europe-west1wieder hoch und prüfen Sie, ob die Trafficaufteilung wieder aufgenommen wird.