3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cloudflare で gRPC を通す (4. ロードバランシング)

Last updated at Posted at 2023-02-12

はじめに

Cloudflare で gRPC を通すテスト、第4回です。

  1. プロキシ + Full TLS 化
  2. ファイアウォール
  3. レートリミット
  4. ロードバランシング <<====

ロードバランシング

gRPC リクエストのオリジンへの誘導をプログラムしようと思います。
ロードバランシングを使います。
Cloudflare のトラフィックシーケンスでは最後に出てきます。
Screenshot 2023-02-12 at 18.25.12.png

テスト構成

gRPC クライアントとサーバの位置関係は下記のとおりです。

gRPC
クライアント :flag_us:
サーバー :flag_jp: :flag_au: :flag_br:
URL https://grpc.example.com:443/helloworld.Greeter/SayHello

設定フロー

Screenshot 2023-02-11 at 18.10.00.png
公式の設定ガイドに従います。
負荷分散ダッシュボードでは下記の項目が選択可能となっています。

ロードバランサーを作成する API
モニターやプールを関連つけたロードバランサーの設定

モニターを管理する API
サービスの死活監視を行う、ヘルスモニターの設定
(今回は TCP Port 443 に対する TCP コネクションでサービスの生死を確認)

プールを管理する API
gRPC オリジンサーバの集まりである、プールの設定
(今回は国ごとにプールを作成)

下記のようなウィザードに従い、作成します。

1. ホスト名

Screenshot 2023-02-11 at 18.03.59.png
ホスト名を入力し、オレンジ雲に倒して HTTP Proxyとします。
グレー雲の場合は HTTP Proxy はせず、DNS によるロードバランシングとなります。

2. オリジンプール

Screenshot 2023-02-11 at 18.04.37.png
プール (オリジンサーバーのグループ) を指定します。
今回はプールが 3 つ、各プールに属するオリジンは 1 つ。

プール オリジン台数 オリジン IP/Host
gcp_australia 1 35.xxx.xxx.xxx
gcp_brazil 1 34.xxx.xxx.xxx
gcp_japan 1 34.xxx.xxx.xxx

編集 をクリックして設定されている内容を見てみます。

Screenshot 2023-02-11 at 18.05.18.png

オリジンステアリング
プールの中に複数のオリジンがいる場合の分散方法になります。今回はプール内のオリジンは 1 なので動作には影響しません。
オリジン名
識別子です。
オリジンアドレス
オリジンのホスト名あるいは IP アドレスを指定します。

Screenshot 2023-02-11 at 18.05.46.png

緯度、経度
プールの位置。
プロキシミティ ステアリング を試すので、こちらも指定しておきます。

監視
ヘルスモニターを紐つけます。
TCP の 443 ポートを監視する設定に関連ついています。
ダウンしていたら、そのプールには振らない、などでサービスの可用性を高めることができます。

ヘルスチェックリージョン
監視をするクラウドフレアの地域
ダイナミックステアリング を試すので、gRPC クライアントのいる Western North America を指定。
Western North America から各プールにヘルスチェックを行った際の応答 RTT がステアリングの判断材料として利用されます。

3. モニター

Screenshot 2023-02-11 at 18.06.04.png

プールにモニターが紐ついていることがわかります。

負荷分散 > モニター では下記の設定となっています。
Screenshot 2023-02-11 at 18.43.38.png

Screenshot 2023-02-11 at 18.41.49.png

4. トラフィックステアリング

Screenshot 2023-02-11 at 18.06.15.png

プールの選択方法を選択します。
まずは オフ でフェイルオーバ順とします。

5. カスタムルール

Screenshot 2023-02-11 at 18.06.22.png

柔軟な ルールの上書き が可能です。今回は使用しません。

6. レビュー

Screenshot 2023-02-11 at 18.06.33.png

ウィザードで実施した設定をレビューします。
問題なければ保存します。

7. サマリー画面

Screenshot 2023-02-11 at 18.06.47.png

3 プールとも 正常に稼働していることがわかります。

ステアリング別の動作確認

gRPC クライアントからは 5 秒に 1 つリクエストを送っています。
ロードバランシングの状況は負荷分散分析画面で確認できます。
Screenshot 2023-02-11 at 18.54.55.png
オリジンのステータスとその履歴も参照可能です。
Screenshot 2023-02-11 at 18.54.20.png
ステアリングの方法ごとに、リクエストの分散状況を見ていきます。

オフ

オフ では、フェイルオーバー順に利用されます。
(上の 2. オリジンプール に記載の通り)

リストの先頭である :flag_au: のみに誘導されています。
Screenshot 2023-02-11 at 19.00.04.png
この状態で :flag_au: が応答不能になると、
Screenshot 2023-02-11 at 19.10.57.png
リストの次に位置する :flag_br: が選択されます。
Screenshot 2023-02-11 at 19.15.15.png
:flag_au: が生き返ると、再度選択されます。

ランダム

ランダムを選択します。重み付けは均等にしています。
Screenshot 2023-02-11 at 19.20.42.png
重み通りに均等に分散されています。
Screenshot 2023-02-10 at 9.49.06.png

ダイナミック

