ターゲット プールの使用

外部 TCP/UDP ネットワーク負荷分散は、ターゲット プールを使用して受信トラフィックを受け取るインスタンスのグループを定義します。ロードバランサの転送ルールがトラフィックをターゲット プールに送信する際、ロードバランサは送信元 IP アドレス、送信元ポート、宛先 IP アドレス、宛先ポートのハッシュに基づいてターゲット プールからインスタンスを選択します。

ターゲット プールに単一の仮想マシン(VM)を含める場合は、負荷分散ではなくプロトコル転送機能の使用を検討してください。

ターゲット プールのプロパティ

ターゲット プールは、TCPUDP のトラフィックを処理する転送ルールと連携します。ターゲット プールを転送ルールと組み合わせて使用するには、その前にターゲット プールを新たに作成する必要があります。

ターゲット プールではレガシー HTTP ヘルスチェックを使用します。

ターゲット プールは次のプロパティで構成されます。

name
(必須)このターゲット プールの名前。名前はこのプロジェクト内で一意であり、63 文字以内の長さで、[a-z]([-a-z0-9]*[a-z0-9])? という正規表現を使用する必要があります。つまり、先頭文字には小文字、その後続文字にはダッシュ、小文字、数字のいずれかを使用する必要があります。ただし最後の文字にはダッシュを使用できません。
description
(省略可)このターゲット プールに関するユーザー定義の説明。
region

(必須)このターゲット プールが設定されるリージョンの完全修飾 URL。これは必要とするインスタンスが設定されるリージョンと同じリージョンを示す必要があります。例:

"region" : "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]"
healthChecks[ ]

(省略可)このターゲット プールのヘルスチェックの省略可能リスト。特定のターゲット プールに設定できるヘルスチェックは 1 つだけです。詳しくは、ヘルスチェックをご覧ください。

instances[ ]

(必須)このターゲット プールのトラフィックを処理するインスタンス URL のリスト。すべてのインスタンスは、ターゲット プールと同じリージョンに存在している必要がありますが、インスタンスは単一のリージョン内の異なるゾーンに属することができます。例:

"instances" : [
  "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE]",
  "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE-2]"
]
sessionAffinity

(省略可)バックエンドの仮想マシン インスタンスを選択するために使用する方法を制御します。この値は、ターゲット プールの作成時にのみ設定できます。設定した値は変更できません。ハッシュ方式は、以下の 5 つの値のサブセットに基づいてバックエンドを選択します。

  • 送信元 IP / 宛先 IP
  • 送信元ポート / 宛先ポート
  • レイヤ 4 プロトコル(TCP、UDP)

設定可能なハッシュは以下のとおりです。

NONE (ハッシュ値が指定されていない)(デフォルト)
送信元 IP、宛先 IP、送信元ポート、宛先ポート、プロトコルを使用する 5 タプルハッシュ。新しい接続はそれぞれどのインスタンスになってもかまいませんが、所定の接続のすべてのトラフィックは、インスタンスが正常に保たれている場合は同じインスタンスに留まります。
CLIENT_IP_PROTO
送信元 IP、宛先 IP、プロトコルを使用する 3 タプルハッシュ。クライアントからのすべての接続は、同じプロトコルを使用してインスタンスが正常に保たれている限り、同じインスタンスになります。
CLIENT_IP
送信元 IP と宛先 IP を使用する 2 タプルハッシュ。クライアントからのすべての接続は、インスタンスが正常に保たれている限り、いずれのプロトコルでも同じインスタンスになります。

5 タプルハッシュにより、多くの仮想マシンにまたがる優れたトラフィックの分散が実現します。ただし、同じクライアントからの 2 番目のセッションは、送信元ポートが変わる可能性があるため、別のインスタンスに到達することがあります。同じクライアントのすべてのセッションが同じバックエンドに到達できるようにするには、バックエンドの正常性が保たれている限り CLIENT_IP_PROTO オプションまたは CLIENT_IP オプションを指定できます。

一般に、3 タプル方式または 2 タプル方式を選択した場合、デフォルトの 5 タプル方式よりも優れたセッション アフィニティが実現しますが、トラフィック全体は均等に分散されない可能性があります。

断片化された UDP パケット: 断片化の可能性がある UDP トラフィックを負荷分散する場合は、セッション アフィニティを CLIENT_IP_PROTO または CLIENT_IP に設定します。NONE(5 タプルハッシュ)は使用しません。これは、UDP フラグメントには、最初のフラグメントを除き、ポート番号が含まれないため、ロードバランサがポートのないフラグメントをドロップする可能性があるためです。詳しくは、負荷分散と断片化された UDP パケットをご覧ください。

backupPool

