Google Compute Engineのロードバランサを読み解く #2 #gcpja

 Cloud, GCE, LoadBalancing

ども、takiponeです。前回はL4ロードバランサとして動作するNetwork Load Balancingをご紹介しました。今回からは昨日オープンプレビューになったL7ロードバランサ、HTTP Load Balancingを扱います。

HTTPロードバランサの概要

GCEのHTTPロードバランサは、一般的なHTTPリバースプロキシとしてVMインスタンスにHTTPトラフィックを転送します。ユニークな機能として、用途に応じて複数リージョンに渡るリージョン間の負荷分散とURLに応じたコンテンツ別の負荷分散が可能です。

以下の設定を組み合わせて動作します。数が多いですがそれぞれの設定項目は少なく、使い回ししやすいよう汎用化されていると考えるのが良いと思います。

  • グローバル転送ルール :
    ロードバランサのエンドポイントとなる外部IPポート番号を設定し、ターゲットHTTPプロキシをひも付けます。
  • ターゲットHTTPプロキシ :
    設定可能な項目はありません。仕組み上、トラフィックの転送時にHTTPヘッダ(ViaX-Forwarded-For)を付与します。転送ルールとなるURLマップをひも付けます。
  • URLマップ :
    コンテンツ別の負荷分散のために、URL規則とそれに対応するバックエンドサービスをひも付けます。特に区別しない場合は、全てのトラフィックを単一のバックエンドサービスにひも付けます。
  • バックエンドサービス :
    転送先のポート番号タイムアウトを設定し、インスタンスグループとそれに対するヘルスチェックをひも付けます。
  • インスタンスグループ :
    トラフィックを転送するVMインスタンスをグループ化します。負荷分散のための分散モードおよびしきい値を設定します。
  • ヘルスチェック :
    インスタンスグループのVMインスタンスの健全性を確認する設定です。Network Load Balancingと共通の設定ですが、アクセス元が異なることに注意します。

インスタンスグループ以外は、同一プロジェクト内で共通となり、リージョンに拠りません。

全部を一から作るのは面倒ですが、Developers Consoleではこのうちのいくつかをデフォルト構成で自動作成してくれるので、今回はそれに乗っかって試してみます。

HTTPロードバランサを作成する

HTTPロードバランサは、Developers Consoleのメニューから[Compute Engine] - [HTTP負荷分散]を選択し、[HTTPロードバランサを作成]をクリックします。

[名前]にロードバランサ名を入力し、[作成]ないし[Create]ボタンをクリックして作成します。

そのまま、作成したHTTPロードバランサの構成画面に遷移します。この時点で、デフォルトの構成でターゲットHTTPプロキシ(<LB名>-default-target-http)、URLマップ(ロードバランサと同名)とバックエンドサービス(<LB名>-backend-service)が自動で作成されます。

続いて、[+グローバル転送ルールを追加]をクリックしグローバル転送ルールを定義します。以下を設定します。

  • ルール名と説明(省略可)
  • 外部IP
  • ポート番号
  • ターゲットHTTPプロキシ

外部IPはNetwork Load Balancingと同様、一時的なエフェメラルと事前に取得する静的IPから選択できます。静的IPはVMインスタンスのものとは別に"Global"という専用のものを取得、選択します。

ポート番号は以下のように808080のみ選択できます。これ以外のポート番号やHTTPSなど暗号化通信はサポートされません。

[作成]ボタンをクリックし、転送ルールを作成します。今回はエフェメラルを選択しましたので、この時点で一時的な外部IPがアサインされたことがわかります。

まだバックエンドサービスlb1-backend-serviceにインスタンスグループを定義していないですが、この時点でWebブラウザから外部IPにアクセスしてみると、以下のようにHTTP404レスポンスが確認できます。

ひとまず、ロードバランサのエンドポイントにリクエストが届くことが確認できました。リバースプロキシとしてVMインスタンスにトラフィックを転送する様子は次回解説するとして、ここではもう少しこのエンドポイントをいじってみます。

HTTPロードバランサのエンドポイントを検証する

HTTPロードバランサは単一の外部IPながら、リージョンに拠らないグローバル転送ルールを持つリバースプロキシとして動作します。実際、最寄りのリージョンを判断し、そこで動作するバックエンド(VMインスタンス)にリクエストを転送するドキュメントにはあります。

すると、「エンドポイントとなるロードバランサはどこにあるのか?」という疑問に行き着いたので、AWSの東京リージョンとバージニアリージョンからロードバランサの外部IPにtracerouteしてみました。コマンドの結果は長くなるので記事の末尾に載せます。

ざっくりまとめると、最寄りのリージョンに配置してい他のVMインスタンスへの経路に近似していること(すぐにGoogle配下に入っているので詳しくはわかりませんが)、日米間の一般的なレイテンシーが200ms程度あるのに比べそれぞれのレイテンシーが短いことから、エンドポイントもGCE最寄りのリージョンに複数あるようです。単一外部IP宛のトラフィックが最寄りのリージョンのロードバランサに行くよう、IPエニーキャストが構成されていると推測できます。以下のようなイメージです。

