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à:

Questo lab utilizza le seguenti regioni:

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

Configura il failover del mesh multi-cluster

  1. 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.yaml
    

    Questo gateway espone esternamente il servizio hello-world.

  2. Crea e applica un VirtualService nel cluster A per instradare il traffico al servizio hello-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.yaml
    

    Questa configurazione inoltra le richieste HTTP dal gateway al servizio.

  3. Configura e applica un DestinationRule per 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:

  1. Invio di richieste tramite il gateway Ingress nel cluster A.
  2. Riduzione a zero dei pod hello-world in europe-west1.
  3. Osservazione del failover del traffico su us-central1.
  4. Aumentando di nuovo il numero di pod in europe-west1 e verificando che la suddivisione del traffico riprenda.