GCPロードバランサーの分類

Google Cloudはネットワーク製品のラインアップが充実していますが、製品ごとに機能と受け付けるオプションが異なるため製品理解が重要です。

まず、製品名が互いに似通っていて区別しづらいため、 Google Cloudロードバランサの基盤となるテクノロジーの表から各技術の名称を確認すると把握しやすくなります。
HTTPロードバランサとTCPロードバランサのそれぞれに、GFE(グローバル)、Maglev(リージョン)、Andromeda(内部)があり、さらにHTTPの一部にオープンソースのEnvoyを併用していることが分かります。

グローバルとリージョンの差

リージョンは比較的素朴なプロキシです。グローバル負荷分散は世界共通の単一IPを持ち、バックエンドを追加することでネットワーク的に近いホストにルートされます。
なお、ロードバランサのミニマムフィーは転送ルール5つまで定額ですが、単一のプロジェクトにグローバルとリージョンのロードバランサを構築するとミニマムフィーが2件かかるようです。

ティアの違い

プレミアムティアは転送ルートがGoogleネットワーク内に粘る挙動となり、スタンダードティアは配信リージョン近傍から外部インターネットに出る挙動となるようです。
Network Service Tiers がロードバランサに与える影響に製品別の説明があります。

TCPロードバランサ

  • TCPプロキシロードバランサ(GFE)
    • グローバル負荷分散。gcloud compute target-tcp-proxiesで操作する
    • バックエンドサービスをグローバルで作る必要がある
    • Google Cloudロードバランサの概要の表に掲載されているごく一部のウェルノウンポートのみ指定可能。また、gcloud compute forwarding-rules createの際、--portsが単一ポートしか受け付けない
    • スタンドアロンNEGをサポートしており、GKEのコンテナネイティブ負荷分散構成をとれる
    • UDP非サポート
    • SSLプロキシ負荷分散はGFEのバリアント
    • アクセス元IPを取得したい場合、proxyプロトコルを利用する(オプション)
  • 外部TCP/UDPネットワークロードバランサ(Maglev)
    • 単に「ネットワークロードバランサ」と書いているドキュメントがありMaglevを指している
    • リージョン負荷分散。プロキシーを介さずforwarding-rulesからバックエンドサービスに転送すると暗黙に生成されると思われる
    • スタンドアロンNEG非サポート。リージョンバックエンドにgcloud compute backend-services add-backend --network-endpoint-groupするとエラーになる
    • UDPをサポートする唯一のロードバランサ
    • 任意の複数ポートをフォワードできるが、TCPとUDPは混在できず別のロードバランサが必要
    • GKEサービスのtype: LoadBalancerで自動作成されるのはおそらくMaglev

HTTPロードバランサ

HTTPロードバランサはいずれもゾーンNEGをサポートしており、 GKEのコンテナ負荷分散を構築できます。

  • グローバル外部HTTP(S)ロードバランサ(GFE)
    • HTTP/3をサポート
    • GKEで外部Ingressを作成すると自動でGFEが追加される。 Ingress機能の構成にGCP拡張の説明がリストされている
  • リージョン外部HTTP(S)ロードバランサ(Envoy/Maglev)
    • HTTP/3非サポート

gRPCの追加要件

ingressで自動作成されるものも含めHTTPSロードバランサはgRPCに対応しています。
ただしロードバランサとバックエンドをHTTP/2で接続する必要があります。SSL証明書を配備のうえ、ALPNハンドシェイクできるよう構成すると動作します。
(envoyの場合、 common_tls_context.alpn_protocols: “h2,http/1.1”)

バックエンドとHTTP2以外のプロトコルで接続している場合、gRPC以外のリクエストは正常終了し、gRPCのみエラー挙動になります。

GKE Ingressの制約

Google Kubernetes Engineでingressを配備すると、ingress-gceとGFEのロードバランサが作成されます。
GFEにはGoogle Cloud Strageのバケットにルートする機能がありますが、GKE Ingressからは利用できない制約があります。

Use GCE load balancer controller with backend buckets #33で4年以上前から継続リクエストがありますが、実装予定はなさそうです。

ヘルスチェックの利用ポート

プローブIP範囲とファイアウォールルールにIP範囲が掲載されています。
ネットワークロードバランシング(Maglev)のみアクセスIPが異なります。

中馬崇尋
Chuma Takahiro