Configura il failover di Multi-cluster Mesh
Questa pagina mostra come progettare e implementare una strategia di routing del traffico ad alta disponibilità utilizzando Cloud Service Mesh in un ambiente multi-cluster. La tabella seguente descrive il comportamento previsto:
| Stato cluster | Comportamento del traffico |
|---|---|
| Entrambi i cluster sono integri | 50% del traffico al cluster A, 50% al cluster B |
| Il cluster A non è più disponibile | 100% del traffico verso il cluster B |
| Il cluster A viene ripristinato | Ripristina automaticamente la divisione 50/50 |
Prerequisiti
Come punto di partenza, questa guida presuppone che tu abbia già:
- Sono stati creati due cluster GKE registrati nello stesso progetto host del parco risorse in due regioni diverse configurate per Cloud Service Mesh.
- Configura un mesh multi-cluster su Cloud Service Mesh.
- Control plane Istio installato e configurato in entrambi i cluster.
istio-ingressgatewayè stato eseguito il deployment ed è esposto in almeno un cluster (cluster A).- Applicazione
hello-worlddi cui è stato eseguito il deployment in entrambi i cluster con l'iniezione sidecar abilitata.
Questo lab utilizza le seguenti regioni:
- Cluster A:
europe-west1 - Cluster B:
us-central1
Configura il failover del mesh multi-cluster
Esegui il deployment e applica il gateway in entrata pubblico utilizzando il manifest di esempio dal repository Cloud Service Mesh:
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.yamlQuesto gateway espone esternamente il servizio
hello-world.Crea e applica un
VirtualServicenel cluster A per instradare il traffico al serviziohello-world: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.yamlQuesta configurazione inoltra le richieste HTTP dal gateway al servizio.
Configura e applica un
DestinationRuleper il failover basato sulla località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
Tieni presente quanto segue:
- L'impostazione localityLbSetting nella DestinationRule consente anche la suddivisione del traffico e il failover automatico.
- maxEjectionPercent consente a Istio di eseguire il failover di tutto il traffico se ogni endpoint di una località non è integro.
- distribute:garantisce una suddivisione equa 50/50 tra i cluster, in base alla regione del cluster di origine.
- Failover:viene gestito implicitamente quando una località non è più disponibile. Istio indirizza il 100% del traffico alla regione integra.
- outlierDetection:espelle gli endpoint non riusciti dopo le soglie di errore minime.
Convalida
Ora puoi convalidare questo comportamento:
- Invio di richieste tramite il gateway Ingress nel cluster A.
- Riduzione a zero dei pod
hello-worldineurope-west1. - Osservazione del failover del traffico su
us-central1. - Aumentando di nuovo il numero di pod in
europe-west1e verificando che la suddivisione del traffico riprenda.