GKEでWebSocketを使用する場合はTimeoutの設定が必要
GKE上のKubernetesクラスタにWebSocketを使用するアプリケーションをデプロイする場合、Backend Config を作成して、Service に関連付けることで、コネクションタイムアウトの設定を行う必要がある。 デフォルトではタイムアウトが 30秒 に設定されており、接続が確立した瞬間から30秒経過すると自動的に切断される。
WebSocketは、一度接続を確立してその後「101 Switching Protocols」でプロトコルを変化させたあと接続を維持し続ける性質があるので、WebSocketが維持される限りコネクションは張りっぱなしになる。
そのため副次的に、デフォルトで設定されているコネクションタイムアウトに引っかかってしまい、結果的にWebSocketが自動で切断されるという流れの様子。
公式マニュアルより
WebSocket プロトコルを使用する場合は、デフォルトの 30 秒よりも長いタイムアウト値を使用することをおすすめします。Google Cloud 外部 HTTP(S) ロードバランサ経由で送信される WebSocket トラフィックのバックエンド サービスのタイムアウトは、アイドル状態かどうかにかかわらず、WebSocket 接続をオープン状態に保てる最長時間として解釈されます。
Ingress で構成されたバックエンド サービスのタイムアウト値を設定するには、BackendConfig オブジェクトを作成し、Service マニフェストで beta.cloud.google.com/backend-config アノテーションを使用します
設定例
cloud.google.com/v1beta1 で BackgroundConfig を作成する。
ちなみに作成後は kubeconfig get backendconfig として参照できる。
code:yml
apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
name: myapp-backend-config
spec:
timeoutSec: 720000
作成した BackendConfig は Service に関連付けて使用する。
code:yml
kind: Service
metadata:
annotations:
cloud.google.com/backend-config: '{"default": "myapp-backend-config"}'