大規模なグローバルアプリケーションを実行している場合、複数のリージョンでサービスを実行している可能性があります。同じサービスのレプリカが複数ある場合は、レイテンシを最小限に抑えるために、クライアントリクエストを最も近いサーバーに転送することができます。また、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をご覧ください。