ローカリティロードバランシング

大規模なグローバルアプリケーションを実行している場合、複数のリージョンでサービスを実行している可能性があります。同じサービスのレプリカが複数ある場合は、レイテンシを最小限に抑えるために、クライアントリクエストを最も近いサーバーに転送することができます。また、1つのリージョンがダウンした場合にフェイルオーバーを処理し、トラフィックを最も近い利用可能なサービスに転送する方法が必要になる場合もあります。

Istioは、ローカリティロードバランシングと呼ばれる機能を使用して、リージョンのトラフィックを自動的に処理してくれます。方法を見てみましょう。

default

ここでは、us-centralus-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

locality

us-central で実行されている echo デプロイメントを削除すると、Istioは loadgen リクエストを us-east で実行されている echo Podにリダイレクトします。:

$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST

failover

Istioのグローバルインストール設定で、メッシュ全体のトラフィックの割合に基づく負荷分散ルールを追加することもできます。:

    localityLbSetting:
      distribute:
      - from: us-central1/*
        to:
          us-central1/*: 20
          us-east1/*: 80

これで、両方のクラスターで実行されているすべてのサービスが、us-eastus-central の間でリクエストを80/20共有します。 VirtualServicesは必要ありません。

$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST
$ 🌊 Hello World! - EAST
$ ✨ Hello World! - CENTRAL

split

Istioによるローカリティロードバランシングの詳細については、Istio docsをご覧ください。