コネクション ドレインを有効にする

コネクション ドレインとは、仮想マシン(VM)インスタンスがインスタンス グループから削除されたときや、エンドポイントが範囲内のゾーンにあるネットワーク エンドポイント グループ(NEG)から削除されたときに、既存の進行中リクエストを完了するための時間を確保するプロセスです。

このページの情報は、インスタンス グループと、範囲内のゾーンの次のタイプの NEG にのみ適用されます。

次の操作を行うとコネクション ドレインが開始されます。

バックエンド(インスタンス グループまたはゾーン NEG)をロードバランサのバックエンド サービスから切断する場合、コネクション ドレインは適用されません。

コネクション ドレインの仕組み

コネクション ドレインを有効にするには、バックエンド サービスでコネクション ドレイン タイムアウトを設定します。タイムアウト時間は 0 秒以上、3,600 秒以下に設定してください。

指定したタイムアウト時間が経過してからインスタンスが終了するまで、最大で 60 秒かかります。

コネクション ドレインの仕様の一覧は次のとおりです。

  • コネクション ドレインは、次のロードバランサに属するバックエンド サービスで利用できます。

    内部パススルー ネットワーク ロードバランサと外部パススルー ネットワーク ロードバランサの両方が、TCP、UDP、および TCP 以外のその他のプロトコルのコネクション ドレインをサポートしています。

  • コネクション ドレインは、Cloud Service Mesh のデプロイメントに含まれるバックエンド サービスでも使用できます。

  • コネクション ドレインのタイムアウトが設定されており、インスタンスがインスタンス グループから削除されるか、エンドポイントがゾーン NEG から削除された場合、Google Cloud ロードバランサと Cloud Service Mesh は次のように動作します。

    • 削除されたインスタンスやエンドポイントに新しい接続は送信されません。

    • アプリケーション ロードバランサ: 指定されたタイムアウト時間の間、削除対象としてマークされた VM またはエンドポイントに対する既存のリクエストに、完了するまでの時間が与えられます。ロードバランサは、この VM またはエンドポイントに新しい接続を送信しません。タイムアウト時間に達すると、ロードバランサは削除された VM またはエンドポイントへのすべてのトラフィックの送信を停止します。

    • プロキシ ネットワーク ロードバランサ: 指定されたタイムアウト時間の間、削除対象としてマークされた VM またはエンドポイントに対する既存の TCP 接続は、構成されたコネクション ドレイン期間中、引き続き機能します。ロードバランサは、この VM またはエンドポイントに新しい接続を送信しません。タイムアウト時間に達すると、削除された VM またはエンドポイントへの既存の TCP 接続はアクティブな状態が維持され、プロキシはデフォルトのアイドル タイムアウトである 10 分以内に既存の TCP 接続をすべて閉じます。

    • パススルー ネットワーク ロードバランサ: コネクション ドレインのタイムアウトの指定された期間、既存の接続に属するパケットは、削除対象としてマークされた VM またはエンドポイントに転送されます。タイムアウト時間に達すると、削除された VM またはエンドポイントの conntrack エントリが削除されます。既存の接続からの SYN 以外のパケットは、正常なバックエンドの新しい conntrack エントリの作成につながります。パケットが新しい正常なバックエンドに送信されると、バックエンドには受信したパケットの記録がないため、クライアントに RST を送信します。内部パススルー ネットワーク ロードバランサと外部パススルー ネットワーク ロードバランサ自体は、コネクション ドレインのタイムアウトが切れた後に既存の接続を終了するために TCP-RST または TCP-FIN を送信しません。

  • 同じインスタンス グループや NEG を共有する複数のバックエンド サービスでコネクション ドレインを有効にした場合は、最大のタイムアウト時間が使用されます。たとえば、同じインスタンス グループまたはゾーン NEG が 2 つのバックエンド サービスのバックエンドであり、一方のバックエンド サービスのコネクション ドレイン タイムアウトが 100 秒で、もう一方のバックエンド サービスのコネクション ドレイン タイムアウトが 200 秒であるとします。 Google Cloud は、終了する前に有効なコネクション ドレインのタイムアウトとして 200 秒を使用します。バックエンドがマネージド インスタンス グループの場合、インスタンスを削除するオペレーションは少なくとも 200 秒遅れます。

  • コネクション ドレインのタイムアウトを設定しない場合、またはコネクション ドレインのタイムアウトがゼロ(0)に設定されている場合、 Google Cloud は削除されたインスタンスまたはエンドポイント上の既存の接続をできるだけ早く終了します。

  • 接続プールを使用している場合、以前に確立した接続を使用する新しいリクエストが、ドレインされている VM でまだ受信され、それらの VM が最終的に削除された際に接続エラーの原因になることがあります。

