セッションアフィニティ(スティッキーセッションとも呼ばれます)は、ロードバランサーで使用できる機能で、同じユーザーまたはセッションからのすべてのリクエストを同じバックエンドサーバーに渡すことができます。 この機能は、オンラインショッピングカート、ログオンセッション、パーソナライズされた設定など、ユーザーの状態を維持する必要があるシナリオに適用されます。
前提条件
コンテナサービス Kubernetes版(ACK)クラスターがService Mesh(ASM)インスタンスに追加されていること。 詳細については、「ASMインスタンスへのクラスターの追加」をご参照ください。
イングレスゲートウェイが作成され、ポート 80 が公開されていること。 詳細については、「イングレスゲートウェイの作成」をご参照ください。
HTTPBin アプリケーションがデプロイされていること。 詳細については、「HTTPBin アプリケーションのデプロイ」をご参照ください。
機能紹介
このトピックでは、コンシステントハッシュを使用して実装されたセッションアフィニティについて説明します。 Envoy は現在、HashRing と Maglev コンシステントハッシュをサポートしています。 コンシステントハッシュベースの負荷分散は、ソフトセッションアフィニティを提供するために使用されます。 特定の宛先ホストへのアフィニティは、1 つ以上のホストが宛先サービスに追加または削除されたときに失われる可能性があります。 コンシステントハッシュベースのセッションアフィニティは、負荷分散を改善し、分散システムで優れたパフォーマンスを発揮できます。
ステップ 1:HTTPBin アプリケーションのPod数をスケールアップする
kubeconfig ファイルの情報に基づいて kubectl を使用してデータプレーンに接続し、次のコマンドを実行して HTTPBin アプリケーションのPod数を 3 にスケールアップします。 これらのPodは、セッションアフィニティをテストするために使用されます。
kubectl scale deployment/httpbin --replicas 3ステップ 2:セッションアフィニティが無効になっている場合のリクエストの分散を確認する
ブラウザのアドレスバーに
http://${イングレスゲートウェイの IP アドレス}/status/418と入力します。 アクセスが成功したら、ページを複数回更新します。イングレスゲートウェイの IP アドレスを取得する方法の詳細については、「異なるバージョンのサービスへのトラフィックをルーティングするために Istio リソースを使用する」トピックのステップ 3 のサブステップ 1 イングレスゲートウェイの IP アドレスを取得する をご参照ください。
イングレスゲートウェイのログを表示します。
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
[イングレスゲートウェイ] ページで、目的のイングレスゲートウェイを見つけ、[ログセンター] をクリックします。 [ゲートウェイログ] タブで、検索ボックスに
and 418検索条件を追加し、[検索と分析] をクリックします。 左下隅の [raw Logs] タブで、[upstream_addr] インデックスを展開します。リクエストが HTTPBin アプリケーションの 3 つのPodにほぼ均等に分散されていることがわかります。

ステップ 3:宛先ルールを作成する
次の内容を使用して宛先ルールを作成します。 詳細については、「宛先ルールの管理」をご参照ください。
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: httpbin
namespace: default
spec:
host: httpbin.default.svc.cluster.local
trafficPolicy:
loadBalancer:
consistentHash:
httpCookie:
name: sticky-session-key
ttl: 0s宛先ルールがデプロイされると、イングレスゲートウェイを介して HTTPBin アプリケーションにアクセスするために宛先ルールで指定されたCookieなしでリクエストを開始した場合、イングレスゲートウェイはリクエストの送信元と宛先の IP アドレスとポートに基づいてハッシュ値を生成し、リクエストレスポンスにCookieを追加します。 後続のリクエストがこのCookieを保持している場合、イングレスゲートウェイはこの値を再生成しません。 このCookieは、コンシステントハッシュでハッシュ関数のキー入力として使用され、アクセスするバックエンドを計算します。
セッションアフィニティの有効性は、特定のコンシステントハッシュによって保証されます。 この例では、コンシステントハッシュは指定されていません。 デフォルトでは HashRing が使用されます。 バージョン 1.16 以降の ASM インスタンスは、Maglev コンシステントハッシュをサポートしています。 ビジネス要件に基づいて Maglev コンシステントハッシュを使用できます。
ステップ 4:セッションアフィニティが有効になっている場合のリクエストの分散を確認する
ブラウザのアドレスバーに
http://${イングレスゲートウェイの IP アドレス}/status/333と入力します。 アクセスが成功したら、ページを複数回更新します。イングレスゲートウェイの IP アドレスを取得する方法の詳細については、「異なるバージョンのサービスへのトラフィックをルーティングするために Istio リソースを使用する」トピックのステップ 3 のサブステップ 1 イングレスゲートウェイの IP アドレスを取得する をご参照ください。
イングレスゲートウェイのログを表示します。
ASM コンソール にログインします。 左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。 左側のナビゲーションペインで、 を選択します。
[イングレスゲートウェイ] ページで、目的のイングレスゲートウェイを見つけ、[ログセンター] をクリックします。 [ゲートウェイログ] タブで、検索ボックスに
and 333検索条件を追加し、[検索と分析] をクリックします。 左下隅の [raw Logs] タブで、[upstream_addr] インデックスを展開します。すべてのリクエストが HTTPBin アプリケーションの同じバックエンド Pod に転送されていることがわかります。

ブラウザの開発者ツールを開き、[ネットワーク] をクリックし、ページを更新して、リクエストをクリックして詳細を表示します。
Web ページには、宛先ルールで指定された名前と同じ名前のCookieがWebサイトにあることが示されています。 イングレスゲートウェイは、このCookieに基づいてセッションアフィニティを実装します。