(省略可)別のターゲット プールリソースの完全修飾 URL。バックアップ プールは、別のターゲット プールが参照するターゲット プールです。この機能を使用するには、failoverRatio も定義する必要があります。ターゲット プール内の正常な仮想マシンの比率が failoverRatio を下回った場合、ネットワーク ロードバランサはトラフィックをバックアップ プールに送信します。ターゲット プールごとに提供できるバックアップ プールは 1 つだけです。バックアップ プールは、ターゲット プールと同じリージョンに存在する必要があります。ターゲット プール内の正常なインスタンスの比率がフェイルオーバーの比率を下回った場合は、トラフィックをルーティングするため、ネットワーク ロードバランサは以下のルールを使用します。

  1. ターゲット プールの合計インスタンス数に対する正常なインスタンス数の比率がフェイルオーバー率よりも小さい場合、トラフィックはバックアップ プールの正常なインスタンスに送信されます。
  2. ターゲット プールの合計インスタンス数に対する正常なインスタンス数の比率がフェイルオーバー率よりも小さいが、バックアップ プールに正常なインスタンスが残っていない場合、トラフィックはターゲット プールに残っている正常なインスタンスに送信されます。
  3. ターゲット プールが空ではなく、ターゲット プールとバックアップ プールの両方のヘルスチェックに失敗した場合、トラフィックは最後の手段としてターゲット プールのすべてのインスタンスに送信されます。
  4. ターゲット プールが空で、バックアップ プールのすべてのインスタンスでヘルスチェックに失敗すると、最後の手段として、トラフィックはバックアップ プールのすべてのインスタンスに送信されます。

サポートの対象となるフェイルオーバーのレベルは 1 つだけです。たとえば、ターゲット プール A にバックアップ プール B があり、バックアップ プール B にバックアップ プール C がある場合、ターゲット プール A へのトラフィックは、バックアップ プール B にのみ送信できます。バックアップ プール C には送信できません。

failoverRatio

(省略可)このターゲット プールが正常でないとされる基準となる浮動小数点数を 0.01.0 の範囲で指定します。たとえば、この値が .1 に設定されていると、正常なインスタンス数が .1(10%)未満の場合、このターゲット プールは正常ではないと宣言されます。フェイルオーバー比が 0.0 の場合、正常であるとみなされるには、少なくとも 1 つのバックエンドが正常である必要があります。フェイルオーバー比が 1.0 に設定されている場合、正常と見なされるには、すべてのインスタンスが正常である必要があります。backupPool フィールドを定義する場合は、このプロパティを定義する必要があります。

フェイルオーバーの条件

条件 新しい接続先
フェイルオーバー率 !=0、ターゲット プールの正常な VM >= FR ターゲット プール
フェイルオーバー率 =0、ターゲット プールの正常な VM >0 ターゲット プール
フェイルオーバー率 !=0、ターゲット プールの正常な VM <FR、バックアップ プールの少なくとも 1 つの VM が正常 バックアップ プール
フェイルオーバー率 =0、ターゲット プールの正常な VM =0、バックアップ プールの少なくとも 1 つの VM が正常 バックアップ プール
ターゲット プールに 1 つ以上の VM がある、ターゲット プールのすべての VM が正常ではない、バックアップ プールのすべての VM が正常ではない ターゲット プール(最後の手段)
ターゲット プールに VM はなく、バックアップ プールのすべての VM が正常ではない バックアップ プール(最後の手段)
ターゲット プールに VM がなく、バックアップ プールに VM がない トラフィックのドロップ

ターゲット プールの追加

gcloud compute を使用してターゲット プールを追加するには、target-pools create コマンドを使用します。

gcloud compute target-pools create TARGET_POOL \
    [--backup-pool BACKUP_POOL] \
    [--description DESCRIPTION] \
    [--failover-ratio FAILOVER_RATIO] \
    [--http-health-check HEALTH_CHECK] \
    [--session-affinity SESSION_AFFINITY; default="NONE"]

API を使用してターゲット プールを作成するには、次の URI に HTTP POST リクエストを送信します。

https://www.googleapis.com/v1/compute/projects/[PROJECT_ID]/regions/[REGION]/targetPools

{
  "name": name,
  "instances": [
     "https://www.googleapis.com/v1/compute/project/[PROJECT_ID]/[ZONE]/[ZONE]/instances/[INSTANCE]",
     "https://www.googleapis.com/v1/compute/project/[PROJECT_ID]/[ZONE]/[ZONE]/instances/[INSTANCE-2]",
  ]
}

ターゲット プールのインスタンスの追加または削除

gcloud compute を使用してターゲット プールにインスタンスを追加するには、target-pools add-instances コマンドを使用します。

gcloud compute target-pools add-instances TARGET_POOL \
    --instances INSTANCE,[INSTANCE,...]

インスタンスを削除するには、target-pools remove-instances コマンドを使用します。

gcloud compute target-pools remove-instances TARGET_POOL \
    --instances INSTANCE,[INSTANCE,...]

API の場合は、POST リクエストを次の URI に送信します。

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools/[TARGET_POOL]/removeInstance
https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools/[TARGET_POOL]/addInstance

リクエストの本文の中で、追加または削除するインスタンスの完全修飾 URI を指定する必要があります。

{
 "instances": [
    {"instance": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE]"},
    {"instance": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE-2]"}
  ]
}

詳細については、API リファレンス ドキュメントの targetPools.addInstancetargetPools.removeInstance のメソッドをご覧ください。

ターゲット プールの一覧表示

