使用手动 Envoy 部署设置虚拟机

本文档适用于希望手动设置 Traffic Director 的网络管理员。手动流程是一种旧版机制,仅适用于使用负载均衡 API 设置 Traffic Director 的高级用户。

我们强烈建议您使用服务路由 API 设置 Traffic Director,而不是使用旧版负载均衡 API。如果您必须使用负载均衡 API,我们建议您使用自动 Envoy 部署,而不是本页面上介绍的手动流程。

在按照本指南中的说明进行操作之前,请先查看使用 Envoy 设置 Traffic Director 前的准备工作,并确保您已完成该文档中所述的前提任务。

本指南介绍如何手动部署由 Envoy 边车代理与 Compute Engine 虚拟机 (VM) 组成的数据平面,使用 Traffic Director 进行配置,并验证设置以确保它正常运行。此过程包括:

  1. 创建测试服务。
  2. 使用 Envoy 代理在 Compute Engine 上部署简单数据层面。
  3. 使用 Compute Engine API 设置 Traffic Director,以便 Traffic Director 配置您的 Envoy Sidecar 代理。
  4. 登录到运行 Envoy 代理的虚拟机,并通过 Envoy 代理向负载平衡后端发送请求。

本文档中的配置示例仅供演示之用。对于生产环境,您可能需要根据您的环境和要求部署其他组件。

配置过程概览

本部分介绍了在 Compute Engine 虚拟机上运行的服务的手动配置过程。客户端虚拟机的配置过程包括设置边车代理和在 Compute Engine 虚拟机主机上进行流量拦截。然后,您使用 Google Cloud 负载均衡 API 配置负载均衡。

本部分介绍了如何从非 Google 代管的第三方来源获取和注入 Envoy 代理。

当应用向 Traffic Director 中配置的服务发送流量时,与 xDS API 兼容的边车代理会拦截和重定向这些流量,然后根据 Google Cloud 负载均衡组件中的配置对后端进行负载均衡。如需详细了解主机网络和流量拦截,请参阅 Traffic Director 中的边车代理流量拦截

对于需要访问 Traffic Director 服务的每个虚拟机主机,请执行以下步骤:

  1. 为虚拟机分配服务账号。

  2. 设置虚拟机的 API 访问权限范围,以授予对 Google Cloud API 的完整访问权限。

    • 创建虚拟机时,在身份和 API 访问权限下,点击允许所有 Cloud API 的全面访问权限

      转到“虚拟机实例”页面

    • 使用 gcloud CLI 指定以下内容:

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

  3. 允许从虚拟机到 trafficdirector.googleapis.com(TCP,端口 443)的传出连接,以便边车代理可以通过 gRPC 连接到 Traffic Director 控制层面。默认情况下,到端口 443 的传出连接处于启用状态。

  4. 使用指向 trafficdirector.googleapis.com:443 的引导配置作为其 xDS 服务器,部署与 xDS API 兼容的边车代理(如 Envoy)。如需获取引导配置文件示例,请打开压缩的 fil traffic- Director-xdsv3.tar.gz,并根据需要修改 bootstrap_template.yaml 文件。

  5. 将发往服务的 IP 流量重定向到边车代理侦听器端口。

创建 Hello World 测试服务

本部分将向您介绍如何创建会返回为客户端提供请求的虚拟机的主机名的简单测试服务。测试服务不会复杂化;它是部署在整个 Compute Engine 代管实例组中的 Web 服务器。

创建实例模板

您创建的实例模板用 startup-script 参数配置了示例 apache2 Web 服务器。

控制台

  1. 在 Google Cloud Console 中,转到实例模板页面。

    转到“实例模板”

  2. 点击创建实例模板
  3. 在字段中输入以下信息:
    • 名称td-demo-hello-world-template
    • 启动磁盘:Debian GUC/Linux 10 (buster)
    • 服务账号:Compute Engine 默认服务账号
    • 访问权限范围:允许全面访问所有 Cloud API
  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"

创建代管式实例组

