手動 Envoy デプロイを使用して VM を設定する

このドキュメントは、Traffic Director を手動で設定するネットワーク管理者を対象としています。手動プロセスは、ロード バランシング API を使用して Traffic Director をセットアップする上級ユーザーのみを対象とした以前のメカニズムです。

古いロード バランシング API ではなく、サービス ルーティング API を使用して Traffic Director をセットアップすることを強くおすすめします。ロード バランシング API を使用する必要がある場合は、このページで説明する手動プロセスではなく、Envoy の自動デプロイを使用することをおすすめします。

このガイドの手順に進む前に、Envoy を使用して Traffic Director を設定する準備をするを確認し、ドキュメントに記載されている前提条件のタスクを完了していることを確認してください。

このガイドでは、Compute Engine 仮想マシン(VM)によって Envoy サイドカー プロキシで構成されるデータプレーンを手動でデプロイし、Traffic Director を使用して構成して、正しく機能することを確認する方法について説明します。このプロセスでは次のことを行います。

  1. テストサービスを作成する。
  2. Envoy プロキシを使用して Compute Engine にシンプルなデータプレーンをデプロイする。
  3. Compute Engine API を使用して Traffic Director を設定し、Traffic Director で Envoy サイドカー プロキシを構成できるようにする。
  4. Envoy プロキシを実行している VM にログインし、Envoy プロキシ経由で負荷分散バックエンドにリクエストを送信します。

このドキュメントの構成例はデモを目的とするものです。本番環境では、環境と要件に基づいて、コンポーネントの追加のデプロイが必要になることがあります。

構成プロセスの概要

このセクションでは、Compute Engine VM 上で実行されるサービスに対する手動の構成プロセスについて説明します。クライアント VM の構成プロセスでは、Compute Engine VM ホスト上でサイドカー プロキシとトラフィック インターセプトを設定します。次に、Google Cloud Load Balancing API を使用してロード バランシングを構成します。

このセクションでは、Google が管理していないサードパーティのソースから Envoy プロキシを取得して挿入する方法を説明します。

アプリケーションが Traffic Director で構成されたサービスにトラフィックを送信すると、トラフィックは xDS API 互換のサイドカー プロキシにインターセプト、リダイレクトされ、Google Cloud ロード バランシング コンポーネントの構成に従ってバックエンドにロードバランスされます。ホスト ネットワーキングとトラフィック インターセプトの詳細については、Traffic Director でのサイドカー プロキシ トラフィック インターセプトをご覧ください。

Traffic Director サービスにアクセスする必要がある VM ホストごとに、次の操作を行います。

  1. サービス アカウントを VM に割り当てます。

  2. VM の API アクセス スコープを設定して、Google Cloud APIs への完全アクセス権を許可します。

    • VM を作成する際に、[ID と API へのアクセス] で [すべての Cloud API に完全アクセス権を許可] をクリックします。

      [VM インスタンス] ページに移動

    • gcloud CLI で、以下を指定します。

      --scopes=https://www.googleapis.com/auth/cloud-platform

  3. VM から trafficdirector.googleapis.com(TCP、ポート 443)への送信接続を許可します。これにより、サイドカー プロキシは gRPC 経由で Traffic Director コントロール プレーンに接続できるようになります。ポート 443 への送信接続はデフォルトで有効になります。

  4. xDS サーバーとして trafficdirector.googleapis.com:443 を指すブートストラップ構成を使用して、xDS API 互換のサイドカー プロキシ(Envoy など)をデプロイします。サンプル ブートストラップ構成ファイルを取得するには、圧縮ファイル traffic-director-xdsv3.tar.gz を開き、必要に応じて bootstrap_template.yaml ファイルを変更します。

  5. サービスを宛先とする IP トラフィックをサイドカー プロキシのインターセプト リスナー ポートにリダイレクトします。

Hello World テストサービスを作成する

このセクションでは、クライアントからのリクエストを処理した VM のホスト名を返す、簡単なテストサービスを作成する方法について説明します。テストサービスは単純で、Compute Engine のマネージド インスタンス グループ全体にデプロイされたウェブサーバーです。

インスタンス テンプレートを作成する

作成したインスタンス テンプレートは、startup-script パラメータを使用してサンプルの apache2 ウェブサーバーを構成します。

