使用混合连接网络端点组设置网络边缘服务

Google 提供各种网络边缘服务,这些服务可以增强位于 Google Cloud 外部(例如位于本地数据中心或其他公有云中)的服务(本地和多云服务)的功能和安全性。

这些网络边缘服务可让您实现以下目标:

网络边缘服务示例。
网络边缘服务示例(点击可放大)

为了向您的私有、本地或多云端服务引入这些优势,您需要部署外部应用负载均衡器以接收来自公共互联网的流量。外部应用负载平衡器将流量转发到 Cloud Service Mesh 配置的中间代理。此中间代理使用 Cloud VPN 或 Cloud Interconnect 将流量路由到本地环境或非 Google Cloud 环境。

本教程将介绍一个端到端示例,它在 Google 边缘使用 Google Cloud Armor 有选择地允许客户端以私密方式访问本地服务。根据客户端的 IP 地址允许客户端访问。

您将完成以下任务:

  1. 将 Envoy 部署为代管式实例组 (MIG) 中的中间代理。此 Envoy 代理会自动连接到 Cloud Service Mesh。
  2. 创建模拟的专用本地虚拟机 (VM) 实例。在实际的例子中,您可能已经拥有本地虚拟机。
  3. 将 Cloud Service Mesh 配置为将到达中间代理的所有请求都路由到模拟的本地虚拟机。
  4. 创建外部应用负载均衡器,以接收来自公共互联网的流量,并将其转发到中间代理。
  5. 将 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) 中的虚拟机的配置。

  1. 使用以下模板可创建 Envoy 代理连接到 Cloud Service Mesh 的虚拟机实例:

    gcloud compute instance-templates create td-middle-proxy \
        --service-proxy=enabled \
        --tags=allow-hc
    
  2. 如需自定义 Envoy 部署(例如通过指定网络名称、设置日志路径或启用跟踪功能进行),请参阅自动化 Envoy 部署选项指南

为中间代理创建代管式实例组

  1. 根据模板创建代管式实例组。在此示例中,您可以将实例组大小保留为 1 以部署单个实例。要在生产环境中使用,请启用自动扩缩功能(例如基于 CPU 利用率),以避免在中间代理需要处理大量流量时产生瓶颈。

    gcloud compute instance-groups managed create td-middle-proxy-us-central1-a \
        --zone=us-central1-a \
        --template=td-middle-proxy \
        --size=1
    
  2. 为在以后进行配置和验证,请识别并存储 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 虚拟机。此虚拟机充当您的模拟本地服务器。

创建模拟的本地虚拟机

  1. 部署单个虚拟机实例以模拟私人的本地服务器:

    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'
    
  2. 识别并存储其内部 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 环境变量中。

  1. 创建 NEG:

    gcloud compute network-endpoint-groups create td-on-prem-neg \
        --network-endpoint-type=non-gcp-private-ip-port \
        --zone=us-central1-a
    
  2. 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

创建后端服务

  1. 使用 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
    
  2. 添加您之前创建的 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 如何将流量路由到您的后端服务。

  1. 创建一个使用先前定义的后端服务的网址映射。

    gcloud compute url-maps create td-hybrid-url-map \
        --default-service=td-on-prem-backend-service
    
  2. 创建一个名为 target_proxy.yaml 且包含以下内容的文件:

    name: td-hybrid-proxy
    proxyBind: true
    urlMap: global/urlMaps/td-hybrid-url-map
    
  3. 使用 import 命令创建目标 HTTP 代理(如需了解详情,请参阅 Cloud Service Mesh 的目标代理):

    gcloud compute target-http-proxies import td-hybrid-proxy \
        --source=target_proxy.yaml
    
  4. 创建引用此目标 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 的中间代理发送请求。验证配置后,删除该测试客户端虚拟机。

  1. 获取中间代理的 IP 地址。此信息只需用于验证步骤:

    gcloud compute instances list
    
  2. 写下或记下 td-middle-proxy-us-central1-a 中实例的 IP 地址。

  3. 创建测试客户端实例:

    gcloud compute instances create test-client \
        --zone=us-central1-a
    
  4. 使用 ssh 登录测试客户端:

    gcloud compute ssh test-client
        --zone=us-central1-a
    
  5. 向中间代理虚拟机发送请求,并使用 MIDDLE_PROXY_IP 替换之前获取的 IP 地址:

    curl $MIDDLE_PROXY_IP:8080
    

    您会看到以下输出内容:

    Hello world from on-premises!
    
  6. 退出测试客户端虚拟机。退出后,您可以删除虚拟机:

    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 负载平衡器