在本部分中,您将指定始终具有两个测试服务实例的代管实例组。该实例组用于演示。Traffic Director 支持自动扩缩的代管实例组。

控制台

  1. 在 Google Cloud Console 中,转到实例组页面。

    转到“实例组”

  2. 点击创建实例组
  3. 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG
  4. 输入 td-demo-hello-world-mig 作为代管实例组的名称,然后选择 us-central1-a 区域。
  5. 实例模板下,选择您创建的实例模板(即 td-demo-hello-world-template)。
  6. 自动扩缩模式下,选择不自动扩缩
  7. 实例数下,指定至少两个实例作为您要在组中创建的实例数。
  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 手动创建实例模板和代管实例组。 代管实例组使用自动扩缩功能创建新的后端虚拟机。

此示例展示了如何执行以下操作:

  • 创建一个具有完整 Envoy 配置的虚拟机模板,以及一个使用 HTTP 协议提供其主机名的示例服务。
  • 使用此模板配置代管实例组。

创建实例模板

首先,创建 Compute Engine 虚拟机实例模板。此模板通过 startup-script 参数自动配置 Envoy 边车代理和示例 apache2 Web 服务。

控制台

  1. 在 Google Cloud Console 中,转到实例模板页面。

    转到“实例模板”

  2. 点击创建实例模板
  3. 填写各个字段,如下所示:

    • 名称:td-vm-template
    • 启动磁盘:Debian GNU/Linux 10 (buster)
    • 服务账号:Compute Engine 默认服务账号
    • 访问权限范围:允许全面访问所有 Cloud API
  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}"
'

创建代管式实例组

如果您没有正在运行服务的代管实例组,请使用如上一部分所示的虚拟机模板来创建代管实例组。此示例使用上一部分中创建的实例模板来演示功能。您无需使用实例模板。

控制台

  1. 在 Google Cloud Console 中,转到实例组页面。

    转到“实例组”

  2. 点击创建实例组。默认情况下,您会看到用于创建代管实例组的页面。
  3. 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 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

本部分中的说明介绍了如何配置 Traffic Director,以使 Envoy 代理对两个后端实例的出站流量进行负载平衡。您可以配置以下组件:

创建健康检查

按照以下说明创建健康检查。如需了解详情,请参阅创建健康检查

控制台

  1. 在 Google Cloud Console 中,转到健康检查页面。

    转到“健康检查”

  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 将后端服务指定为全局后端服务。将健康检查以及托管或非托管实例组添加到后端服务。请注意,此示例使用代管式实例组和 Compute Engine 虚拟机模板,该模板运行在创建代管式实例组步骤中创建的示例 HTTP 服务。

控制台

  1. 在 Google Cloud Console 中,转到 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 地址。

Envoy 代理会拦截发送到内部 IP 地址的流量,并根据主机和路径规则将其发送到相应的服务。

系统会将转发规则创建为全局转发规则,其中 load-balancing-scheme 设置为 INTERNAL_SELF_MANAGED

您可以将转发规则的地址设置为 0.0.0.0。如果您这样做,流量将根据网址映射中配置的 HTTP 主机名和路径信息进行路由,而不考虑请求的实际目标 IP 地址。在这种情况下,在主机规则中配置的服务主机名在服务网格配置中必须是唯一的。也就是说,您不能拥有两项不同的服务,它们使用同一个主机名,但具有不同的后端集。

或者,您也可以根据服务的实际目标 VIP 启用路由。如果您将服务的 VIP 配置为转发规则的 address 参数,则系统只会根据网址映射中指定的 HTTP 参数路由发往此地址的请求。

此示例使用 10.0.0.1 作为地址参数,这意味着系统根据服务的实际目标 VIP 地址执行服务路由。

控制台

