手動 Envoy デプロイを使用して VM を設定する
このドキュメントは、Cloud Service Mesh を手動で設定するネットワーク管理者を対象としています。手動プロセスは、ロード バランシング API を使用して Cloud Service Mesh をセットアップする上級ユーザーのみを対象とした以前のメカニズムです。
Cloud Service Mesh を設定する際は、古いロード バランシング API ではなくサービス ルーティング API を使用することを強くおすすめします。ロード バランシング API を使用する必要がある場合は、このページで説明する手動プロセスではなく、Envoy の自動デプロイを使用することをおすすめします。
このガイドの手順に進む前に、Envoy とプロキシレス ワークロードを使用したサービス ルーティング API の設定の準備で説明されている前提条件のタスクを完了します。
このガイドでは、Compute Engine 仮想マシン(VM)によって Envoy サイドカー プロキシで構成されるデータプレーンを手動でデプロイし、Cloud Service Mesh を使用して構成して、正しく機能することを確認する方法について説明します。このプロセスでは次のことを行います。
- テストサービスを作成する。
- Envoy プロキシを使用して Compute Engine にシンプルなデータプレーンをデプロイする。
- Compute Engine API を使用して Cloud Service Mesh を設定し、Cloud Service Mesh で Envoy サイドカー プロキシを構成できるようにする。
- Envoy プロキシを実行している VM にログインし、Envoy プロキシ経由で負荷分散バックエンドにリクエストを送信します。
このドキュメントの構成例はデモを目的とするものです。本番環境では、環境と要件に基づいて、コンポーネントの追加のデプロイが必要になることがあります。
構成プロセスの概要
このセクションでは、Compute Engine VM 上で実行されるサービスに対する手動の構成プロセスについて説明します。クライアント VM の構成プロセスでは、Compute Engine VM ホスト上でサイドカー プロキシとトラフィック インターセプトを設定します。次に、Google Cloud Load Balancing API を使用して負荷分散を構成します。
このセクションでは、Google が管理していないサードパーティのソースから Envoy プロキシを取得して挿入する方法を説明します。
アプリケーションが Cloud Service Mesh で構成されたサービスにトラフィックを送信すると、トラフィックは xDS API 互換のサイドカー プロキシにインターセプト、リダイレクトされ、Google Cloud ロード バランシング コンポーネントの構成に従ってバックエンドにロードバランスされます。ホスト ネットワーキングとトラフィック インターセプトの詳細については、Cloud Service Mesh でのサイドカー プロキシによるトラフィック インターセプトをご覧ください。
Cloud Service Mesh サービスにアクセスする必要がある VM ホストごとに、次の操作を行います。
サービス アカウントを VM に割り当てます。
VM の API アクセス スコープを設定して、Google Cloud APIs への完全アクセス権を許可します。
- VM を作成する際に、[ID と API へのアクセス] で [すべての Cloud API に完全アクセス権を許可] をクリックします。
gcloud CLI で、以下を指定します。
--scopes=https://www.googleapis.com/auth/cloud-platform
。
VM から
trafficdirector.googleapis.com
(TCP、ポート 443)への送信接続を許可し、サイドカー プロキシが gRPC 経由で Cloud Service Mesh コントロール プレーンに接続できるようにします。ポート 443 への送信接続はデフォルトで有効になります。xDS サーバーとして
trafficdirector.googleapis.com:443
を指すブートストラップ構成を使用して、xDS API 互換のサイドカー プロキシ(Envoy など)をデプロイします。サンプル ブートストラップ構成ファイルを取得するには、圧縮ファイル traffic-director-xdsv3.tar.gz を開き、必要に応じてbootstrap_template.yaml
ファイルを変更します。サービスを宛先とする IP トラフィックをサイドカー プロキシのインターセプト リスナー ポートにリダイレクトします。
- サイドカー プロキシ インターセプト リスナーポートは、プロキシのブートストラップ メタデータ構成で
TRAFFICDIRECTOR_INTERCEPTION_PORT
として定義され、この圧縮ファイルのサンプル ブートストラップ構成ファイルで 15001 に設定されています。 - 圧縮ファイル内の Istio
iptables.sh
スクリプトを使用して、トラフィック インターセプトを設定できます。
- サイドカー プロキシ インターセプト リスナーポートは、プロキシのブートストラップ メタデータ構成で
Hello World
テストサービスを作成する
このセクションでは、クライアントからのリクエストを処理した VM のホスト名を返す、簡単なテストサービスを作成する方法について説明します。テストサービスは単純で、Compute Engine のマネージド インスタンス グループ全体にデプロイされたウェブサーバーです。
インスタンス テンプレートを作成する
作成したインスタンス テンプレートは、startup-script
パラメータを使用してサンプルの apache2 ウェブサーバーを構成します。
コンソール
Google Cloud コンソールで、[インスタンス テンプレート] ページに移動します。
- [インスタンス テンプレートを作成] をクリックします。
- フィールドに次の情報を入力します。
- 名前:
td-demo-hello-world-template
- ブートディスク: Debian GNU/Linux 10(buster)
- サービス アカウント: Compute Engine default service account
- アクセス スコープ: すべての Cloud APIs への完全アクセス権を許可
- 名前:
- [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] をクリックします。
- [ネットワーキング] タブの [ネットワーク タグ] フィールドに、
td-http-server
タグを追加します。 [管理] タブで、次のスクリプトを [起動スクリプト] フィールドにコピーします。
#! /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
[作成] をクリックします。
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 つのインスタンスが常に存在するように設定します。これはデモ用です。Cloud Service Mesh は、自動スケーリングされたマネージド インスタンス グループをサポートしています。
コンソール
Google Cloud コンソールで、[インスタンス グループ] ページに移動します。
- [インスタンス グループを作成] をクリックします。
- [新しいマネージド インスタンス グループ(ステートレス)] を選択します。詳細については、ステートレス MIG とステートフル MIG をご覧ください。
- マネージド インスタンス グループの名前として「
td-demo-hello-world-mig
」を入力し、us-central1-a
ゾーンを選択します。 - [インスタンス テンプレート] で、作成したインスタンス テンプレート(
td-demo-hello-world-template
)を選択します。 - [自動スケーリング モード] で [自動スケーリングしない] を選択します。
- [インスタンス数] で、グループ内に作成するインスタンスの数を 2 つ以上指定します。
- [作成] をクリックします。
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 がデプロイされているマネージド インスタンス グループを作成する
このセクションの手順に従って、Cloud Service Mesh のインスタンス テンプレートとマネージド インスタンス グループを手動で作成します。マネージド インスタンス グループは、自動スケーリングを使用して新しいバックエンド VM を作成します。
この例では、次の方法を示します。
- 完全な Envoy 構成と、HTTP プロトコルを使用してホスト名を提供するサンプル サービスを備えた VM テンプレートを作成します。
- このテンプレートを使用してマネージド インスタンス グループを構成します。
インスタンス テンプレートを作成する
まず、Compute Engine VM のインスタンス テンプレートを作成します。このテンプレートは、startup-script
パラメータを使用して Envoy サイドカー プロキシとサンプルの apache2 ウェブサービスを自動的に構成します。
コンソール
Google Cloud コンソールで、[インスタンス テンプレート] ページに移動します。
- [インスタンス テンプレートを作成] をクリックします。
各フィールドを次のように指定します。
- 名前: td-vm-template
- ブートディスク: Debian GNU/Linux 10(buster)
- サービス アカウント: Compute Engine default service account
- アクセス スコープ: すべての Cloud APIs への完全アクセス権を許可
[ファイアウォール] で、[HTTP トラフィックを許可する] と [HTTPS トラフィックを許可する] の横にあるボックスを選択します。
[管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] をクリックします。
[管理] タブで、次のスクリプトを [起動スクリプト] フィールドにコピーします。
#! /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 Cloud Service Mesh 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}"
[作成] をクリックしてテンプレートを作成します。
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 Cloud Service Mesh 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 テンプレートを使用してマネージド インスタンス グループを作成します。この例では、前のセクションで作成したインスタンス テンプレートを使用して機能を説明します。インスタンス テンプレートを使用する必要はありません。
コンソール
Google Cloud コンソールで、[インスタンス グループ] ページに移動します。
- [インスタンス グループを作成] をクリックします。デフォルトでは、マネージド インスタンス グループの作成に関するページが表示されます。
- [新しいマネージド インスタンス グループ(ステートレス)] を選択します。詳細については、ステートレス MIG とステートフル MIG をご覧ください。
- マネージド インスタンス グループの名前として「
td-vm-mig-us-central1
」を入力し、us-central1-a
ゾーンを選択します。 - [インスタンス テンプレート] で、ここで作成したインスタンス テンプレートを選択します。
- グループに作成するインスタンスの数として 2 を指定します。
- [作成] をクリックします。
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 Load Balancing コンポーネントを使用して Cloud Service Mesh を構成する
このセクションの手順では、Envoy プロキシが 2 つのバックエンド インスタンス間でアウトバウンド トラフィックをロード バランシングするように Cloud Service Mesh を構成する方法を示します。次のコンポーネントを構成します。
- ヘルスチェック。ヘルスチェックの詳細については、ヘルスチェックの概要とヘルスチェックの作成をご覧ください。
- ファイアウォール ルール。ヘルスチェック プローブがバックエンドに到達できるようにします。詳細については、ヘルスチェックの概要をご覧ください。
- バックエンド サービス。バックエンド サービスの詳細については、バックエンド サービスの概要をご覧ください。
- ルーティング ルール マップ。これには、転送ルールと URL マップの作成が含まれます。詳細については、転送ルールの概要と URL マップの使用をご覧ください。
ヘルスチェックを作成します。
ヘルスチェックを作成するには、次の手順を行います。詳細については、ヘルスチェックの作成をご覧ください。
コンソール
Google Cloud コンソールで、[ヘルスチェック] ページに移動します。
- [ヘルスチェックを作成] をクリックします。
- [名前] に「
td-vm-health-check
」と入力します。 - プロトコルとして [HTTP] を選択します。
- [作成] をクリックします。
gcloud
ヘルスチェックを作成します。
gcloud compute health-checks create http td-vm-health-check
ファイアウォール ルールを作成する:
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 テンプレートで、マネージド インスタンス グループを使用します。
コンソール
Google Cloud Console で、[Cloud Service Mesh] ページに移動します。
- [サービス] タブで、[サービスを作成] をクリックします。
- [続行] をクリックします。
- サービス名に「
td-vm-service
」と入力します。 - 正しい VPC ネットワークを選択します。
- [バックエンド タイプ] が [インスタンス グループ] であることを確認します。
- 作成したマネージド インスタンス グループを選択します。
- [ポート番号] に正しい値を入力します。
- [負荷分散モード] として [使用率] または [レート] を選択します。デフォルト値は [レート] です。
- [完了] をクリックします。
- 作成したヘルスチェックを選択します。
- [保存して次へ] をクリックします。
- [作成] をクリックします。
gcloud
バックエンド サービスを作成します。
gcloud compute backend-services create td-vm-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --health-checks td-vm-health-check
バックエンド サービスにバックエンドを追加します。
gcloud compute backend-services add-backend td-vm-service \ --instance-group td-demo-hello-world-mig \ --instance-group-zone us-central1-a \ --global
ルーティング ルール マップを作成する
ルーティング ルール マップは、Cloud Service Mesh がメッシュ内のトラフィックをルーティングする方法を定義します。
以下の手順で Cloud Service Mesh 構成にルートルール、転送ルール、ターゲット プロキシ、内部 IP アドレスを作成します。
内部 IP アドレスに送信されたトラフィックは、Envoy プロキシによってインターセプトされ、ホストとパスのルールに従って適切なサービスに送信されます。
転送ルールは、load-balancing-scheme
が INTERNAL_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 マップに接続されます。
Google Cloud Console で、[Cloud Service Mesh] ページに移動します。
- [ルーティング ルール マップ] タブで、[ルーティング ルール マップを作成] をクリックします。
- 名前を入力します。
- [転送ルールを追加] をクリックします。
- 転送ルール名に「
td-vm-forwarding-rule
」と入力します。 - ネットワークを選択します。
[内部 IP] を選択します。この IP アドレスに送信されたトラフィックは、Envoy プロキシによってインターセプトされ、ホストとパスのルールに従って適切なサービスに送信されます。
転送ルールは、
load-balancing-scheme
がINTERNAL_SELF_MANAGED
に設定されたグローバル転送ルールとして作成されます。[カスタム IP] フィールドに「
10.0.0.1
」と入力します。VM がこの IP アドレスに送信すると、Envoy プロキシがインターセプトし、URL マップで定義されたトラフィック管理ルールに従って、バックエンド サービスのエンドポイントに送信します。VPC ネットワーク内の各転送ルールには、VPC ネットワークごとに一意の IP アドレスとポートが必要です。同じ IP アドレスとポートで、特定の VPC ネットワーク内に複数の転送ルールを作成すると、最初の転送ルールだけが有効になります。それ以外は無視されます。ネットワークで
10.0.0.1
を利用できない場合は、別の IP アドレスを選択してください。[ポート] が
80
に設定されていることを確認します。[保存] をクリックします。
[ルーティング ルール] セクションで、[単純なホストとパスのルール] を選択します。
[ホストとパスのルール] セクションで、サービスとして
td-vm-service
を選択します。[ホストとパスのルールを追加] をクリックします。
[ホスト] に「
hello-world
」と入力します。[サービス] で
td-vm-service
を選択します。[保存] をクリックします。
gcloud
バックエンド サービスを使用する URL マップを作成します。
gcloud compute url-maps create td-vm-url-map \ --default-service td-vm-service
ホスト名とパスに基づいてサービスのトラフィックをルーティングする 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
ターゲット HTTP プロキシを作成します。
gcloud compute target-http-proxies create td-vm-proxy \ --url-map td-vm-url-map
転送ルールを作成します。転送ルールはグローバルにする必要があり、
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
この時点で、Cloud Service Mesh は、URL マップで指定されたサービスのトラフィックをマネージド インスタンス グループのバックエンド間でロード バランシングするように構成されます。
構成を確認する
Compute Engine VM 用の Cloud Service Mesh 設定ガイドの最後の部分では、クライアント VM から転送ルール VIP に向けて送信されたトラフィックがインターセプトされ、Envoy プロキシにリダイレクトされるかどうかをテストします。その後、Hello World
サービスをホストする VM へのリクエストをルーティングします。
まず、次の手順でバックエンドが正常であることを確認します。
コンソール
Google Cloud Console で、[Cloud Service Mesh] ページに移動します。
[概要] から、サービスが正常かどうかを確認できます。
- サービスの名前をクリックします。[サービスの詳細] ページには、バックエンドの正常性に関する情報が含まれています。
- バックエンドが異常な場合は、バックエンドの名前をクリックし、[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
リクエストを検査し、解決する必要のあるサービスを特定して、そのサービスに関連するバックエンドにリクエストを送信します。
コンソール
Google Cloud コンソールで、[インスタンス グループ] ページに移動します。
td-vm-mig-us-central1
インスタンス グループを選択します。- [接続] で [SSH] をクリックします。
クライアント 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 プロトコルを使用して Cloud Service Mesh で構成されたサービスにアクセスできます。
このガイドの特定の例に沿って進めている場合は、デモ用の HTTP サーバーを備えた Compute Engine VM のテンプレートとサービスホスト名 service-test
を使用して、以下の手順で構成を確認します。
- サイドカー プロキシがインストールされている VM ホストの 1 つにログインします。
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 マップで定義されたホストに基づいて照合を行うよう Cloud Service Mesh に指示されるためです。この構成例で、ホスト名は service-test
です。
次のステップ
- 高度なトラフィック管理について確認する。
- Cloud Service Mesh のデプロイに関するトラブルシューティング方法について学習する。
- Envoy によるオブザーバビリティの設定方法について確認する。