配置外部负载平衡器,以将互联网客户流量路由到已配置的中间代理。

  1. 创建健康检查,用于确定运行中间代理的 MIG 是否健康状况良好以及能够接收流量:

    gcloud compute health-checks create tcp tcp-basic-check \
        --port=8080
    
  2. 创建防火墙规则以允许健康检查。在此处重复使用 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
    
  3. 创建后端服务:

    gcloud compute backend-services create td-middle-proxy-backend-service \
        --protocol=HTTP \
        --health-checks=tcp-basic-check \
        --global
    
  4. 将中间代理 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
    
  5. 创建网址映射,以将传入的请求作为默认后端服务路由到中间代理:

    gcloud compute url-maps create lb-map-http \
        --default-service=td-middle-proxy-backend-service
    
  6. 创建目标 HTTP 代理,以便根据网址映射处理对外部负载均衡器的转发规则虚拟 IP 地址 (VIP) 的请求:

    gcloud compute target-http-proxies create http-lb-proxy \
        --url-map=lb-map-http
    
  7. 创建全球转发规则以将传入请求路由到目标 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

验证外部应用负载均衡器配置

在此步骤中,您将验证是否正确设置了外部负载平衡器。

  1. 您应该能够向负载平衡器的 VIP 发送请求,并接收到来自模拟的本地虚拟机的响应:

    PUBLIC_VIP=gcloud compute addresses describe external-lb-vip \
        --format="get(address)" \
        --global
    
  2. 向外部 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 安全政策

  1. 创建 Google Cloud Armor 安全政策:

    gcloud compute security-policies create external-clients-policy \
        --description="policy for external clients"
    
  2. 更新安全政策的默认规则以拒绝所有流量:

    gcloud compute security-policies rules update 2147483647 \
        --security-policy=external-clients-policy \
        --action="deny-404"
    
  3. 添加优先级较高的规则,以允许从特定 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"
    
  4. 将 Google Cloud Armor 安全政策关联到后端服务:

    gcloud compute backend-services update td-middle-proxy-backend-service \
        --security-policy=external-clients-policy
    

最终验证

  1. 向外部应用负载均衡器的公共虚拟 IP 地址发出 curl 请求。如果客户端设备的 IP 地址在之前指定的允许的 CLIENT_IP_RANGE 内,您应该会收到预期响应。

    curl $PUBLIC_VIP
    

    您将看到以下输出内容:

    Hello world from on-premises!
    
  2. 从 IP 地址在 CLIENT_IP_RANGE 以外的不同客户端设备发出相同的 curl 请求,或者只是更新您的安全政策规则,使其不再包含您的客户端 IP 地址。 现在,您应会收到 404 Not Found 错误。

问题排查

以下说明介绍了如何解决配置问题。

无法通过全球外部应用负载均衡器 IP 地址访问我的本地服务

假设您已在运行 Envoy 的 Google Cloud 虚拟机上访问本地服务,请按照以下步骤排查设置问题:

  1. 确保 Google Cloud Envoy MIG 报告为健康状况良好。在 Google Cloud Console 中,转到网络服务 > 负载均衡,然后点击 url-map lb-map-http 以查看其详情。您应该能够看到 td-middle-proxy-us-central1-a 中的 1/1 的实例健康状况良好。

  2. 如果实例健康状况不佳,请检查防火墙规则是否配置为允许入站健康检查流量流向运行 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
    

后续步骤