在 Google Cloud 控制台中,目标代理与转发规则结合使用。创建转发规则时,Google Cloud 会自动创建目标 HTTP 代理并将其附加到网址映射。

  1. 在 Google Cloud Console 中,转到 Traffic Director 页面。

    转到“Traffic Director”

  2. 路由规则映射标签页上,点击创建路由规则映射
  3. 输入名称。
  4. 点击添加转发规则
  5. 对于转发规则名称,请输入 td-vm-forwarding-rule
  6. 选择您的网络。
  7. 选择您的内部 IP。Envoy 代理会拦截发送到此 IP 地址的流量,并根据主机和路径规则将其发送到相应的服务。

    系统会将转发规则创建为全局转发规则,其中 load-balancing-scheme 设置为 INTERNAL_SELF_MANAGED

  8. 自定义 IP 字段中,输入 10.0.0.1。当您的虚拟机发送到此 IP 地址时,Envoy 代理会根据网址映射中定义的流量管理规则拦截该 IP 地址,并将其发送到相应的后端服务端点。

    VPC 网络中的每个转发规则都必须具有唯一的 IP 地址和基于 VPC 网络的端口。如果您在特定 VPC 网络中创建了多个具有相同 IP 地址和端口的转发规则,则只有第一个转发规则才有效。其他选项会被忽略。如果您的网络不可用 10.0.0.1,请选择其他 IP 地址。

  9. 确保将端口设置为 80

  10. 点击保存

  11. 路由规则部分,选择简单主机和路径规则

  12. 主机和路径规则部分,选择 td-vm-service 作为服务。

  13. 点击添加主机和路径规则

  14. 主机中输入 hello-world

  15. 服务中,选择 td-vm-service

  16. 点击保存

gcloud

  1. 创建使用后端服务的网址映射:

    gcloud compute url-maps create td-vm-url-map \
       --default-service td-vm-service
    
  2. 创建网址映射路径匹配器和主机规则,以根据主机名和路径为您的服务路由流量。此示例使用 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 配置为跨代管实例组中的后端,对网址映射中指定的服务进行流量负载平衡。

验证配置

在 Compute Engine 虚拟机的 Traffic Director 设置指南的最后部分中,您将测试从发送到转发规则 VIP 的客户端虚拟机发送的流量是否被拦截并重定向到 Envoy 代理,然后将请求路由到代管 Hello World 服务。

首先,按照以下步骤验证后端健康状况是否良好:

控制台

  1. 在 Google Cloud Console 中,转到 Traffic Director 页面。

    转到“Traffic Director”

    摘要部分会指示服务健康状况是否良好。

  2. 点击相应服务的名称。 服务详情页面提供了有关后端运行状况的信息。
  3. 如果后端运行状况不佳,您可以重置后端,方法是在虚拟机实例详情页面上点击后端名称,然后点击重置

gcloud

使用 compute backend-services get-health 命令验证后端健康状况是否良好:

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

验证后端的健康状况后,登录已配置为拦截流量并将其重定向到 Envoy 的客户端虚拟机。向与路由规则映射关联的 VIP 发送 curl 请求。Envoy 会检查 curl 请求,确定它应该解析到哪个服务,并将该请求发送到与该服务关联的后端。

控制台

  1. 在 Google Cloud Console 中,转到实例组页面。

    转到“实例组”

  2. 选择 td-vm-mig-us-central1 实例组。
  3. 连接下,点击 SSH
  4. 登录到客户端虚拟机后,使用 curl 工具通过 Envoy 向 Hello World 服务发送请求:

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

重复发出此命令时,您将看到不同的 HTML 响应,其中包含 Hello World 代管实例组中的后端主机名。这是因为 Envoy 在将流量发送到 Hello World 服务的后端时使用的是轮循负载均衡(默认负载均衡算法)。

配置完成后,每个具有边车代理的 Compute Engine 虚拟机都可以使用 HTTP 协议访问在 Traffic Director 中配置的服务。

如果您按照本指南中的特定示例操作,使用 Compute Engine 虚拟机模板以及演示 HTTP 服务器和服务主机名 service-test,请按照以下步骤验证配置:

  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,该参数指示 Traffic Director 根据网址映射中定义的主机进行匹配。在示例配置中,主机名为 service-test

后续步骤