ダイナミックを選択します。
Screenshot 2023-02-10 at 9.50.42.png
gRPC クライアントが接続するデータセンター ( :flag_us: ) からのヘルスチェックの応答 (RTT) が速いプールが選択されます。
:flag_jp: :flag_au: が選択され、 :flag_br: は選択されていません。
Screenshot 2023-02-10 at 13.22.59.png

RTT は Exponentially Weighted Moving Average (EWMA) というのを利用しているとのこと。

Dynamic Steering creates Round Trip Time (RTT) profiles based on an exponential weighted moving average (EWMA) of RTT to determine the fastest pool. If there is no current RTT data for your pool in a region or colocation center, Cloudflare directs traffic to the pools in failover order.

RTT は API で確認可能です。

$ for POOL_ID in `curl -s -X GET -H "Authorization: Bearer $TOKEN"  "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/load_balancers" | jq -r ".result[]|select(.name |contains(\"$HOSTNAME\"))|.default_pools[]"`; do curl -s -X GET -H "Authorization: Bearer $TOKEN"  "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/load_balancers/pools/$POOL_ID/health" |jq '.result.pop_health'; done
{
  "WNAM": {
    "healthy": true,
    "origins": [
      {
        "35.xxx.xxx.xxx": {    <<== JP
          "healthy": true,
          "rtt": "158.2ms",
          "failure_reason": "No failures"
        }
      }
    ]
  }
}
{
  "WNAM": {
    "healthy": true,
    "origins": [
      {
        "34.xxx.xxx.xxx": {    <<== BR
          "healthy": true,
          "rtt": "172.7ms",
          "failure_reason": "No failures"
        }
      }
    ]
  }
}
{
  "WNAM": {
    "healthy": true,
    "origins": [
      {
        "34.xxx.xxx.xxx": {    <<== AU
          "healthy": true,
          "rtt": "169.6ms",
          "failure_reason": "No failures"
        }
      }
    ]
  }
}
ロードバランサーのプール (POOL ID) を探す
$ curl -s -X GET -H "Authorization: Bearer $TOKEN"  "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/load_balancers"

各プールのヘルスモニタ状況を得る
$ curl -s -X GET -H "Authorization: Bearer $TOKEN"  "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/load_balancers/pools/$POOL_ID/health"

ジオ

ジオを選択します。
:flag_us: のクライアントを :flag_br: のプール (一番遠い) に誘導してみます。
Screenshot 2023-02-11 at 16.18.05.png
クライアントの国を選択します。
Screenshot 2023-02-11 at 16.18.20.png
誘導したいプールを選択します。
:flag_br: を選びます。
Screenshot 2023-02-11 at 16.18.50.png
:flag_br: にスタティックに誘導されています。
Screenshot 2023-02-11 at 17.29.54.png

プロキシミティ

プロキシミティを選択します。
Screenshot 2023-02-11 at 10.43.02.png
あらかじめプールの場所 (緯度・経度) は設定しておきます。
ダッシュボードでの地図で選ぶことも可能です (上記 2. オリジンプール)。

:flag_jp: のみに誘導されています。
Screenshot 2023-02-11 at 12.41.11.png

レスポンス比較

ステアリング 応答時間 95 パーセンタイル 50 パーセンタイル プール
ランダム 0.634 0.279 :flag_au: :flag_br: :flag_jp:
ダイナミック 0.344 0.271 :flag_au: :flag_jp:
プロキシミティ 0.262 0.213 :flag_jp:

今回の場合は :flag_jp: だけを選択したプロキシミティの応答速度が良かったようです。

応答時間は gRPC クライアントで tshark パケットキャプチャ分析 (Duration) を利用

$ sudo tshark -r /tmp/grpc.proximity.pcap  -q -z conv,tcp 2>/dev/null| head
================================================================================
TCP Conversations
Filter:<No Filter>
                                                           |       <-      | |       ->      | |     Total     |    Relative    |   Duration   |
                                                           | Frames  Bytes | | Frames  Bytes | | Frames  Bytes |      Start     |              |
10.138.0.2:35496           <-> 104.xxx.xxx.xxx:443               15      7058      20      1968      35      9026   763.815464586         0.2134
10.138.0.2:51948           <-> 104.xxx.xxx.xxx:443               15      7060      20      1968      35      9028  1897.589741747         0.2520
:

Duration のみ抽出し、小さい順にソート

sudo tshark -r /tmp/grpc.dynamic.pcap  -q -z conv,tcp 2>/dev/null| awk '/^1/ {print $11}'|sort > grpc.perf.dynamic.txt

パーセンタイル算出は R を利用

$ R
> x <- scan("grpc.perf.dynamic.txt")
Read 681 items
> x
  [1] 0.1903 0.1942 0.1957 0.1975 0.1992 0.2021 0.2027 0.2044 0.2052 0.2053
:
[681] 1.1017
>
> summary(x)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
 0.1903  0.2629  0.2717  0.2822  0.2821  1.1017
> quantile(x, c(0,0.5,0.95))
    0%    50%    95%
0.1903 0.2717 0.3449
>

まとめ

以上で gRPC クライアントを複数拠点の gRPC サーバに誘導し、パフォーマンスと可用性を高めることができました。サービス展開時の参考になればと思います。

なお、ロードバランシングについては、他にも様々な機能がありますが、そちらは別の機会にでも。

こちらで Cloudflare で gRPC を通すテスト は一旦終了とします。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?