gcloud compute を使用して既存のターゲット プールの一覧を表示するには、target-pools list コマンドを使用します。

gcloud compute target-pools list

詳細出力を得るには、describe コマンドを使用してプール名を指定します。

API の場合は、次の URI に GET リクエストを送信します。

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools

ターゲット プールの情報の取得

gcloud compute を使用して単一のターゲット プールに関する情報を取得するには、target-pools describe コマンドを使用します。

gcloud compute target-pools describe TARGET_POOL

API で、次の URI に空の GET リクエストを送信します。

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools/[TARGET_POOL]

インスタンスのヘルス ステータスの取得

ターゲット プール内の 1 つまたはすべてのインスタンスの現在のヘルス ステータスを調べるには、gcloud compute target-pools get-health コマンドを使用します。

gcloud compute target-pools get-health TARGET_POOL \
    [--fields FIELDS [FIELDS ...]] \
    [--format FORMAT; default="yaml"] \
    [--limit LIMIT] \
    [--raw-links] \
    [--sort-by SORT_BY]

構成済みのヘルスチェックの指定に従い、コマンドからヘルス ステータスが正常または異常のいずれかで戻されます。

API の場合は、リクエスト ボディに指定したインスタンスを使用して、HTTP POST リクエストを次の URI に対して実行します。

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools/[TARGET_POOL]/getHealth

{
  "instance": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE]"
}

ターゲット プールの削除

ターゲット プールを削除するには、そのターゲット プールがどの転送ルールでも参照されていないことを確認する必要があります。転送ルールが現在ターゲット プールを参照している場合、その転送ルールを削除して、参照を削除する必要があります。

gcloud compute を使用してターゲット プールを削除するには、target-pools delete コマンドを使用します。

gcloud compute target-pools delete TARGET_POOL

API では、次の URI に空の DELETE リクエストを送信します。

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools/[TARGET_POOL]

ターゲット プールのヘルスチェックの追加または削除

ヘルスチェック オブジェクトは、ターゲット プールとの関連付けまたは関連付けの解除が可能なスタンドアロンのグローバル リソースです。

ターゲット プールに関連付けられたヘルスチェックがない場合、ネットワーク ロードバランサはすべてのインスタンスが正常であるとし、ターゲット プール内のすべてのインスタンスにトラフィックを送信します。ただし、ヘルスチェックが関連付けられていないターゲット プールのヘルス ステータスを照会すると unhealthy ステータスが戻され、そのターゲット プールにヘルスチェックが備わっていないことが示されます。インスタンスの管理をサポートするため、ターゲット プールにはヘルスチェックを関連付けることを推奨します。

ネットワーク負荷分散は、レガシー HTTP ヘルスチェックを使用してターゲット プール内のインスタンスの状態を判断します。ネットワーク ロードバランサで使用できるのはレガシー HTTP ヘルスチェックのみです。レガシー HTTPS ヘルスチェックは使用できません。

gcloud compute を使用してターゲット プールにヘルスチェックを追加するには、target-pools add-health-checks コマンドを使用します。

gcloud compute target-pools add-health-checks TARGET_POOL \
    --http-health-check HEALTH_CHECK

ヘルスチェックを削除するには、target-pools remove-health-checks コマンドを使用します。

gcloud compute target-pools remove-health-checks TARGET_POOL \
  --http-health-check HEALTH_CHECK

API を使用してヘルスチェックの関連付けまたは関連付けの解除を行うには、適切な URI に HTTP POST リクエストを送信します。

https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools/[TARGET_POOL]/removeHealthCheck
https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools/[TARGET_POOL]/addHealthCheck

リクエストの本文には、関連付けるまたは関連付けを解除するヘルスチェックが含まれている必要があります。

{
  "healthCheck": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/HEALTH_CHECK"
}

詳細については、targetPools.addHealthChecktargetPools.removeHealthCheck の API リファレンス ドキュメントをご覧ください。

バックアップ ターゲット プールの追加または削除

ターゲット プールを初めて作成する際、ターゲット プールが正常でなくなった場合にトラフィックを受信するバックアップ ターゲット プールを指定できます。

バックアップ ターゲット プールを一度もセットアップしたことがない場合は、機能が正しく動作するようにヘルスチェックもセットアップする必要があります。

gcloud compute を使用してバックアップ プールリソースを更新するには、target-pools set-backup コマンドを使用します。

gcloud compute target-pools set-backup TARGET_POOL \
    --backup-pool BACKUP_POOL \
    --failover-ratio FAILOVER_RATIO

API を使用してバックアップ プールを更新または削除するリクエストを実行するには、次の URI に POST リクエストを送信します。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools/[TARGET_POOL]/setBackup?failoverRatio=FAILOVER

{
  "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/targetPools/BACKUP_POOL"
}

空のターゲットを定義した場合、またはフェイルオーバーの比率を定義しなかった場合、このターゲット プールのバックアップ プールは動作しません。

次のステップ

  • ターゲット プールの詳細については、API リファレンス ドキュメントの targetPools.setBackup をご覧ください。
  • 転送ルールの詳細については、転送ルールの使用をご覧ください。