これにより、単一外部IPでもCDNのような低遅延な通信が可能ですし、負荷分散の設定によりリージョンレベルの障害に対応する高可用性を持った大規模な構成がHTTPロードバランサにより簡単にできちゃいます!!

次回予告

次回は、作成したバックエンドサービスにインスタンスグループを登録し、実際のトラフィック転送の様子と負荷分散の動きを検証してみます。

(参考)tracerouteの結果

AWS東京リージョンのEC2 → HTTPロードバランサ

$ traceroute 107.178.XX.XX
traceroute to 107.178.XX.XX (107.178.XX.XX), 30 hops max, 60 byte packets  
1  216.182.224.86 (216.182.224.86)  1.980 ms  1.964 ms  1.955 ms  
2  100.64.8.119 (100.64.8.119)  9.076 ms 100.64.14.139 (100.64.14.139)  5.301 ms 100.64.8.15 (100.64.8.15)  5.789 ms  
3  100.64.0.166 (100.64.0.166)  1.747 ms 100.64.0.74 (100.64.0.74)  1.468 ms 100.64.0.0 (100.64.0.0)  1.436 ms  
4  100.64.16.103 (100.64.16.103)  0.496 ms 100.64.16.65 (100.64.16.65)  0.685 ms 100.64.16.131 (100.64.16.131)  2.685 ms  
5  72.21.222.137 (72.21.222.137)  0.873 ms 205.251.245.64 (205.251.245.64)  0.796 ms 72.21.220.225 (72.21.220.225)  0.814 ms  
6  72.21.220.36 (72.21.220.36)  1.056 ms  1.099 ms  1.170 ms  
7  72.14.215.157 (72.14.215.157)  0.795 ms  0.766 ms  0.730 ms  
8  209.85.252.46 (209.85.252.46)  2.037 ms 72.14.215.157 (72.14.215.157)  0.726 ms  0.961 ms  
9  72.14.236.98 (72.14.236.98)  2.128 ms 72.14.236.146 (72.14.236.146)  1.706 ms  1.698 ms  
10  72.14.234.176 (72.14.234.176)  13.325 ms  13.506 ms 209.85.243.8 (209.85.243.8)  15.860 ms  
11  216.239.48.157 (216.239.48.157)  12.613 ms 216.239.48.159 (216.239.48.159)  12.425 ms 209.85.243.28 (209.85.243.28)  13.385 ms  
12  216.239.48.183 (216.239.48.183)  12.692 ms 216.239.48.159 (216.239.48.159)  12.658 ms *  
13  XX.XX.178.107.bc.googleusercontent.com (107.178.XX.XX)  12.377 ms  13.368 ms  12.606 ms  
$

AWS東京リージョンのEC2 → asia-east1リージョンのVMインスタンス

$ traceroute 146.148.YY.YY
traceroute to 146.148.YY.YY (146.148.YY.YY), 30 hops max, 60 byte packets  
1  216.182.224.76 (216.182.224.76)  1.624 ms 216.182.224.48 (216.182.224.48)  0.998 ms 216.182.224.78 (216.182.224.78)  1.537 ms  
2  100.64.13.105 (100.64.13.105)  5.969 ms 100.64.2.183 (100.64.2.183)  1.484 ms 100.64.2.213 (100.64.2.213)  11.992 ms  
3  100.64.0.2 (100.64.0.2)  1.290 ms 100.64.0.120 (100.64.0.120)  1.354 ms 100.64.0.122 (100.64.0.122)  1.398 ms  
4  100.64.16.211 (100.64.16.211)  0.666 ms 100.64.16.17 (100.64.16.17)  0.688 ms 100.64.16.219 (100.64.16.219)  0.608 ms  
5  205.251.245.231 (205.251.245.231)  2.752 ms  0.976 ms  1.695 ms  
6  72.21.220.36 (72.21.220.36)  1.101 ms 72.21.222.148 (72.21.222.148)  1.097 ms 72.21.220.36 (72.21.220.36)  0.963 ms  
7  72.14.215.157 (72.14.215.157)  0.924 ms  0.739 ms  0.871 ms  
8  209.85.252.80 (209.85.252.80)  1.080 ms 209.85.252.46 (209.85.252.46)  13.339 ms 72.14.215.157 (72.14.215.157)  0.576 ms  
9  209.85.252.46 (209.85.252.46)  1.661 ms 72.14.236.148 (72.14.236.148)  1.739 ms 72.14.236.146 (72.14.236.146)  9.362 ms  
10  72.14.236.146 (72.14.236.146)  2.061 ms 66.249.95.241 (66.249.95.241)  8.708 ms 64.233.174.9 (64.233.174.9)  9.372 ms  
11  216.239.49.167 (216.239.49.167)  8.932 ms 64.233.174.9 (64.233.174.9)  17.848 ms 216.239.49.255 (216.239.49.255)  9.421 ms  
12  * 216.239.49.253 (216.239.49.253)  9.209 ms *  
13  YY.YY.148.146.bc.googleusercontent.com (146.148.YY.YY)  39.970 ms  39.939 ms  39.435 ms  
$

