大規模なグローバルアプリケーションを実行している場合、複数のリージョンでサービスを実行している可能性があります。同じサービスのレプリカが複数ある場合は、レイテンシを最小限に抑えるために、クライアントリクエストを最も近いサーバーに転送することができます。また、1つのリージョンがダウンした場合にフェイルオーバーを処理し、トラフィックを最も近い利用可能なサービスに転送する方法が必要になる場合もあります。
Istioは、ローカリティロードバランシングと呼ばれる機能を使用して、リージョンのトラフィックを自動的に処理してくれます。方法を見てみましょう。
ここでは、us-central と us-east の2つの異なるクラウドリージョンで実行されている2つのKubernetesクラスターがあります。両クラスター内のServiceが互いに通信できるよう、シングルコントロールプレーンによるIstioマルチクラスターがセットアップされており、そのIstioコントロールプレーンは us-east で稼働しています。
両方のクラスターを起動したときに、クラウドプロバイダーはリージョン固有の failure-domain ラベルをKubernetesノードに追加しました。:
failure-domain.beta.kubernetes.io/region: us-central1
failure-domain.beta.kubernetes.io/zone: us-central1-b
Istioはこれらのローカリティラベルをリクエストに付与して、Istioがリクエストを最も近い利用可能なリージョンにリダイレクトできるようにします。
両方のクラスターは、echo と呼ばれる Istio-injected サービスを実行しています。これは、ポート 80 でアクセスが来たときにその内容を返します。中央クラスターは、echo.default.svc.cluster.local:80 を毎秒呼び出す loadgen サービスも実行しています。
デフォルトでは、このKubernetes Serviceの動作は、両クラスタの2つの echo サーバー間でのラウンドロビン方式です。:
$ 🌊 Hello World! - EAST
$ ✨ Hello World! - CENTRAL
$ 🌊 Hello World! - EAST
$ ✨ Hello World! - CENTRAL
Outlier Detectionを設定したIstioのDestinationRuleリソースを east クラスタに追加することにより、ローカリティロードバランシングを有効にできます。:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: echo-outlier-detection
spec:
  host: echo.default.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1000
      http:
        http2MaxRequests: 1000
        maxRequestsPerConnection: 10
    outlierDetection:
      consecutiveErrors: 7
      interval: 30s
      baseEjectionTime: 30s
これで、すべての loadgen リクエストは、us-central で実行されている最も近い echo のインスタンスにルーティングされます。:
$ ✨ Hello World! - CENTRAL
$ ✨ Hello World! - CENTRAL
$ ✨ Hello World! - CENTRAL
us-central で実行されている echo デプロイメントを削除すると、Istioは loadgen リクエストを us-east で実行されている echo Podにリダイレクトします。:
$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST
Istioのグローバルインストール設定で、メッシュ全体のトラフィックの割合に基づく負荷分散ルールを追加することもできます。:
    localityLbSetting:
      distribute:
      - from: us-central1/*
        to:
          us-central1/*: 20
          us-east1/*: 80
これで、両方のクラスターで実行されているすべてのサービスが、us-east と us-central の間でリクエストを80/20共有します。 VirtualServicesは必要ありません。
$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST
$ ✨ Hello World! - CENTRAL
Istioによるローカリティロードバランシングの詳細については、Istio docsをご覧ください。



