Edited at

Google Cloud Load BalancerのTIPS

More than 1 year has passed since last update.


概要

Google Cloud Load Balancer(以下GCLB)を2年ほど運用した気づきをTIPSとしてまとめます。


BackendServiceへリトライ

以下の条件時に、BackendServiceへリトライ処理をします。


  • HTTP Method: GET


  • BackendServiceHTTP ResponseCodeが5xx、またはタイムアウト時

ドキュメント(英語)によると、リトライ処理は2回までのようです。


HTTP(S) load balancing retries failed GET requests in certain circumstances, such as when the response timeout is exhausted. It does not retry failed POST requests. Retries are limited to two attempts. Retried requests only generate one log entry for the final response. Refer to Logging for more information.



KeepAlive Timeout

GCLBのidle timeoutが600秒であるため、BackendService側のKeepAliveは600秒以上の値が必要です。

いつの間にかドキュメント(英語)に推奨値が追加されていました。

Web Server Software
Parameter
Default Setting
Recommended Setting

Apache
KeepAliveTimeout
KeepAliveTimeout 5
KeepAliveTimeout 620

nginx
keepalive_timeout
keepalive_timeout 75s;
keepalive_timeout 620s;

600秒未満の設定時に時発生する事象は、このすばらしい記事にまとまっています。


nginxでアクセス元IPアドレスを取得

GCLBは130.211.0.0/2235.191.0.0/16のSourceIPAddressRangesを持っているため、FirewallとHealthCheckの設定にはこの値を使用します。

ただしX-Forwarded-Forには転送ルールで設定したグローバルIPアドレスが入ってくるため、以下の設定をすることで$remote_addrにアクセス元IPアドレスが設定されます。

real_ip_header     X-Forwarded-For;

real_ip_recursive on;

set_real_ip_from 10.0.0.0/8; # Internal
set_real_ip_from xxx.xxx.xxx.xxx/32; # HTTPS LB GlobalIP Address


SSL証明書の更新手順

SSL証明書を更新する場合、gcloud compute ssl-certificatesで登録したSSL証明書を直接更新はできません。

まずは新しいSSL証明書を新規登録し、HTTPSターゲットプロキシのSSL証明書リソースを新しい証明書に更新します。


BackendServiceのタイムアウト

BackendServiceで設定できるタイムアウトは、Transfer-Encoding: chunkedなリクエストでも切断します。

あたり前の挙動だと思いますが、応答のタイムアウトだと勘違いしたので一応記載します。


設定の反映時間

GCLBの設定変更は、即時反映されるわけではないので慌てず落ち着きましょう。

SSL証明書、HealthCheck、IAPなどを更新した場合、2分から5分ほどの時間がかかるのでまったり待ちます。

反映が完了するまでに10分以上を要したケースもありましたが、15分を経過した場合はソワソワしながらログや反映した手順を見直すことをオススメします。


リクエストヘッダー: X-Cloud-Trace-Context

Stackdriver Traceを利用していなくても、リクエストHeaderにX-Cloud-Trace-Contextが含まれます。

この値はリクエストごとに発行されるユニークなIDなので、アプリケーションログの含めると串刺し検索ができて便利です。

ただしClientで設定(改ざん)できるため、信頼できる値ではありません。

KPIなどに使用しないように注意してください。


HTTP DELETE Method with Payload

GCLBはpayloadを含むDELETE Methodのリクエストを拒否します。

またレスポンスにpayloadが含まれてもリクエストが拒否されます。


最後に

この2年でGoogle Cloud Load Balancerには多くの便利な機能が追加されました。

CDN、Connection Draining、最近ではCloud Identity-Aware ProxyCloud Armor Security Policiesなどの機能も追加され、より柔軟な設計ができるようになりました。

その進化スピードの反面、ドキュメントに記載されない暗黙知も存在するため新しい気付きがあればこの記事に追加していきたいと思います。