コンソール

  1. Google Cloud コンソールで、[インスタンス テンプレート] ページに移動します。

    [インスタンス テンプレート] に移動

  2. [インスタンス テンプレートを作成] をクリックします。
  3. フィールドに次の情報を入力します。
    • 名前: td-demo-hello-world-template
    • ブートディスク: Debian GNU/Linux 10(buster)
    • サービス アカウント: Compute Engine default service account
    • アクセス スコープ: すべての Cloud APIs への完全アクセス権を許可
  4. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] をクリックします。
  5. [ネットワーキング] タブの [ネットワーク タグ] フィールドに、td-http-server タグを追加します。
  6. [管理] タブで、次のスクリプトを [起動スクリプト] フィールドにコピーします。

    #! /bin/bash
    sudo apt-get update -y
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>'`/bin/hostname`'</h1></body></html>' | sudo tee /var/www/html/index.html
    
  7. [作成] をクリックします。

gcloud

インスタンス テンプレートを作成します。

gcloud compute instance-templates create td-demo-hello-world-template \
  --machine-type=n1-standard-1 \
  --boot-disk-size=20GB \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --tags=td-http-server \
  --metadata=startup-script="#! /bin/bash
sudo apt-get update -y
sudo apt-get install apache2 -y
sudo service apache2 restart
sudo mkdir -p /var/www/html/
echo '<!doctype html><html><body><h1>'`/bin/hostname`'</h1></body></html>' | sudo tee /var/www/html/index.html"

マネージド インスタンス グループを作成する

このセクションでは、マネージド インスタンス グループにテストサービスの 2 つのインスタンスが常に存在するように設定します。これはデモ用です。Traffic Director は自動スケーリングされたマネージド インスタンス グループをサポートしています。

コンソール

  1. Google Cloud コンソールで、[インスタンス グループ] ページに移動します。

    [インスタンス グループ] に移動

  2. [インスタンス グループを作成] をクリックします。
  3. [新しいマネージド インスタンス グループ(ステートレス)] を選択します。詳細については、ステートレス MIG とステートフル MIG をご覧ください。
  4. マネージド インスタンス グループの名前として「td-demo-hello-world-mig」を入力し、us-central1-a ゾーンを選択します。
  5. [インスタンス テンプレート] で、作成したインスタンス テンプレート(td-demo-hello-world-template)を選択します。
  6. [自動スケーリング モード] で [自動スケーリングしない] を選択します。
  7. [インスタンス数] で、グループ内に作成するインスタンスの数を 2 つ以上指定します。
  8. [作成] をクリックします。

gcloud

gcloud CLI を使用して、前に作成したインスタンス テンプレートでマネージド インスタンス グループを作成します。

gcloud compute instance-groups managed create td-demo-hello-world-mig \
  --zone us-central1-a \
  --size=2 \
  --template=td-demo-hello-world-template

インスタンス テンプレートと Envoy がデプロイされているマネージド インスタンス グループを作成する

このセクションの手順を行い、Traffic Director のインスタンス テンプレートとマネージド インスタンス グループを手動で作成します。マネージド インスタンス グループは、自動スケーリングを使用して新しいバックエンド VM を作成します。

この例では、次の方法を示します。

  • 完全な Envoy 構成と、HTTP プロトコルを使用してホスト名を提供するサンプル サービスを備えた VM テンプレートを作成します。
  • このテンプレートを使用してマネージド インスタンス グループを構成します。

インスタンス テンプレートを作成する

まず、Compute Engine VM のインスタンス テンプレートを作成します。このテンプレートは、startup-script パラメータを使用して Envoy サイドカー プロキシとサンプルの apache2 ウェブサービスを自動的に構成します。

