概要
Google Cloud Load Balancer(以下GCLB)を2年ほど運用した気づきをTIPSとしてまとめます。
BackendServiceへリトライ
以下の条件時に、BackendServiceへリトライ処理をします。
HTTP Method: GET
-
BackendService
のHTTP 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/22
と35.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 Proxy、Cloud Armor Security Policiesなどの機能も追加され、より柔軟な設計ができるようになりました。
その進化スピードの反面、ドキュメントに記載されない暗黙知も存在するため新しい気付きがあればこの記事に追加していきたいと思います。