コネクション ドレインを有効にする

コネクション ドレインを有効にするには、次の手順を完了します。

コンソール

ロードバランサを更新する

  1. Google Cloud コンソールで [ロード バランシング] ページに移動します。
    [ロード バランシング] に移動
  2. [ロードバランサ] タブで、更新するロードバランサの more_vert をクリックし、[編集] をクリックします。
  3. [バックエンドの構成] をクリックします。
  4. [バックエンドの構成] ペインで、 をクリックします。
  5. [バックエンド サービスの編集] ペインの下部にある [高度な構成] をクリックします。
  6. [コネクション ドレインのタイムアウト] フィールドに、03600 の値を入力します。0 を設定すると、コネクション ドレインが無効になります。

Cloud Service Mesh を更新する

  1. Google Cloud コンソールで [Cloud Service Mesh] ページに移動します。
    [Cloud Service Mesh] に移動
  2. サービスの名前をクリックします。
  3. [サービスの詳細] ページで、[編集] をクリックします。
  4. サービスの下部にある [高度な構成] をクリックします。
  5. [コネクション ドレインのタイムアウト] フィールドに、03600 の値を入力します。0 を設定すると、コネクション ドレインが無効になります。
  6. [保存] をクリックします。

gcloud

--connection-draining-timeout フラグを使用して、新規または既存のバックエンド サービスでコネクション ドレインを有効にします。次の例は、コネクション ドレインのタイムアウト時間を変更する方法を示しています。

  • 既存のリージョン ロードバランサの場合:

    gcloud compute backend-services update BACKEND_SERVICE \
        --region=REGION \
        --connection-draining-timeout=CONNECTION_TIMEOUT_SECS
    

プレースホルダを有効な値に置き換えます。

  • BACKEND_SERVICE: 更新するバックエンド サービス
  • REGION: 更新するバックエンド サービスのリージョン(該当する場合)
  • CONNECTION_TIMEOUT_SECS: インスタンスまたはエンドポイントへの既存の接続を終了させるまで待機する秒数(03600 秒)。0 を設定すると、コネクション ドレインが無効になります。コネクション ドレインのタイムアウトは、バックエンド サービスのすべてのバックエンドに適用されます。

    gcloud compute backend-services edit コマンドを使用して、既存のバックエンド サービスを更新することもできます。

API

インスタンスやエンドポイントを作成または更新するときに API でコネクション ドレインを有効にするには、それぞれの API URI に対してリクエスト本文に connectionDraining フィールドを含めたリクエストを送信します。次の例は、既存のバックエンド サービスを編集してこの属性を設定する方法を示しています。他に必要となる属性については、各ロードバランサのドキュメントをご覧ください。

  • 既存のグローバル ロードバランサまたはクロスリージョン ロードバランサの場合:

    PATCH https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices
    
  • 既存のリージョン ロードバランサの場合:

    PATCH https://www.googleapis.com/compute/v1/projects/PROJECT_ID/region/REGION/backendServices
    
    {
       "name": "BACKEND_SERVICE",
       "connectionDraining": {
         "drainingTimeoutSec": CONNECTION_TIMEOUT_SECS
       }
    }
    

    次のように置き換えます。

    • PROJECT_ID: ロードバランサまたは Cloud Service Mesh のデプロイを含むプロジェクト ID。
    • BACKEND_SERVICE: ロードバランサまたは Cloud Service Mesh のデプロイで使用されるバックエンド サービス。
    • CONNECTION_TIMEOUT_SECS: インスタンス グループまたは NEG からインスタンスまたはエンドポイントを削除させるまで待機する秒数(0~3,600 秒)。このタイムアウト時間は、バックエンド サービスによって参照されるすべてのインスタンス グループまたは NEG に適用されます。

次のステップ

バックエンド サービスの全般的な情報については、バックエンド サービスの概要をご覧ください。