使用自动 Envoy 部署设置 Compute Engine 虚拟机

本文档适用于旧版 API。如果您使用预览版中提供的新服务路由 API 进行部署,请参阅为具有 HTTP 服务的 Envoy 代理设置 Cloud Service Mesh

在按照本指南中的说明操作之前,请先完成准备使用 Envoy 和无代理工作负载设置服务路由 API 中所述的前提任务。

本指南介绍如何自动部署由 Envoy Sidecar 代理组成的数据平面,使用 Cloud Service Mesh 进行配置,并验证设置以确保它正常运行。此过程包括以下内容:

  1. 启用 Cloud OS Config API。
  2. 创建测试服务。
  3. 使用 Envoy 代理在 Compute Engine 上部署简单数据层面(Envoy 1.18.4 版,仅支持 xDS v3)。
  4. 使用 Compute Engine API 设置 Cloud Service Mesh,以便 Cloud Service Mesh 配置您的 Envoy Sidecar 代理。
  5. 登录到运行 Envoy 代理的虚拟机,并通过 Envoy 代理向负载平衡后端发送请求。

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

启用 Cloud OS Config API

请确保启用 Cloud OS Config API,否则您无法在虚拟机上安装所需组件。

为此,请按以下说明操作:

控制台

  1. 在 Google Cloud 控制台中,转到“API 和服务”。
    转到“API 库”页面
  2. 选择正确的项目。
  3. 在搜索框中输入 Cloud OS Config API,然后按 Enter
  4. 选择 Cloud OS Config API
  5. 点击启用

gcloud

gcloud services enable osconfig.googleapis.com

创建 Hello World 测试服务

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

Hello World 测试服务创建实例模板

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

控制台

  1. 在 Google Cloud 控制台中,转到“实例模板”页面。

    转到“实例模板”

  2. 点击创建实例模板
  3. 在字段中输入以下信息:
    • 名称td-demo-hello-world-template
    • 启动磁盘:选择操作系统和版本。
    • 服务账号:Compute Engine 默认服务账号
    • 访问权限范围:允许全面访问所有 Cloud API
  4. 点击管理、安全、磁盘、网络、单独租用。1 在网络标签页的网络标记字段中,添加 td-http-server 标记。
  5. 管理标签页中,将以下脚本复制到启动脚本字段中。

    #!/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
    
  6. 点击创建

gcloud

您可以在多个操作系统版本中进行选择。此示例使用默认值 Debian 10。

如需创建实例模板,请执行以下操作:

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"

Hello World 服务创建代管实例组

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

控制台

  1. 在 Google Cloud 控制台中,转到“实例组”页面。

    转到“实例组”页面

  2. 点击创建实例组
  3. 选择 New managed instance group (stateless)(新的托管式实例组 [无状态])。如需了解详情,请参阅无状态或有状态 MIG
  4. 输入 td-demo-hello-world-mig 作为代管实例组的名称,然后选择 us-central1-a 区域。
  5. 在“实例模板”下,选择您创建的实例模板 td-demo-hello-world-template
  6. 自动扩缩模式下,选择 Off:do not autoscale
  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 的代管实例组

使用本部分中的说明为自动部署 Envoy 代理的 Cloud Service Mesh 创建实例模板和代管实例组。代管实例组使用自动扩缩功能创建新的后端虚拟机。

在虚拟机上运行的软件组件

使用 --service-proxy=enabled 创建实例模板时,您的虚拟机上会安装以下组件。

  • Envoy 代理(由 Cloud Service Mesh 配置)是从专用 Cloud Storage 存储桶下载的。该存储桶包含 Google 提供的 Envoy 代理构建。
  • Service proxy 代理,用于初始化 Envoy 代理和代理的组件。Service proxy 代理在虚拟机运行时设置流量拦截,并监控 Envoy 代理的运行状况。Service proxy 代理也是从 Cloud Storage 存储分区下载的。

唯一可用的 Envoy 版本是托管在专用 Cloud Storage 位置的最新 Envoy 二进制文件。Compute Engine Debian、CentOS 7/8 和 RHEL 7/8 支持此 Envoy 版本。在自动修复和扩容期间,代管式实例组会在虚拟机上安装最新版本的 Envoy。在某些情况下,此版本可能比部署到之前创建的虚拟机实例的 Envoy 更高。这可能会导致代管式实例组中各虚拟机安装的版本不一致。不一致的版本可以正常运行。如果 Envoy 有安全更新,我们建议您使用滚动替换来升级代管式实例组。

创建实例模板

实例模板指定在代管实例组中创建的虚拟机实例的配置。您传递给实例模板的标志会安装 Envoy,并配置虚拟机实例,以便为 Cloud Service Mesh 做好准备。

您可以将 Debian 10/11、CentOS 7/8 或 RHEL 7/8 用于实例模板中的启动磁盘映像。

如需创建此类实例模板,请执行以下操作:

  gcloud compute instance-templates create td-vm-template-auto \
    --image-family=[ debian-10 | centos-7 | centos-8 | rhel-7 | rhel-8 ]  \
    --image-project=[ debian-cloud | centos-cloud |rhel-cloud ] \
    --service-proxy=enabled
 