AWSバージニアリージョンのEC2 → HTTPロードバランサ

$ traceroute 107.178.XX.XX
traceroute to 107.178.XX.XX (107.178.XX.XX), 30 hops max, 60 byte packets  
1  216.182.224.80 (216.182.224.80)  1.203 ms 216.182.224.78 (216.182.224.78)  2.207 ms 216.182.224.208 (216.182.224.208)  1.272 ms  
2  100.64.2.131 (100.64.2.131)  2.826 ms 100.64.13.61 (100.64.13.61)  7.626 ms 100.64.2.63 (100.64.2.63)  18.161 ms  
3  100.64.0.152 (100.64.0.152)  1.436 ms 100.64.0.210 (100.64.0.210)  2.055 ms 100.64.0.254 (100.64.0.254)  1.958 ms  
4  100.64.16.21 (100.64.16.21)  0.340 ms 100.64.16.161 (100.64.16.161)  0.563 ms 100.64.16.205 (100.64.16.205)  0.545 ms  
5  72.21.220.225 (72.21.220.225)  0.924 ms 205.251.245.225 (205.251.245.225)  0.756 ms  1.126 ms  
6  205.251.245.64 (205.251.245.64)  0.786 ms 72.21.220.36 (72.21.220.36)  1.241 ms 72.21.222.148 (72.21.222.148)  0.793 ms  
7  72.14.215.157 (72.14.215.157)  0.709 ms  0.771 ms  0.937 ms  
8  209.85.252.80 (209.85.252.80)  1.164 ms 209.85.252.46 (209.85.252.46)  1.467 ms  1.856 ms  
9  72.14.236.146 (72.14.236.146)  1.561 ms 72.14.236.98 (72.14.236.98)  2.213 ms 72.14.236.146 (72.14.236.146)  1.774 ms  
10  209.85.243.28 (209.85.243.28)  13.120 ms 209.85.243.114 (209.85.243.114)  12.427 ms 209.85.243.28 (209.85.243.28)  12.589 ms  
11  216.239.48.59 (216.239.48.59)  12.602 ms  12.846 ms  12.584 ms  
12  * * *  
13  XX.XX.178.107.bc.googleusercontent.com (107.178.XX.XX)  12.635 ms  12.641 ms  12.687 ms  
$

AWSバージニアリージョンのEC2 → us-central1リージョンのVMインスタンス

$ traceroute 173.255.ZZ.ZZ
traceroute to 173.255.ZZ.ZZ (173.255.ZZ.ZZ), 30 hops max, 60 byte packets  
1  216.182.224.92 (216.182.224.92)  1.545 ms  1.520 ms 216.182.224.78 (216.182.224.78)  1.429 ms  
2  100.64.14.175 (100.64.14.175)  12.856 ms 100.64.13.41 (100.64.13.41)  15.689 ms 100.64.14.131 (100.64.14.131)  17.176 ms  
3  100.64.0.234 (100.64.0.234)  1.492 ms 100.64.0.60 (100.64.0.60)  1.346 ms 100.64.0.152 (100.64.0.152)  1.709 ms  
4  100.64.16.67 (100.64.16.67)  0.551 ms 100.64.16.155 (100.64.16.155)  0.457 ms 100.64.16.105 (100.64.16.105)  0.788 ms  
5  205.251.245.231 (205.251.245.231)  1.046 ms 205.251.245.225 (205.251.245.225)  2.382 ms 72.21.222.137 (72.21.222.137)  0.941 ms  
6  72.21.220.36 (72.21.220.36)  1.372 ms 72.21.222.34 (72.21.222.34)  1.103 ms 72.21.220.36 (72.21.220.36)  1.389 ms  
7  72.21.220.36 (72.21.220.36)  1.135 ms 72.14.215.157 (72.14.215.157)  0.744 ms  0.661 ms  
8  209.85.252.80 (209.85.252.80)  1.223 ms  1.189 ms  1.197 ms  
9  72.14.236.98 (72.14.236.98)  2.117 ms 209.85.252.46 (209.85.252.46)  2.783 ms 72.14.236.98 (72.14.236.98)  2.395 ms  
10  66.249.95.231 (66.249.95.231)  9.436 ms 66.249.95.229 (66.249.95.229)  9.247 ms 64.233.174.9 (64.233.174.9)  8.642 ms  
11  216.239.49.253 (216.239.49.253)  9.122 ms 216.239.49.167 (216.239.49.167)  8.835 ms 72.14.235.12 (72.14.235.12)  8.649 ms  
12  * 209.85.252.27 (209.85.252.27)  9.458 ms *  
13  ZZ.ZZ.255.173.bc.googleusercontent.com (173.255.ZZ.ZZ)  41.200 ms  41.044 ms  40.902 ms  
$


次の記事 :

Google Container Engine (GKE) を触ってみた #gcpja


前の記事 :

Google Compute Engineの可用性機能を体験した #gcpja