コンソール

  1. Google Cloud コンソールで、[インスタンス テンプレート] ページに移動します。

    [インスタンス テンプレート] に移動

  2. [インスタンス テンプレートを作成] をクリックします。
  3. 各フィールドを次のように指定します。

    • 名前: td-vm-template
    • ブートディスク: Debian GNU/Linux 10(buster)
    • サービス アカウント: Compute Engine default service account
    • アクセス スコープ: すべての Cloud APIs への完全アクセス権を許可
  4. [ファイアウォール] で、[HTTP トラフィックを許可する] と [HTTPS トラフィックを許可する] の横にあるボックスを選択します。

  5. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] をクリックします。

  6. [管理] タブで、次のスクリプトを [起動スクリプト] フィールドにコピーします。

    #! /usr/bin/env bash
    
    # Set variables
    export ENVOY_USER="envoy"
    export ENVOY_USER_UID="1337"
    export ENVOY_USER_GID="1337"
    export ENVOY_USER_HOME="/opt/envoy"
    export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml"
    export ENVOY_PORT="15001"
    export ENVOY_ADMIN_PORT="15000"
    export ENVOY_TRACING_ENABLED="false"
    export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt"
    export ENVOY_ACCESS_LOG="/dev/stdout"
    export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)"
    export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml"
    export GCE_METADATA_SERVER="169.254.169.254/32"
    export INTERCEPTED_CIDRS="*"
    export GCP_PROJECT_NUMBER=PROJECT_NUMBER
    export VPC_NETWORK_NAME=NETWORK_NAME
    export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4)
    
    # Create system user account for Envoy binary
    sudo groupadd ${ENVOY_USER} \
     --gid=${ENVOY_USER_GID} \
     --system
    sudo adduser ${ENVOY_USER} \
     --uid=${ENVOY_USER_UID} \
     --gid=${ENVOY_USER_GID} \
     --home=${ENVOY_USER_HOME} \
     --disabled-login \
     --system
    
    # Download and extract the Traffic Director tar.gz file
    cd ${ENVOY_USER_HOME}
    sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz
    sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \
     -C bootstrap_template.yaml \
     --strip-components 1
    sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \
     -C iptables.sh \
     --strip-components 1
    sudo rm traffic-director-xdsv3.tar.gz
    
    # Generate Envoy bootstrap configuration
    cat "${BOOTSTRAP_TEMPLATE}" \
     | sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \
     | sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \
     | sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \
     | sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \
     | sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \
     | sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \
     | sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \
     | sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \
     | sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \
     | sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \
     | sudo tee "${ENVOY_CONFIG}"
    
    # Install Envoy binary
    curl -sL "https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key" | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
    echo a077cb587a1b622e03aa4bf2f3689de14658a9497a9af2c427bba5f4cc3c4723 /usr/share/keyrings/getenvoy-keyring.gpg | sha256sum --check
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] https://deb.dl.getenvoy.io/public/deb/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/getenvoy.list
    sudo apt update
    sudo apt -y install getenvoy-envoy
    
    # Run Envoy as systemd service
    sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \
     --working-directory=${ENVOY_USER_HOME} --unit=envoy.service \
     bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee"
    
    # Configure iptables for traffic interception and redirection
    sudo ${ENVOY_USER_HOME}/iptables.sh \
     -p "${ENVOY_PORT}" \
     -u "${ENVOY_USER_UID}" \
     -g "${ENVOY_USER_GID}" \
     -m "REDIRECT" \
     -i "${INTERCEPTED_CIDRS}" \
     -x "${GCE_METADATA_SERVER}"
    
  7. [作成] をクリックしてテンプレートを作成します。

gcloud

インスタンス テンプレートを作成します。

gcloud compute instance-templates create td-vm-template \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --tags=http-td-tag,http-server,https-server \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --metadata=startup-script='#! /usr/bin/env bash

# Set variables
export ENVOY_USER="envoy"
export ENVOY_USER_UID="1337"
export ENVOY_USER_GID="1337"
export ENVOY_USER_HOME="/opt/envoy"
export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml"
export ENVOY_PORT="15001"
export ENVOY_ADMIN_PORT="15000"
export ENVOY_TRACING_ENABLED="false"
export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt"
export ENVOY_ACCESS_LOG="/dev/stdout"
export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)"
export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml"
export GCE_METADATA_SERVER="169.254.169.254/32"
export INTERCEPTED_CIDRS="*"
export GCP_PROJECT_NUMBER=PROJECT_NUMBER
export VPC_NETWORK_NAME=NETWORK_NAME
export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4)

# Create system user account for Envoy binary
sudo groupadd ${ENVOY_USER} \
  --gid=${ENVOY_USER_GID} \
  --system
sudo adduser ${ENVOY_USER} \
  --uid=${ENVOY_USER_UID} \
  --gid=${ENVOY_USER_GID} \
  --home=${ENVOY_USER_HOME} \
  --disabled-login \
  --system
# Download and extract the Traffic Director tar.gz file
cd ${ENVOY_USER_HOME}
sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz
sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \
  -C bootstrap_template.yaml \
  --strip-components 1
sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \
  -C iptables.sh \
  --strip-components 1
sudo rm traffic-director-xdsv3.tar.gz

# Generate Envoy bootstrap configuration
cat "${BOOTSTRAP_TEMPLATE}" \
  | sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \
  | sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \
  | sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \
  | sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \
  | sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \
  | sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \
  | sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \
  | sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \
  | sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \
  | sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \
  | sudo tee "${ENVOY_CONFIG}"