如需自定义 Envoy 部署,请参阅自动 Envoy 部署参考指南

创建代管实例组

控制台

  1. 在 Google Cloud 控制台中,转到“实例组”页面。

    转到“实例组”

  2. 点击创建实例组
  3. 输入 td-vm-mig-us-central1 作为代管实例组的名称,然后选择 us-central1-a 区域。
  4. 组类型下,选择代管实例组
  5. 实例模板下,选择您创建的实例模板 td-vm-template-auto
  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-auto

使用 Google Cloud 负载均衡组件配置 Cloud Service Mesh

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

创建健康检查

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

控制台

  1. 转到 Google Cloud 控制台中的“健康检查”页面。
    转到“健康检查”页面
  2. 点击创建健康检查
  3. 对于名称,请输入 td-vm-health-check
  4. 对于协议,请选择 HTTP
  5. 点击创建

gcloud

  1. 创建健康检查。

    gcloud compute health-checks create http td-vm-health-check
    

创建防火墙规则

请按照以下说明创建健康检查探测所需的防火墙规则。如需了解详情,请参阅健康检查的防火墙规则

控制台

  1. 进入 Google Cloud 控制台中的防火墙政策页面。
    进入“防火墙政策”页面
  2. 点击创建防火墙规则
  3. 在“创建防火墙规则”页面上,提供如下信息:
    • 名称fw-allow-health-checks
    • 网络:选择 VPC 网络。
    • 优先级:输入一个表示优先级的数字,或者采用默认值 1000。
    • 流量方向:选择入站
    • 匹配时执行的操作:选择允许
    • 目标:选择指定的目标标记,然后在目标标记文本框中输入 td-http-server
    • 来源过滤条件:选择正确的 IP 地址范围类型。
    • 来源 IP 地址范围35.191.0.0/16,130.211.0.0/22
    • 目标过滤条件:选择 IP 类型。
    • 协议和端口:点击指定的端口和协议,然后勾选 tcp 并输入端口 80

gcloud

  1. 为健康检查创建防火墙规则。

    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 td-http-server \
      --rules tcp:80
    

创建后端服务

创建后端服务。如果您使用 Google Cloud CLI,则必须将其指定为全局后端服务,并使用 INTERNAL_SELF_MANAGED 负载均衡方案。将健康检查以及代管或非代管式实例组添加到后端服务。请注意,此示例使用代管式实例组和 Compute Engine 虚拟机模板,该模板运行在创建代管式实例组中创建的示例 HTTP 服务。

控制台

  1. 前往 Google Cloud 控制台中的 Cloud Service Mesh 页面。

    前往 Cloud Service Mesh 页面

  2. 服务标签页上,点击创建服务

  3. 点击继续

  4. 对于服务名称,请输入 td-vm-service

  5. 选择正确的 VPC 网络。

  6. 确保后端类型实例组

  7. 选择 td-demo-hello-world-mig,即您创建的代管实例组,其中包含 Hello World 测试服务的后端。

  8. 输入正确的端口号

  9. 选择利用率速率作为平衡模式。默认值为速率

  10. 点击完成

  11. 选择您创建的健康检查,或点击另创建一项健康检查,并确保选择 HTTP 作为协议。

  12. 连接排空超时时间中,将值设置为 30 秒或更长时间。

  13. 点击继续

  14. 点击创建

gcloud

  1. 创建后端服务。

    gcloud compute backend-services create td-vm-service \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED \
     --connection-draining-timeout=30s \
     --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
    

创建路由规则映射

路由规则映射定义了 Cloud Service Mesh 如何路由您的流量。作为路由规则映射的一部分,您可以配置虚拟 IP (VIP) 地址和一组关联的流量管理规则,例如基于主机的路由。当应用向 VIP 发送请求时,Envoy 代理会执行以下操作:

  1. 拦截请求。
  2. 根据网址映射中的流量管理规则对其进行评估。
  3. 根据请求中的主机名判断后端服务。
  4. 选择与所选后端服务关联的后端或端点。
  5. 将流量发送到该后端或端点。

如需详细了解流量管理,请参阅高级流量管理

控制台

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

  1. 前往 Google Cloud 控制台中的 Cloud Service Mesh 页面。

    前往 Cloud Service Mesh 页面

  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. 创建一个使用 td-vm-service 作为默认后端服务的网址映射。

    gcloud compute url-maps create td-vm-url-map \
       --default-service td-vm-service
    
  2. 创建路径匹配器和主机规则,以根据主机名和路径为您的服务路由流量。此示例使用 td-vm-service 作为服务名称,并使用默认路径匹配器来匹配此主机的所有路径请求 (/*)。

    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 \
       --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
    

此时,Cloud Service Mesh 配置为跨代管实例组中的后端,对网址映射中指定的服务进行流量负载均衡。

验证配置

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

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

  1. 在 Google Cloud 控制台中,转到“实例组”页面。

    转到“实例组”页面

  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 服务的后端时使用的是轮询负载平衡(默认负载平衡算法)。

后续步骤