レイヤー7コンテンツスイッチングの構成
NetScaler ConsoleはOpenStackと連携して、NetScalerインスタンス上でレイヤー7 (L7) スイッチングまたはコンテンツベースのスイッチング機能を構成します。コンテンツスイッチングは、特定の種類の要求を特定のサーバーに転送できる点で、単純なロードバランシングとは異なります。NetScalerインスタンスをプロバイダーとしてOpenStackでL7構成が作成されると、NetScaler ConsoleはNetScalerインスタンスを割り当て、L7構成に対応するコンテンツスイッチングおよびレスポンダー構成を展開します。NetScalerインスタンスは、要求のアプリケーション層の特性に基づいて、ユーザー要求を分散およびロードバランシングできます。
OpenStackのレイヤー7 (L7) ロードバランシング機能は、ロードバランシングとコンテンツスイッチングを組み合わせて、特定の種類のコンテンツの最適化された配信を提供します。これにより、コンテンツに適用可能なポリシーのみを実行することで、ロードバランサーのパフォーマンスが向上します。レイヤー7ロードバランシングは、アプリケーションインフラストラクチャの効率向上も促進します。タイプ、URI、またはデータに基づいてコンテンツを分離する機能により、アプリケーションインフラストラクチャにおける物理リソースのより良い割り当てが可能になります。たとえば、
http://example-sports.com/about-us を閲覧するエンドユーザーには、会社とサービスに関するコンテンツをホストするサーバープールがサービスを提供し、http://example-sports.com/shopping-cart-football を閲覧するユーザーには、オンライン購入を可能にする別のサーバープールがサービスを提供します。
L7スイッチングでは、ロードバランサーは、ユーザーからのHTTP要求を受け入れ、それらの要求をアプリケーションサーバーに分散するコンテンツスイッチング仮想サーバーとして実装されます。L7スイッチングまたはコンテンツスイッチングにより、さまざまなバックエンドサービス(たとえば、Webアプリケーション、Webサービスポータル、Webメールだけでなく、モバイル管理、異なる言語のコンテンツなど)にアクセスするための単一のエントリポイントを持つことができます。つまり、ユーザーに提供するすべてのサービスに対して1つのパブリックIPアドレスを提供できます。
下位レベルのロードバランシングとは異なり、レイヤー7スイッチングでは、プール内のすべてのサーバーが同じコンテンツを持つ必要はありません。L7スイッチングを使用するロードバランサー構成では、異なるプールからのアプリケーションサーバーまたはバックエンドサーバーが異なるコンテンツを持つことを想定しています。L7スイッチは、URI、ホスト、HTTPヘッダー、またはアプリケーションメッセージ内のその他のものに基づいて要求を転送できます。アプリケーションサーバーは、本質的に特定の種類のコンテンツを提供します。たとえば、あるサーバーは画像のみを提供し、別のサーバーはPHPやASPなどのサーバーサイドスクリプト言語を実行し、さらに別のサーバーはHTML、CSS、JavaScriptなどの静的コンテンツを提供できます。
L7ルール
トラフィックを評価するために、ルールには次の属性が定義されており、それらはルールで定義された値と比較されます。
-
ホスト名: HTTP要求のホスト名は、ルール内の値パラメーターと比較されます。例: 「www.example-sports.com」
-
パス: HTTP URIのパス部分は、ルール内の値パラメーターと比較されます。例: 「www.example-sports.com/shopping-cart/football_pump.html」
-
file\_type: URIの最後の部分は、ルール内の値パラメーターと比較されます。例: txt、html、jpg、PNG、xlsなど。
-
ヘッダー: キーパラメーターで定義されたヘッダーは、ルール内の値パラメーターと比較されます。
-
Cookie: キーパラメーターで指定されたCookieは、ルール内の値パラメーターと比較されます。Cookieリクエストヘッダーフィールドの値には、そのURLに保存されている情報の名と値のペアが含まれます。一般的な構文は次のとおりです - Cookie: name=value。たとえば、「stores」という名前のCookieで、「football-」で始まる値を探すルールは次のようになります: type = Cookie, compare_type=StartsWith, key = stores value = football-。
比較タイプ
トラフィックを評価する際、L7ポリシーはルールで定義された属性に対して次の式を比較します。
-
正規表現: Perlタイプの正規表現マッチング
-
starts\_with: 文字列が次で始まる
-
ends\_with: 文字列が次で終わる
-
contains: 文字列が次を含む
-
equal\_to: 文字列が次と等しい
注
ホスト名、パス、ヘッダー、およびCookie属性はすべての比較タイプをサポートしますが、file\_type属性は正規表現とequal\_toのみをサポートします。
L7ポリシー
L7ポリシーは、受信HTTPトラフィックを処理し、ポリシーで定義されたすべてのルールが一致した場合に「true」の値を返します。
任意のL7ポリシーでは、すべてのルールが論理的にAND演算子で結合されます。ポリシーが「true」の値を返すためには、リクエストがすべてのルールに一致する必要があります。ロードバランサーが実行するアクションは、ポリシーによって返される値に基づいています。ルール間の論理OR演算を実現するために、同じアクションを持つ2番目のポリシーを作成できます。
たとえば、受信HTTPリクエストに「EXAMPLE-SPORTS」、「SPORTS-FOOTBALL」、または「EXAMPLE-FOOTBALL」という単語が含まれるポリシーを作成し、ロードバランサーがこれらのリクエストをExample-sports eコマース企業のサーバープールに転送して、要求されたコンテンツを提供するという適切なアクションを実行するようにできます。同じアクションを実行するが、「example-sports」、「example-sports-football」、または「example-football」に一致する別のポリシーを作成できます。ユーザーがこれら6つのキーワードのいずれかを含むHTTPリクエストを送信すると、ロードバランサーはリクエストをExample-Sportsサーバーに転送します。
ポリシーで定義されたルールに応じて、L7ポリシーは次のいずれかのアクションを実行できます。
-
プールにリダイレクト - L7ポリシーに関連付けられたルールによって識別されるアプリケーションサーバープールにリクエストを転送します。つまり、ドメイン名に基づいて特定のロードバランサープールにリクエストを誘導するアプリケーションルールを作成できます。たとえば、example-football.comへの一部のリクエストをpool\_1に、example-sports-online\_purchase.comへの他のリクエストをpool\_2に誘導するルールを作成できます。
-
URLにリダイレクト - クライアントにリダイレクトHTTP応答を送信し、そのロケーション応答ヘッダーに新しいロケーションを含めます。ブラウザはアドレスバーを新しいロケーションで更新し、新しいリクエストを発行します。ユースケースは多数あります。たとえば、ウェブサイトのアドレスが変更された場合、リクエストを破棄する代わりに新しいアドレスにリダイレクトできます。または、ウェブサイトのメンテナンス中に、ユーザーを読み取り専用サイトにリダイレクトできます。
-
拒否 - リクエストを拒否し、それ以上のアクションを実行しません。たとえば、制限されたウェブページへのユーザーのアクセスを拒否するために、401 Unauthorized応答を返すことができます。
コンテンツスイッチング構成は、コンテンツスイッチング仮想サーバー、ロードバランシング仮想サーバーとサービスからなるロードバランシング設定、およびコンテンツスイッチングポリシーで構成されます。コンテンツスイッチング仮想サーバーとポリシーを作成した後、各ポリシーをコンテンツスイッチング仮想サーバーにバインドします。ポリシーをコンテンツスイッチング仮想サーバーにバインドするときに、ターゲットロードバランシング仮想サーバーを指定します。リクエストがコンテンツスイッチング仮想サーバーに到達すると、仮想サーバーは関連付けられたコンテンツスイッチングポリシーをそのリクエストに適用します。ポリシーの優先順位は、コンテンツスイッチング仮想サーバーにバインドされたポリシーが評価される順序を定義します。
リスナーIDを持つ任意のプールは、トラフィックが転送される仮想サーバーのデフォルトプールとして割り当てることができます。プールはリスナーと緩やかに結合されており、L7ポリシーの実装を通じてのみリスナーと関連付けられます。プールは、必ずしもリスナーに紐付けられることなく、ロードバランサーの直下に直接作成することもできます。そのような場合、プールは「pending\_create」状態として作成されます。L7ポリシーはリスナーと密接に結合されているため、プールが「active」になりトラフィック要求の受信を開始するには、プールIDを含むL7ポリシーを作成し、実装する必要があります。
1つのプールは複数のL7ポリシーによってサービスを提供できますが、少なくとも1つのポリシーがアタッチされている限り、「active」状態を維持します。最後のポリシーが削除されると、別のポリシーが作成されて関連付けられるまで、プールは「pending\_create」状態に戻ります。プール自体が削除された場合、本来受信するはずだったすべてのHTTPリクエストはデフォルトプールにリダイレクトされます。
OpenStack L7ポリシーとNetScalerエンティティ間のマッピング
| OpenStack | NetScalerエンティティ | 説明 |
| アクションがREDIRECT_TO_POOLのL7ポリシー | コンテンツスイッチングポリシー > コンテンツスイッチングアクション | NetScaler Consoleは、コンテンツスイッチング仮想サーバーにバインドされ、コンテンツの取得とユーザーへの提示のためのアプリケーションサーバーのターゲットプールを指定するコンテンツスイッチングアクションに関連付けられたコンテンツスイッチングポリシーを作成します。 |
| アクションがREDIRECT_TO_URLのL7ポリシー | レスポンダーポリシー > レスポンダーアクション | NetScaler Consoleは、コンテンツスイッチング仮想サーバーにバインドされ、ユーザーに提示されるターゲットURLを指定するレスポンダーアクションに関連付けられたレスポンダーポリシーを作成します。 |
| アクションがREJECTのL7ポリシー | レスポンダーポリシー > リクエストを破棄 | NetScaler Consoleは、コンテンツスイッチング仮想サーバーにバインドされ、リクエストを破棄するレスポンダーアクションに関連付けられたレスポンダーポリシーを作成します。 |
「true」と評価されるL7ポリシーのアクションが「create\_pending」状態のプールにトラフィックをリダイレクトする場合、NetScaler Consoleは指定されたプールとロードバランシング仮想サーバーを実装します。NetScaler ConsoleはL7ポリシーからコンテンツスイッチングポリシーを作成し、対応するコンテンツスイッチングアクションを使用して、そのプールに関連付けられたロードバランシング仮想サーバーにリクエストをリダイレクトします。2番目のL7ポリシーが同じプールにリダイレクトする場合、NetScaler Consoleはコンテンツスイッチングポリシーとコンテンツスイッチングアクションを作成し、トラフィックをそのプールに関連付けられた既存のロードバランシング仮想サーバーにリダイレクトします。
ポリシーの配置
OpenStackにおけるL7ポリシーの評価は、その優先順位によって決定されます。OpenStackでは、デフォルトで、ポリシーは作成された順序で優先順位が割り当てられます。最初に作成されたポリシーには「1」が割り当てられ、その後作成されたポリシーには連番が割り当てられます。ただし、ポリシーの優先順位を変更し、異なる優先順位を割り当てることもできます。ポリシーは常に優先順位の順に評価されます。特定のリクエストに一致する最初のポリシーが常に最初に実行されます。
ポリシーを作成する際は、以下の点に注意してください。
-
新しいポリシーに既存のポリシーと同じ優先順位を割り当てると、新しいポリシーがその優先順位を取得します。既存のポリシーの優先順位は下がります。必要に応じて、ポリシーが評価される順序を維持するために、他のポリシーの優先順位も下げられます。
-
位置を指定せずに新しいポリシーを作成した場合、新しいポリシーはリストの末尾に追加されます。
-
新しいポリシーを作成し、リストに既に存在するポリシーの数よりも大きい位置を割り当てた場合、新しいポリシーはリストの末尾に追加されます。つまり、新しいポリシーは常に次に利用可能な優先順位を取得します。たとえば、優先順位1、2、3の3つのポリシーA、B、Cがあり、優先順位8のポリシーを作成した場合、新しいポリシーの優先順位は4になります。
-
リストにポリシーを追加したり、リストからポリシーを削除したりすると、ポリシーの位置の値は番号をスキップせずに1から再順序付けされます。たとえば、ポリシーA、B、C、Dが位置値1、2、3、4を持っている場合、リストからポリシーBを削除すると、ポリシーCが2番目の位置になり、ポリシーDが3番目の位置になります。
NetScaler Consoleでは、常に優先順位1の
csvserverに関連付けられたデフォルトポリシーがあります。このデフォルトポリシーは、lbvserverが任意の時点で処理するTCP接続の数を指定します。したがって、NetScalerで対応するレスポンダーポリシーとコンテンツスイッチングポリシーが作成される場合、それらは常に、対応するL7ポリシーの優先順位よりも1大きい優先順位が割り当てられます。たとえば、優先順位1のL7ポリシーが評価され、優先順位2のコンテンツスイッチングポリシーが作成される場合です。同様に、優先順位2のL7ポリシーが評価され、優先順位3のレスポンダーポリシーが作成される場合です。
OpenStackでは、「reject」または「redirect\_to\_url」ポリシーが最初に評価され、次に「redirect\_to\_pool」ポリシーが評価されます。NetScalerインスタンスでは、レスポンダーポリシーが常に最初に評価され、リクエストを破棄するか、リダイレクトされたWebアドレスをユーザーに提示し、コンテンツスイッチングポリシーが最後に評価されます。この評価順序は、コンテンツスイッチングポリシーとレスポンダーポリシーが相互に排他的である場合、通常は競合を引き起こしません。つまり、2つのL7ポリシーが同一の式を持つべきではありません。このような競合を避けるために、導出された式がレスポンダーポリシーとコンテンツスイッチングポリシーに追加されます。たとえば、「sports-football.com」へのすべてのリクエストを拒否する式と、「example-sports-football.com」へのリクエストを許可する別の式を作成します。リクエストを拒否するすべてのレスポンダーポリシーが評価リストの最上位に配置され、その後にWebダイレクト用のレスポンダーポリシー、その後にコンテンツスイッチングポリシーが続くようにL7ポリシーを作成します。
NetScaler Consoleでは、常に優先順位1の
csvserverに関連付けられたデフォルトポリシーがあります。このデフォルトポリシーは、lbvserverが任意の時点で処理するTCP接続の数を指定します。したがって、NetScalerで対応するレスポンダーポリシーとコンテンツスイッチングポリシーが作成される場合、それらは常に、対応するL7ポリシーの優先順位よりも1大きい優先順位が割り当てられます。たとえば、優先順位1のL7ポリシーが評価され、優先順位2のコンテンツスイッチングポリシーが作成される場合です。同様に、優先順位2のL7ポリシーが評価され、優先順位3のレスポンダーポリシーが作成される場合です。
OpenStackでは、「reject」または「redirect\_to\_url」ポリシーが最初に評価され、次に「redirect\_to\_pool」ポリシーが評価されます。NetScalerでは、レスポンダーポリシーが常に最初に評価され、リクエストを破棄するか、リダイレクトされたWebアドレスをユーザーに提示し、コンテンツスイッチングポリシーが最後に評価されます。この評価順序は、コンテンツスイッチングポリシーとレスポンダーポリシーが相互に排他的である場合、通常は競合を引き起こしません。つまり、2つのL7ポリシーが類似の式を持つことはありません。このような競合を避けるために、類似の導出された式がレスポンダーポリシーとコンテンツスイッチングポリシーに追加されます。たとえば、「sports-football.com」へのすべてのリクエストを拒否する式と、「example-sports-football.com」へのリクエストを許可する別の式を作成します。リクエストを拒否するすべてのレスポンダーポリシーが評価リストの最上位に配置され、その後にWebダイレクト用のレスポンダーポリシー、その後にコンテンツスイッチングポリシーが続くようにL7ポリシーを作成します。
構成タスク
L7ポリシーとアクションの実装は、Neutron LBaaSコマンドを通じて実行されます。
OpenStackで環境変数を設定し、ロードバランサー(例:LB1)を作成します。ロードバランサーが正常に作成されたら、リスナーとプール(例:L1、P1、P2)を作成し、プールにメンバーとモニターを追加します。たとえば、P1はL1のデフォルトプールであり、P2はLB1に紐付けられ、アプリケーションサーバーを管理するプールです。
コマンドラインを使用してLBaaS V2を構成する方法の詳細については、コマンドラインを使用したLBaaS V2の構成を参照してください。
以下のコマンドは、ポリシーを作成し、特定のアクションを定義します。
リクエストを破棄するL7ポリシーを作成する
neutron lbaas-l7policy-create --name <L7 policy name> --listener <listener name> --action<action-name>
例:
neutron lbaas-l7policy-create --name policy11 --action REJECT --listener L1
上記のコマンドは、リクエストを拒否するために、応答ポリシーであるpolicy11を作成し、コンテンツスイッチングサーバーにバインドします。このポリシーに対してルールが作成されていないため、ポリシーは「false」と評価され、リクエストは拒否されます。
リクエストを特定のURLにリダイレクトするL7ポリシーを作成する
neutron lbaas-l7policy-create --name <L7 policy name> --listener <listener name> --action <action-name> --redirect-url <redirect-url>
例:
neutron lbaas-l7policy-create --name policy12 --action REDIRECT\_TO\_URL --listener admin-list1 --redirect-url
http://example-sports/about-us.html
上記のコマンドは、リクエストをURLにリダイレクトする応答アクションを作成し、アクションを含む応答ポリシーを作成し、このポリシーをコンテンツスイッチング仮想サーバーにバインドします。
neutron lbaas-l7rule-create --type HOST_NAME --compare-type CONTAINS --value <value-string> <L7 policy name>
neutron lbaas-l7rule-create --type PATH --compare-type CONTAINS --value <value-string> <L7 policy name>
上記の2つのルールは、AND演算子で接続して、応答ポリシーの式を導き出すことができます。
リクエストをプールにリダイレクトするL7ポリシーを作成する
neutron lbaas-l7policy-create --name <L7 policy name> --listener <listener name> --action <action-name> --redirect-pool <redirect-pool>
例:
neutron lbaas-l7policy-create --name policy13 --action REDIRECT\_TO\_POOL --listener admin-list1 --redirect-pool admin-pool2
これが最初のL7ポリシーである場合、上記のコマンドはLB1とともにP2を実装し、コンテンツスイッチングリダイレクトアクションを作成して、リクエストをLB1にリダイレクトします。P2がすでに存在する場合、コマンドはコンテンツスイッチングリダイレクトアクションを作成して、リクエストをLB1にリダイレクトします。