# Install Envoy binary
curl -sL "https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key" | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
echo a077cb587a1b622e03aa4bf2f3689de14658a9497a9af2c427bba5f4cc3c4723 /usr/share/keyrings/getenvoy-keyring.gpg | sha256sum --check
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] https://deb.dl.getenvoy.io/public/deb/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/getenvoy.list
sudo apt update
sudo apt -y install getenvoy-envoy

# Run Envoy as systemd service
sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \
  --working-directory=${ENVOY_USER_HOME} --unit=envoy.service \
  bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee"

# Configure iptables for traffic interception and redirection
sudo ${ENVOY_USER_HOME}/iptables.sh \
  -p "${ENVOY_PORT}" \
  -u "${ENVOY_USER_UID}" \
  -g "${ENVOY_USER_GID}" \
  -m "REDIRECT" \
  -i "${INTERCEPTED_CIDRS}" \
  -x "${GCE_METADATA_SERVER}"
'

マネージド インスタンス グループを作成する

サービスが実行されているマネージド インスタンス グループがない場合は、前のセクションで示したような VM テンプレートを使用してマネージド インスタンス グループを作成します。この例では、前のセクションで作成したインスタンス テンプレートを使用して機能を説明します。インスタンス テンプレートを使用する必要はありません。

コンソール

  1. Google Cloud コンソールで、[インスタンス グループ] ページに移動します。

    [インスタンス グループ] に移動

  2. [インスタンス グループを作成] をクリックします。デフォルトでは、マネージド インスタンス グループの作成に関するページが表示されます。
  3. [新しいマネージド インスタンス グループ(ステートレス)] を選択します。詳細については、ステートレス MIG とステートフル MIG をご覧ください。
  4. マネージド インスタンス グループの名前として「td-vm-mig-us-central1」を入力し、us-central1-a ゾーンを選択します。
  5. [インスタンス テンプレート] で、ここで作成したインスタンス テンプレートを選択します。
  6. グループに作成するインスタンスの数として 2 を指定します。
  7. [作成] をクリックします。

gcloud

gcloud CLI を使用して、前に作成したインスタンス テンプレートでマネージド インスタンス グループを作成します。

gcloud compute instance-groups managed create td-vm-mig-us-central1 \
    --zone us-central1-a --size=2 --template=td-vm-template

Google Cloud ロード バランシング コンポーネントを使用して Traffic Director を構成する

このセクションの手順では、Envoy プロキシが 2 つのバックエンド インスタンス間でアウトバウンド トラフィックをロード バランシングするように Traffic Director を構成する方法を示します。次のコンポーネントを構成します。

ヘルスチェックを作成する

ヘルスチェックを作成するには、次の手順を行います。詳細については、ヘルスチェックの作成をご覧ください。

コンソール

  1. Google Cloud コンソールで、[ヘルスチェック] ページに移動します。

    [ヘルスチェック] に移動

  2. [ヘルスチェックを作成] をクリックします。
  3. [名前] に「td-vm-health-check」と入力します。
  4. プロトコルとして [HTTP] を選択します。
  5. [作成] をクリックします。

gcloud

  1. ヘルスチェックを作成します。

    gcloud compute health-checks create http td-vm-health-check
    
  2. ファイアウォール ルールを作成します。

    gcloud compute firewall-rules create fw-allow-health-checks \
      --action ALLOW \
      --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags http-td-tag,http-server,https-server \
      --rules tcp
    

バックエンド サービスを作成する

Google Cloud CLI を使用する場合は、INTERNAL_SELF_MANAGED のロード バランシング スキームでバックエンド サービスをグローバル バックエンド サービスとして指定する必要があります。ヘルスチェックとマネージド インスタンス グループまたは非マネージド インスタンス グループをバックエンド サービスに追加します。この例では、マネージド インスタンス グループを作成するで作成したサンプル HTTP サービスを実行する Compute Engine VM テンプレートで、マネージド インスタンス グループを使用します。

コンソール

  1. Google Cloud コンソールで [Traffic Director] ページに移動します。

    [Traffic Director] に移動

  2. [サービス] タブで、[サービスを作成] をクリックします。
  3. [続行] をクリックします。
  4. サービス名に「td-vm-service」と入力します。
  5. 正しい VPC ネットワークを選択します。
  6. [バックエンド タイプ] が [インスタンス グループ] であることを確認します。
  7. 作成したマネージド インスタンス グループを選択します。
  8. [ポート番号] に正しい値を入力します。
  9. [負荷分散モード] として [使用率] または [レート] を選択します。デフォルト値は [レート] です。
  10. [完了] をクリックします。
  11. 作成したヘルスチェックを選択します。
  12. [保存して次へ] をクリックします。
  13. [作成] をクリックします。

