使用混合连接网络端点组设置网络边缘服务
Google 提供各种网络边缘服务,这些服务可以增强位于 Google Cloud 外部(例如位于本地数据中心或其他公有云中)的服务(本地和多云服务)的功能和安全性。
这些网络边缘服务可让您实现以下目标:
通过单个 Anycast VIP 在全球范围内接收和路由外部客户流量。
通过使用外部应用负载均衡器和 Google 管理的 SSL 证书终止边缘的 TLS 流量,来减少服务器负载。
启用预配置的 Web 应用防火墙 (WAF) 规则,并通过 Google Cloud Armor 将许可名单和拒绝名单应用于传入流量。
使用 Identity-Aware Proxy (IAP) 控制用户对应用和资源的访问权限
使用 Cloud CDN 优化内容分发和最终用户延迟时间
为了向您的私有、本地或多云端服务引入这些优势,您需要部署外部应用负载均衡器以接收来自公共互联网的流量。外部应用负载平衡器将流量转发到 Cloud Service Mesh 配置的中间代理。此中间代理使用 Cloud VPN 或 Cloud Interconnect 将流量路由到本地环境或非 Google Cloud 环境。
本教程将介绍一个端到端示例,它在 Google 边缘使用 Google Cloud Armor 有选择地允许客户端以私密方式访问本地服务。根据客户端的 IP 地址允许客户端访问。
您将完成以下任务:
- 将 Envoy 部署为代管式实例组 (MIG) 中的中间代理。此 Envoy 代理会自动连接到 Cloud Service Mesh。
- 创建模拟的专用本地虚拟机 (VM) 实例。在实际的例子中,您可能已经拥有本地虚拟机。
- 将 Cloud Service Mesh 配置为将到达中间代理的所有请求都路由到模拟的本地虚拟机。
- 创建外部应用负载均衡器,以接收来自公共互联网的流量,并将其转发到中间代理。
- 将 Google Cloud Armor 安全政策关联到外部应用负载均衡器。
完成这些任务后,您可以选择性地探索其他边缘服务和高级流量管理功能。
前提条件
在设置中间代理之前,请完成以下任务:
查看准备使用 Envoy 设置 Cloud Service Mesh 并完成所有前提任务,包括授予所需权限和角色以及启用 Cloud Service Mesh API。
确保可以通过 Cloud VPN 或 Cloud Interconnect 从 Google Cloud Virtual Private Cloud (VPC) 网络访问专用本地端点。本教程中使用的示例仅将流量路由到 Google Cloud 中的端点,因此您无需配置混合连接即可。在实际部署场景中,需要配置混合连接。
确保您的 VPC 子网 CIDR 范围与远程 CIDR 范围无冲突。当 IP 地址重叠时,子网路由优先于远程连接。
在本演示中,获取创建和更新 Google Cloud Armor 安全政策的必要权限。如果您想使用其他服务(如 Cloud CDN),权限可能会有所不同。
在 Compute Engine 虚拟机上部署中间代理
本部分介绍如何在 Compute Engine 上部署 Envoy 作为中间代理以从外部负载平衡器接收流量,并将其转发到远程目标。
为中间代理创建实例模板
实例模板指定代管式实例组 (MIG) 中的虚拟机的配置。
使用以下模板可创建 Envoy 代理连接到 Cloud Service Mesh 的虚拟机实例:
gcloud compute instance-templates create td-middle-proxy \ --service-proxy=enabled \ --tags=allow-hc
如需自定义 Envoy 部署(例如通过指定网络名称、设置日志路径或启用跟踪功能进行),请参阅自动化 Envoy 部署选项指南。
为中间代理创建代管式实例组
根据模板创建代管式实例组。在此示例中,您可以将实例组大小保留为 1 以部署单个实例。要在生产环境中使用,请启用自动扩缩功能(例如基于 CPU 利用率),以避免在中间代理需要处理大量流量时产生瓶颈。
gcloud compute instance-groups managed create td-middle-proxy-us-central1-a \ --zone=us-central1-a \ --template=td-middle-proxy \ --size=1
为在以后进行配置和验证,请识别并存储
MIDDLE_PROXY_IP
中实例的内部 IP 地址:MIDDLE_PROXY_IP=$(gcloud compute instances list \ --filter="name~'td-middle-proxy-us-central1-a-.*'" \ --zones=us-central1-a \ --format="value(networkInterfaces.networkIP)")
在此示例中,我们将在 us-central1-a
中创建一个 MIG,其中包含运行 Envoy 的虚拟机实例。在本教程的后面部分,您将创建一个外部负载均衡器来处理来自客户端的公共互联网流量。
由于外部负载均衡器可自动将流量路由到距离客户端最近的区域,以及该区域中的 MIG,因此您可能需要考虑创建多个 MIG。如需查看 Google Cloud 的可用区域和可用区的完整列表,请参阅区域和可用区。
部署模拟的本地服务
本部分介绍如何部署混合连接网络端点组 (NEG)。在生产部署中,此 NEG 将包含解析为本地服务器的端点 (IP:port
)。在此示例中,您将创建一个可在 IP:port
上访问的 Compute Engine 虚拟机。此虚拟机充当您的模拟本地服务器。
创建模拟的本地虚拟机
部署单个虚拟机实例以模拟私人的本地服务器:
gcloud compute instances create on-prem-vm \ --zone=us-central1-a \ --metadata startup-script='#! /bin/bash ## Installs apache and a custom homepage sudo su - apt-get update apt-get install -y apache2 cat <<EOF > /var/www/html/index.html <html><body><h1>Hello world from on-premises!</h1></body></html> EOF'
识别并存储其内部 IP 地址以用于将来的配置和验证。此虚拟机上的服务器侦听端口
80
上的入站请求。ON_PREM_IP=$(gcloud compute instances describe on-prem-vm \ --zone=us-central1-a \ --format="value(networkInterfaces.networkIP)" | sed "s/['\[\]]*//g")
创建 NEG
通过指定 non-gcp-private-ip-port
网络端点类型,为此演示设置创建 NEG。将模拟的本地虚拟机的 IP 地址和端口以端点形式添加到此 NEG 中。按照上一步操作后,IP 地址存储在 ON_PREM_IP
环境变量中。
创建 NEG:
gcloud compute network-endpoint-groups create td-on-prem-neg \ --network-endpoint-type=non-gcp-private-ip-port \ --zone=us-central1-a
将
IP:port
添加到新的 NEG 中:gcloud compute network-endpoint-groups update td-on-prem-neg \ --zone=us-central1-a \ --add-endpoint="ip=$ON_PREM_IP,port=80"
使用 Cloud Load Balancing 组件配置 Cloud Service Mesh
本部分介绍如何配置 Cloud Service Mesh 并启用中间代理以将流量转发到您的专用本地服务。您可以配置以下组件:
健康检查。此健康检查的行为与为其他 NEG 类型配置的健康检查的行为略有不同。
后端服务。如需了解详情,请参阅后端服务概览。
路由规则映射。此步骤包括创建转发规则、目标代理和网址映射。如需了解详情,请参阅路由规则映射。
创建健康检查
健康检查会验证您的端点是否健康状况良好以及是否能够接收请求。这种类型的 NEG 的健康检查依赖于 Envoy 的分布式健康检查机制。
其他 NEG 类型使用 Google Cloud 的集中式健康检查系统:
gcloud compute health-checks create http td-on-prem-health-check
创建后端服务
使用
INTERNAL_SELF_MANAGED
负载均衡方案创建要与 Cloud Service Mesh 配合使用的后端服务。创建此后端服务时,请指定之前创建的健康检查:gcloud compute backend-services create td-on-prem-backend-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --health-checks=td-on-prem-health-check
添加您之前创建的 NEG 作为该后端服务的后端。
gcloud compute backend-services add-backend td-on-prem-backend-service \ --global \ --network-endpoint-group=td-on-prem-neg \ --network-endpoint-group-zone=us-central1-a \ --balancing-mode=RATE \ --max-rate-per-endpoint=5
创建路由规则映射
路由规则映射定义了 Cloud Service Mesh 如何将流量路由到您的后端服务。
创建一个使用先前定义的后端服务的网址映射。
gcloud compute url-maps create td-hybrid-url-map \ --default-service=td-on-prem-backend-service
创建一个名为
target_proxy.yaml
且包含以下内容的文件:name: td-hybrid-proxy proxyBind: true urlMap: global/urlMaps/td-hybrid-url-map
使用
import
命令创建目标 HTTP 代理(如需了解详情,请参阅 Cloud Service Mesh 的目标代理):gcloud compute target-http-proxies import td-hybrid-proxy \ --source=target_proxy.yaml
创建引用此目标 HTTP 代理的转发规则。 将转发规则的 IP 地址设置为
0.0.0.0
。将规则的 IP 地址设置为0.0.0.0
,系统会根据在网址映射中配置的入站端口、HTTP 主机名和路径信息路由流量。在 HTTP 请求中指定的 IP 地址会被忽略。gcloud compute forwarding-rules create td-hybrid-forwarding-rule \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --address=0.0.0.0 \ --target-http-proxy=td-hybrid-proxy \ --ports=8080 \ --network=default
验证中间代理是否可以将请求路由到模拟的本地服务
Cloud Service Mesh 现已配置为通过中间代理将流量路由到模拟的专用本地服务。如需验证此配置,您可以创建一个测试客户端虚拟机、登录该虚拟机,然后向运行 Envoy 的中间代理发送请求。验证配置后,删除该测试客户端虚拟机。
获取中间代理的 IP 地址。此信息只需用于验证步骤:
gcloud compute instances list
写下或记下
td-middle-proxy-us-central1-a
中实例的 IP 地址。创建测试客户端实例:
gcloud compute instances create test-client \ --zone=us-central1-a
使用
ssh
登录测试客户端:gcloud compute ssh test-client --zone=us-central1-a
向中间代理虚拟机发送请求,并使用
MIDDLE_PROXY_IP
替换之前获取的 IP 地址:curl $MIDDLE_PROXY_IP:8080
您会看到以下输出内容:
Hello world from on-premises!
退出测试客户端虚拟机。退出后,您可以删除虚拟机:
gcloud compute instances delete test-client \ --zone=us-central1-a
部署外部应用负载均衡器
在本部分中,您将部署一个外部应用负载均衡器,用于将传入流量发送到中间代理。此部署是标准外部应用负载均衡器设置。
保留外部 IP 地址
创建外部客户端将流量发送至的全球静态外部 IP 地址 (external-lb-vip
)。在本教程后面的验证步骤中,您将检索此外部 IP 地址。
gcloud compute addresses create external-lb-vip \ --ip-version=IPV4 \ --global
设置外部 HTTP 负载平衡器
配置外部负载平衡器,以将互联网客户流量路由到已配置的中间代理。
创建健康检查,用于确定运行中间代理的 MIG 是否健康状况良好以及能够接收流量:
gcloud compute health-checks create tcp tcp-basic-check \ --port=8080
创建防火墙规则以允许健康检查。在此处重复使用
allow-hc
标记,以将防火墙规则应用于中间代理虚拟机:gcloud compute firewall-rules create fw-allow-health-checks \ --network=default \ --action=ALLOW \ --direction=INGRESS \ --source-ranges=35.191.0.0/16,130.211.0.0/22 \ --target-tags=allow-hc \ --rules=tcp
创建后端服务:
gcloud compute backend-services create td-middle-proxy-backend-service \ --protocol=HTTP \ --health-checks=tcp-basic-check \ --global
将中间代理 MIG 作为后端添加到此后端服务:
gcloud compute backend-services add-backend td-middle-proxy-backend-service \ --instance-group=td-middle-proxy-us-central1-a \ --instance-group-zone=us-central1-a \ --global
创建网址映射,以将传入的请求作为默认后端服务路由到中间代理:
gcloud compute url-maps create lb-map-http \ --default-service=td-middle-proxy-backend-service
创建目标 HTTP 代理,以便根据网址映射处理对外部负载均衡器的转发规则虚拟 IP 地址 (VIP) 的请求:
gcloud compute target-http-proxies create http-lb-proxy \ --url-map=lb-map-http
创建全球转发规则以将传入请求路由到目标 HTTP 代理:
gcloud compute forwarding-rules create http-forwarding-rule \ --address=external-lb-vip\ --global \ --load-balancing-scheme=EXTERNAL \ --target-http-proxy=http-lb-proxy \ --ports=80
设置 MIG 的已命名端口
为该实例组设置一个命名端口,以允许中间代理从外部负载平衡器接收 HTTP 流量:
gcloud compute instance-groups managed set-named-ports td-middle-proxy-us-central1-a \ --named-ports=http:8080 \ --zone=us-central1-a
验证外部应用负载均衡器配置
在此步骤中,您将验证是否正确设置了外部负载平衡器。
您应该能够向负载平衡器的 VIP 发送请求,并接收到来自模拟的本地虚拟机的响应:
PUBLIC_VIP=gcloud compute addresses describe external-lb-vip \ --format="get(address)" \ --global
向外部 IP 地址 (
PUBLIC_VIP
) 发出curl
请求,并验证您是否收到Hello world
消息:curl $PUBLIC_VIP
您将看到以下输出内容:
Hello world from on-premises!
启用 Google Cloud Armor
将 Google Cloud Armor 安全政策配置为仅允许从 CLIENT_IP_RANGE
访问您的服务,其中应包含您打算用于测试的客户端设备的外部 IP 地址;例如 "192.0.2.0/24"
。
这些政策适用于外部负载均衡器的后端服务(在此示例中为指向中间代理的 td-hybrid-backend-service
)。如需详细了解设置这些规则所需的权限,请参阅配置 Google Cloud Armor 安全政策。
创建 Google Cloud Armor 安全政策:
gcloud compute security-policies create external-clients-policy \ --description="policy for external clients"
更新安全政策的默认规则以拒绝所有流量:
gcloud compute security-policies rules update 2147483647 \ --security-policy=external-clients-policy \ --action="deny-404"
添加优先级较高的规则,以允许从特定 IP 范围传入的流量:
gcloud compute security-policies rules create 1000 \ --security-policy=external-clients-policy \ --description="allow traffic from CLIENT_IP_RANGE" \ --src-ip-ranges="CLIENT_IP_RANGE" \ --action="allow"
将 Google Cloud Armor 安全政策关联到后端服务:
gcloud compute backend-services update td-middle-proxy-backend-service \ --security-policy=external-clients-policy
最终验证
向外部应用负载均衡器的公共虚拟 IP 地址发出
curl
请求。如果客户端设备的 IP 地址在之前指定的允许的CLIENT_IP_RANGE
内,您应该会收到预期响应。curl $PUBLIC_VIP
您将看到以下输出内容:
Hello world from on-premises!
从 IP 地址在
CLIENT_IP_RANGE
以外的不同客户端设备发出相同的curl
请求,或者只是更新您的安全政策规则,使其不再包含您的客户端 IP 地址。 现在,您应会收到404 Not Found
错误。
问题排查
以下说明介绍了如何解决配置问题。
无法通过全球外部应用负载均衡器 IP 地址访问我的本地服务
假设您已在运行 Envoy 的 Google Cloud 虚拟机上访问本地服务,请按照以下步骤排查设置问题:
确保 Google Cloud Envoy MIG 报告为健康状况良好。在 Google Cloud Console 中,转到网络服务 > 负载均衡,然后点击
url-map lb-map-http
以查看其详情。您应该能够看到td-middle-proxy-us-central1-a
中的 1/1 的实例健康状况良好。如果实例健康状况不佳,请检查防火墙规则是否配置为允许入站健康检查流量流向运行 Envoy 的 Google Cloud 虚拟机:
gcloud compute firewall-rules describe fw-allow-health-check
您应该会看到以下输出内容:
allowed: ‑ IPProtocol: tcp ... direction: INGRESS disabled: false ... ... sourceRanges: ‑ 130.211.0.0/22 ‑ 35.191.0.0/16 targetTags: ‑ allow-hc
后续步骤
如需查找适用于本地或多云服务的更复杂的路由政策,请参阅 Cloud Service Mesh 的高级流量管理功能。
如需部署 Cloud Service Mesh,请参阅设置指南概览。
如需启用其他网络边缘服务,请参阅以下指南: