使用自动 Envoy 部署设置 Compute Engine 虚拟机
本文档适用于旧版 API。如果您使用预览版中提供的新服务路由 API 进行部署,请参阅为具有 HTTP 服务的 Envoy 代理设置 Cloud Service Mesh。
在按照本指南中的说明操作之前,请先完成准备使用 Envoy 和无代理工作负载设置服务路由 API 中所述的前提任务。
本指南介绍如何自动部署由 Envoy Sidecar 代理组成的数据平面,使用 Cloud Service Mesh 进行配置,并验证设置以确保它正常运行。此过程包括以下内容:
- 启用 Cloud OS Config API。
- 创建测试服务。
- 使用 Envoy 代理在 Compute Engine 上部署简单数据层面(Envoy 1.18.4 版,仅支持 xDS v3)。
- 使用 Compute Engine API 设置 Cloud Service Mesh,以便 Cloud Service Mesh 配置您的 Envoy Sidecar 代理。
- 登录到运行 Envoy 代理的虚拟机,并通过 Envoy 代理向负载平衡后端发送请求。
本文档中的配置示例仅供演示之用。对于生产环境,您可能需要根据您的环境和要求部署其他组件。
启用 Cloud OS Config API
请确保启用 Cloud OS Config API,否则您无法在虚拟机上安装所需组件。
为此,请按以下说明操作:
控制台
- 在 Google Cloud 控制台中,转到“API 和服务”。
转到“API 库”页面 - 选择正确的项目。
- 在搜索框中输入 Cloud OS Config API,然后按 Enter。
- 选择 Cloud OS Config API。
- 点击启用。
gcloud
gcloud services enable osconfig.googleapis.com
创建 Hello World
测试服务
本部分将向您介绍如何创建会返回为客户端提供请求的虚拟机的主机名的简单测试服务。测试服务不会复杂化;它是部署在整个 Compute Engine 代管实例组中的 Web 服务器。
为 Hello World
测试服务创建实例模板
您创建的实例模板用 startup-script
参数配置了示例 apache2 Web 服务器。
控制台
- 在 Google Cloud 控制台中,转到“实例模板”页面。
- 点击创建实例模板。
- 在字段中输入以下信息:
- 名称:
td-demo-hello-world-template
- 启动磁盘:选择操作系统和版本。
- 服务账号:Compute Engine 默认服务账号
- 访问权限范围:允许全面访问所有 Cloud API
- 名称:
- 点击管理、安全、磁盘、网络、单独租用。1 在网络标签页的网络标记字段中,添加
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
您可以在多个操作系统版本中进行选择。此示例使用默认值 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 支持自动扩缩的代管实例组。
控制台
- 在 Google Cloud 控制台中,转到“实例组”页面。
- 点击创建实例组。
- 选择 New managed instance group (stateless)(新的托管式实例组 [无状态])。如需了解详情,请参阅无状态或有状态 MIG。
- 输入
td-demo-hello-world-mig
作为代管实例组的名称,然后选择us-central1-a
区域。 - 在“实例模板”下,选择您创建的实例模板
td-demo-hello-world-template
。 - 在自动扩缩模式下,选择
Off:do not autoscale
。 - 在实例数上限下,指定至少两个实例作为您要在组中创建的实例数。
- 点击创建。
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 部署参考指南。
创建代管实例组
控制台
- 在 Google Cloud 控制台中,转到“实例组”页面。
- 点击创建实例组。
- 输入
td-vm-mig-us-central1
作为代管实例组的名称,然后选择us-central1-a
区域。 - 在组类型下,选择代管实例组。
- 在实例模板下,选择您创建的实例模板
td-vm-template-auto
。 - 指定
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-auto
使用 Google Cloud 负载均衡组件配置 Cloud Service Mesh
本部分中的说明介绍了如何配置 Cloud Service Mesh,以使 Envoy 代理对两个后端实例的出站流量进行负载平衡。您可以配置以下组件:
- 健康检查。如需详细了解健康检查,请参阅健康检查概念和创建健康检查。
- 防火墙规则,用于启用健康检查探测以访问后端。如需了解详情,请参阅健康检查概念。
- 后端服务。如需详细了解后端服务,请参阅后端服务。
- 路由规则映射。这包括创建转发规则和网址映射。如需了解详情,请参阅使用转发规则和使用网址映射。
创建健康检查
按照以下说明创建健康检查。如需了解详情,请参阅创建健康检查。
控制台
- 转到 Google Cloud 控制台中的“健康检查”页面。
转到“健康检查”页面 - 点击创建健康检查。
- 对于名称,请输入
td-vm-health-check
。 - 对于协议,请选择 HTTP。
- 点击创建。
gcloud
创建健康检查。
gcloud compute health-checks create http td-vm-health-check
创建防火墙规则
请按照以下说明创建健康检查探测所需的防火墙规则。如需了解详情,请参阅健康检查的防火墙规则。
控制台
- 进入 Google Cloud 控制台中的防火墙政策页面。
进入“防火墙政策”页面 - 点击创建防火墙规则。
- 在“创建防火墙规则”页面上,提供如下信息:
- 名称:
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
为健康检查创建防火墙规则。
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 服务。
控制台
前往 Google Cloud 控制台中的 Cloud Service Mesh 页面。
在服务标签页上,点击创建服务。
点击继续。
对于服务名称,请输入
td-vm-service
。选择正确的 VPC 网络。
确保后端类型是实例组。
选择
td-demo-hello-world-mig
,即您创建的代管实例组,其中包含Hello World
测试服务的后端。输入正确的端口号。
选择利用率或速率作为平衡模式。默认值为速率。
点击完成。
选择您创建的健康检查,或点击另创建一项健康检查,并确保选择 HTTP 作为协议。
在连接排空超时时间中,将值设置为
30
秒或更长时间。点击继续。
点击创建。
gcloud
创建后端服务。
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
将后端添加到后端服务。
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 代理会执行以下操作:
- 拦截请求。
- 根据网址映射中的流量管理规则对其进行评估。
- 根据请求中的主机名判断后端服务。
- 选择与所选后端服务关联的后端或端点。
- 将流量发送到该后端或端点。
如需详细了解流量管理,请参阅高级流量管理。
控制台
在 Google Cloud 控制台中,目标代理与转发规则结合创建。创建转发规则时,Google Cloud 会自动创建目标 HTTP 代理并将其附加到网址映射。
前往 Google Cloud 控制台中的 Cloud Service Mesh 页面。
在路由规则映射标签页上,点击创建路由规则映射。
输入名称。
点击添加转发规则。
对于转发规则名称,请输入
td-vm-forwarding-rule
。选择您的网络。
选择您的内部 IP。Envoy 代理会拦截发送到此 IP 地址的流量,并根据主机和路径规则将其发送到相应的服务。
系统会将转发规则创建为全局转发规则,其中
load-balancing-scheme
设置为INTERNAL_SELF_MANAGED
。在自定义 IP 字段中,输入
10.0.0.1
。当您的虚拟机发送到此 IP 地址时,Envoy 代理会根据网址映射中定义的流量管理规则拦截该 IP 地址,并将其发送到相应的后端服务端点。VPC 网络中的每个转发规则都必须具有唯一的 IP 地址和基于 VPC 网络的端口。如果您在特定 VPC 网络中创建了多个具有相同 IP 地址和端口的转发规则,则只有第一个转发规则才有效。其他选项会被忽略。如果您的网络不可用
10.0.0.1
,请选择其他 IP 地址。确保将端口设置为
80
。点击保存。
在路由规则部分,选择简单主机和路径规则。
在“主机和路径规则”部分,选择
td-vm-service
作为服务。点击添加主机和路径规则。
在主机中输入
hello-world
。在服务中,选择
td-vm-service
。点击保存。
gcloud
创建一个使用
td-vm-service
作为默认后端服务的网址映射。gcloud compute url-maps create td-vm-url-map \ --default-service td-vm-service
创建路径匹配器和主机规则,以根据主机名和路径为您的服务路由流量。此示例使用
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
创建目标 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 配置为跨代管实例组中的后端,对网址映射中指定的服务进行流量负载均衡。
验证配置
在 Compute Engine 虚拟机的 Cloud Service Mesh 设置指南的最后部分中,您将测试从发送到转发规则 VIP 的客户端虚拟机发送的流量是否被拦截并重定向到 Envoy 代理,然后将请求路由到托管 Hello World
服务。
为此,请登录已配置为拦截流量并将其重定向到 Envoy 的客户端虚拟机。您向与路由规则映射关联的 VIP 发送 curl
请求。Envoy 会检查 curl
请求,确定它应该解析到哪个服务,并将该请求发送到与该服务关联的后端。
- 在 Google Cloud 控制台中,转到“实例组”页面。
- 选择
td-vm-mig-us-central1
实例组。 - 在“虚拟机摘要”部分的连接下,点击 SSH。
- 登录到客户端虚拟机后,使用
curl
工具通过 Envoy 向Hello World
服务发送请求:
curl -H "Host: hello-world" http://10.0.0.1/
重复发出此命令时,您应该会看到不同的 HTML 响应,其中包含 Hello World
代管实例组中的后端主机名。这是因为 Envoy 在将流量发送到 Hello World
服务的后端时使用的是轮询负载平衡(默认负载平衡算法)。
后续步骤
- 了解高级流量管理。
- 了解如何使用 Envoy 设置可观测性。
- 了解如何排查 Cloud Service Mesh 部署问题。
- 了解自动 Envoy 部署选项指南中的高级部署选项。