gcloud

  1. バックエンド サービスを作成します。

    gcloud compute backend-services create td-vm-service \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --health-checks td-vm-health-check
    
  2. バックエンド サービスにバックエンドを追加します。

    gcloud compute backend-services add-backend td-vm-service \
       --instance-group td-demo-hello-world-mig \
       --instance-group-zone us-central1-a \
       --global
    

ルーティング ルール マップを作成する

ルーティング ルール マップは、Traffic Director がメッシュ内のトラフィックをルーティングする方法を定義します。

以下の手順で Traffic Director の構成にルートルール、転送ルール、ターゲット プロキシ、内部 IP アドレスを作成します。

内部 IP アドレスに送信されたトラフィックは、Envoy プロキシによってインターセプトされ、ホストとパスのルールに従って適切なサービスに送信されます。

転送ルールは、load-balancing-schemeINTERNAL_SELF_MANAGED に設定されたグローバル転送ルールとして作成されます。

転送ルールのアドレスを 0.0.0.0 に設定できます。このように設定すると、トラフィックは、リクエストの実際の宛先 IP アドレスには関係なく、URL マップで構成された HTTP ホスト名とパス情報に基づいてルーティングされます。この場合、ホストルールで構成されているサービスのホスト名は、サービス メッシュの構成内で一意であることが必要です。つまり、同じホスト名を使用する 2 つの異なるサービスを、異なるバックエンドのセットで使用することはできません。

また、サービスの実際の宛先 VIP に基づいてルーティングを有効にすることもできます。サービスの VIP を転送ルールの address パラメータとして構成した場合、そのアドレスを宛先とするリクエストのみが、URL マップに指定された HTTP パラメータに基づいてルーティングされます。

この例では、アドレス パラメータとして 10.0.0.1 を使用しています。つまり、サービスのルーティングは、サービスの実際の宛先 VIP に基づいて実行されます。

コンソール

Google Cloud コンソールでは、ターゲット プロキシは転送ルールと組み合わされます。転送ルールを作成すると、Google Cloud によってターゲット HTTP プロキシが自動的に作成され、URL マップに接続されます。

  1. Google Cloud コンソールで [Traffic Director] ページに移動します。

    [Traffic Director] に移動

  2. [ルーティング ルール マップ] タブで、[ルーティング ルール マップを作成] をクリックします。
  3. 名前を入力します。
  4. [転送ルールを追加] をクリックします。
  5. 転送ルール名に「td-vm-forwarding-rule」と入力します。
  6. ネットワークを選択します。
  7. [内部 IP] を選択します。この IP アドレスに送信されたトラフィックは、Envoy プロキシによってインターセプトされ、ホストとパスのルールに従って適切なサービスに送信されます。

    転送ルールは、load-balancing-schemeINTERNAL_SELF_MANAGED に設定されたグローバル転送ルールとして作成されます。

  8. [カスタム IP] フィールドに「10.0.0.1」と入力します。VM がこの IP アドレスに送信すると、Envoy プロキシがインターセプトし、URL マップで定義されたトラフィック管理ルールに従って、バックエンド サービスのエンドポイントに送信します。

    VPC ネットワーク内の各転送ルールには、VPC ネットワークごとに一意の IP アドレスとポートが必要です。同じ IP アドレスとポートで、特定の VPC ネットワーク内に複数の転送ルールを作成すると、最初の転送ルールだけが有効になります。それ以外は無視されます。ネットワークで 10.0.0.1 を利用できない場合は、別の IP アドレスを選択してください。

  9. [ポート] が 80 に設定されていることを確認します。

  10. [保存] をクリックします。

  11. [ルーティング ルール] セクションで、[単純なホストとパスのルール] を選択します。

  12. [ホストとパスのルール] セクションで、サービスとして td-vm-service を選択します。

  13. [ホストとパスのルールを追加] をクリックします。

  14. [ホスト] に「hello-world」と入力します。

  15. [サービス] で td-vm-service を選択します。

  16. [保存] をクリックします。

gcloud

  1. バックエンド サービスを使用する URL マップを作成します。

    gcloud compute url-maps create td-vm-url-map \
       --default-service td-vm-service
    
  2. ホスト名とパスに基づいてサービスのトラフィックをルーティングする URL マップのパスマッチャーとホストルールを作成します。この例では、サービス名として service-test を使用し、このホスト(/*)のすべてのパスリクエストに一致するデフォルトのパスマッチャーを使用します。

    gcloud compute url-maps add-path-matcher td-vm-url-map \
       --default-service td-vm-service --path-matcher-name td-vm-path-matcher
    
    gcloud compute url-maps add-host-rule td-vm-url-map --hosts service-test \
       --path-matcher-name td-vm-path-matcher \
       --hosts hello-world
    
  3. ターゲット HTTP プロキシを作成します。

    gcloud compute target-http-proxies create td-vm-proxy \
       --url-map td-vm-url-map
    
  4. 転送ルールを作成します。転送ルールはグローバルにする必要があり、load-balancing-scheme の値を INTERNAL_SELF_MANAGED に設定して作成する必要があります。

    gcloud compute forwarding-rules create td-vm-forwarding-rule \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --address=10.0.0.1 \
       --target-http-proxy=td-vm-proxy \
       --ports 80 \
       --network default
    

この時点で、Traffic Director は、URL マップで指定されたサービスのトラフィックをマネージド インスタンス グループのバックエンド間でロード バランシングするように構成されます。

構成を確認する

Compute Engine VM 用の Traffic Director 設定ガイドの最後の部分では、クライアント VM から転送ルール VIP に向けて送信されたトラフィックがインターセプトされ、Envoy プロキシにリダイレクトされるかどうかをテストします。その後、Hello World サービスをホストする VM へのリクエストをルーティングします。

まず、次の手順でバックエンドが正常であることを確認します。

コンソール

  1. Google Cloud コンソールで [Traffic Director] ページに移動します。

    [Traffic Director] に移動

    [概要] から、サービスが正常かどうかを確認できます。

  2. サービスの名前をクリックします。[サービスの詳細] ページには、バックエンドの正常性に関する情報が含まれています。
  3. バックエンドが異常な場合は、バックエンドの名前をクリックし、[VM インスタンスの詳細] ページで [リセット] をクリックするとリセットできます。

gcloud

compute backend-services get-health コマンドを使用して、バックエンドが正常であることを確認します。

gcloud compute backend-services get-health td-vm-service \
    --global \
    --format=get(name, healthStatus)

バックエンドの正常性の状態を確認したら、トラフィックをインターセプトして Envoy にリダイレクトするように構成されたクライアント VM にログインします。ルーティング ルール マップに関連付けられている VIP に curl リクエストを送信します。Envoy は curl リクエストを検査し、解決する必要のあるサービスを特定して、そのサービスに関連するバックエンドにリクエストを送信します。

コンソール

  1. Google Cloud コンソールで、[インスタンス グループ] ページに移動します。

    [インスタンス グループ] に移動

  2. td-vm-mig-us-central1 インスタンス グループを選択します。
  3. [接続] で [SSH] をクリックします。
  4. クライアント VM にログインしたら、curl ツールを使用して、Envoy を介して Hello World サービスにリクエストを送信します。

    curl -H "Host: hello-world" http://10.0.0.1/
    

このコマンドを繰り返し実行すると、Hello World マネージド インスタンス グループ内のバックエンドのホスト名を含むさまざまな HTML レスポンスが表示されます。これは、Envoy が Hello World サービスのバックエンドにトラフィックを送信するときに、デフォルトの負荷分散アルゴリズムであるラウンドロビン負荷分散を使用しているためです。

構成が完了すると、サイドカー プロキシを備えた各 Compute Engine VM は、HTTP プロトコルを使用して Traffic Director で構成されたサービスにアクセスできます。

このガイドの特定の例に沿って進めている場合は、デモ用の HTTP サーバーを備えた Compute Engine VM のテンプレートとサービスホスト名 service-test を使用して、以下の手順で構成を確認します。

  1. サイドカー プロキシがインストールされている VM ホストの 1 つにログインします。
  2. curl -H 'Host: service-test' 10.0.0.1 コマンドを実行します。このリクエストは、リクエストを処理したマネージド インスタンス グループのバックエンドのホスト名を返します。

手順 2 では、任意の IP アドレスを使用できます。たとえば、コマンド curl -I -H 'Host: service-test' 1.2.3.4 は手順 2 で機能します。

これは、転送ルールのアドレス パラメータが 0.0.0.0 に設定されており、これにより URL マップで定義されたホストに基づいて照合を行うよう Traffic Director に指示されるためです。この構成例で、ホスト名は service-test です。

次のステップ