使用 Cloud Storage 存储分区设置区域级外部应用负载平衡器

本文档介绍了如何创建区域级外部应用负载平衡器,以将针对静态内容的请求路由到 Cloud Storage 存储分区

准备工作

确保您的设置符合以下前提条件。

安装 Google Cloud CLI

本指南中的某些说明只能使用 Google Cloud CLI 执行。如需安装,请参阅安装 gcloud CLI

您可以在 API 和 gcloud CLI 参考文档中找到与负载均衡相关的命令。

所需的角色

如果您是项目创建者,则会被授予 Owner 角色 (roles/owner)。默认情况下,Owner 角色 (roles/owner) 或 Editor 角色 (roles/editor) 可提供遵循本文档所需的权限。

如果您不是项目创建者,则必须向相应的主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号。 <0x0A

如需获得创建 Cloud Storage 存储分区和网络资源所需的权限,请让管理员向您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

如需详细了解 Cloud Load Balancing 的角色和权限,请参阅角色和权限。如需详细了解如何定义 IAM 政策以针对转发规则授予有条件授权,请参阅适用于转发规则的 IAM Conditions

设置 SSL 证书资源

对于使用 HTTPS 作为请求和响应协议的区域级外部应用负载平衡器,您可以使用 Compute Engine SSL 证书或 Certificate Manager 证书创建 SSL 证书资源。

在此示例中,请按照以下其中一个文档中的说明使用 Certificate Manager 创建 SSL 证书资源:

创建证书后,您可以将证书附加到 HTTPS 目标代理。

我们建议您使用 Google 管理的证书。

限制

当 Cloud Storage 存储分区用作区域级外部应用负载平衡器的后端时,会受到以下限制:

  • 不支持专用存储桶访问,因此后端存储桶必须可通过互联网公开访问。

  • 不支持签名网址

  • 为区域级外部应用负载平衡器创建后端存储分区时,无法使用 Cloud CDN 集成。

  • 使用区域级外部应用负载平衡器访问后端存储分区时,仅支持 HTTP GET 方法。您可以从存储分区下载内容,但无法通过区域级外部应用负载平衡器将内容上传到存储分区。

  • 对于区域级外部应用负载平衡器,仅支持配置负载平衡器的区域中的 Cloud Storage 存储分区。不支持双区域多区域存储分区。

设置概览

下图展示了区域级外部应用负载平衡器,其后端存储分区与负载平衡器位于同一区域。

区域级外部应用负载平衡器的转发规则具有外部 IP 地址。

区域级外部应用负载平衡器将流量发送到 Cloud Storage 后端。
将流量分配到 Cloud Storage(点击可放大)

在接下来的部分中,您将配置上图所示的不同资源。

配置网络和代理专用子网

此示例使用以下 VPC 网络、区域和代理专用子网:

  • 网络。网络是名为 lb-network自定义模式 VPC 网络

  • Envoy 代理的子网us-east1 区域中名为 proxy-only-subnet-us 的子网使用 10.129.0.0/23 作为其主要 IP 范围。

配置自定义模式 VPC 网络

控制台

  1. 在 Google Cloud 控制台中,前往 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 对于名称,输入 lb-network

  4. 点击创建

gcloud

  1. 使用 gcloud compute networks create 命令创建一个名为 lb-network 的自定义 VPC 网络。

    gcloud compute networks create lb-network --subnet-mode=custom
    

配置代理专用子网

代理专用子网提供了一组 IP 地址,供 Google Cloud 用于代表您运行 Envoy 代理。代理会终结来自客户端的连接并创建与后端的新连接。

此代理专用子网用于与 VPC 网络位于同一区域的所有基于 Envoy 的区域级负载均衡器。在每个网络中,每个区域只能有一个活跃代理专用子网用于给定用途。

控制台

  1. 在 Google Cloud 控制台中,前往 VPC 网络页面。

    进入 VPC 网络页面

  2. 点击您创建的 VPC 网络的名称。

  3. 子网标签页中,点击添加子网

  4. 请输入以下信息:

    • 名称proxy-only-subnet-us
    • 区域us-east1
    • 用途区域级托管式代理
    • IP 地址范围10.129.0.0/23
  5. 点击添加

gcloud

  1. 使用 gcloud compute networks subnets create 命令us-east1 区域中创建代理专用子网。

    gcloud compute networks subnets create proxy-only-subnet-us \
        --purpose=REGIONAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=us-east1 \
        --network=lb-network \
        --range=10.129.0.0/23
    

配置 Cloud Storage 存储桶

配置 Cloud Storage 存储桶的过程如下所示:

  • 创建存储桶。
  • 将内容复制到存储桶。

创建 Cloud Storage 存储桶

在此示例中,您将在 us-east1 区域中创建两个 Cloud Storage 存储分区。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 点击 创建

  3. 开始使用部分中,输入遵循命名准则的全局唯一名称。

  4. 点击选择数据存储位置

  5. 位置类型设置为区域

  6. 从区域列表中选择 us-east1

  7. 点击创建

  8. 点击存储桶以返回“Cloud Storage 存储桶”页面。按照上述说明在 us-east1 区域中创建第二个存储分区。

gcloud

  1. 使用 gcloud storage buckets create 命令us-east1 区域中创建第一个存储桶。

    gcloud storage buckets create gs://BUCKET1_NAME \
        --default-storage-class=standard \
        --location=us-east1 \
        --uniform-bucket-level-access
    
  2. 使用 gcloud storage buckets create 命令us-east1 区域中创建第二个存储分区。

    gcloud storage buckets create gs://BUCKET2_NAME \
        --default-storage-class=standard \
        --location=us-east1 \
        --uniform-bucket-level-access
    

将变量 BUCKET1_NAMEBUCKET2_NAME 替换为您的 Cloud Storage 存储分区名称。

将图形文件复制到 Cloud Storage 存储桶

将图形文件从公共 Cloud Storage 存储桶复制到自己的 Cloud Storage 存储桶,以便能够测试设置。

在 Cloud Shell 中运行以下命令,将存储桶名称变量替换为您的唯一 Cloud Storage 存储桶名称:

gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET1_NAME/love-to-purr/
gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET2_NAME/love-to-fetch/

将 Cloud Storage 存储桶设为可公开读取

如需将存储桶中的所有对象设为可供公共互联网上的所有人读取,请为主账号 allUsers 授予 Storage Object Viewer 角色 (roles/storage.objectViewer)。

控制台

要授予所有用户查看存储桶中对象的权限,请对每个存储桶重复执行以下过程:

  1. 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 在存储桶列表中,点击您要设为公开的存储桶的名称。

  3. 选择权限标签页。

  4. 权限部分中,点击 授予访问权限按钮。 系统会显示授予访问权限对话框。

  5. 新的主账号字段中,输入 allUsers

  6. 选择角色字段的过滤条件框中输入 Storage Object Viewer,然后从过滤后的结果中选择 Storage Object Viewer

  7. 点击保存

  8. 点击允许公开访问

gcloud

如需授予所有用户查看存储桶中对象的权限,请运行 buckets add-iam-policy-binding 命令

gcloud storage buckets add-iam-policy-binding gs://BUCKET1_NAME \
    --member=allUsers \
    --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET2_NAME \
   --member=allUsers \
   --role=roles/storage.objectViewer

预留负载均衡器的 IP 地址

为负载平衡器的转发规则预留静态外部 IP 地址。

控制台

  1. 在 Google Cloud 控制台中,前往预留静态地址页面。

    进入“预留静态地址”

  2. 为新地址选择一个名称

  3. 对于 IP 版本,请选择 IPv4

  4. 对于类型,请选择区域

  5. 对于地区,选择 us-east1

  6. 附加目标选项设置为。创建负载均衡器后,此 IP 地址会关联到负载均衡器的转发规则。

  7. 点击预留以预留该 IP 地址。

gcloud

  1. 如需预留静态外部 IP 地址,请使用 gcloud compute addresses create 命令

    gcloud compute addresses create ADDRESS_NAME \
       --region=us-east1
    

    请替换以下内容:

    • ADDRESS_NAME:您要为此地址指定的名称。
  2. 使用 gcloud compute addresses describe 命令可以查看结果:

    gcloud compute addresses describe ADDRESS_NAME
    

返回的 IP 地址在下文中称为 RESERVED_IP_ADDRESS

使用后端存储桶配置负载均衡器

本部分介绍了如何为区域级外部应用负载平衡器创建以下资源:

  • 两个后端存储桶。后端存储桶充当您之前创建的 Cloud Storage 存储桶的封装容器。
  • 网址映射
  • 目标代理
  • 使用区域级 IP 地址的转发规则。转发规则具有外部 IP 地址。

在此示例中,您可以使用 HTTP 或 HTTPS 作为客户端与负载均衡器之间的请求和响应协议。如需创建 HTTPS 负载均衡器,您必须向该负载均衡器的前端添加 SSL 证书资源。

如需使用 gcloud CLI 创建上述负载均衡组件,请按照以下步骤操作:

  1. 使用 gcloud beta compute backend-buckets create 命令us-east1 区域中创建两个后端存储分区。 后端存储分区的负载均衡方案为 EXTERNAL_MANAGED

    gcloud beta compute backend-buckets create backend-bucket-cats \
        --gcs-bucket-name=BUCKET1_NAME \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --region=us-east1
    
    gcloud beta compute backend-buckets create backend-bucket-dogs \
        --gcs-bucket-name=BUCKET2_NAME \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --region=us-east1
    

    将变量 BUCKET1_NAMEBUCKET2_NAME 替换为您的 Cloud Storage 存储分区名称。

  2. 使用 gcloud beta compute url-maps create 命令创建网址映射,以将传入请求路由到后端存储桶。

    gcloud beta compute url-maps create URL_MAP_NAME \
        --default-backend-bucket=backend-bucket-cats \
        --region=us-east1
    

    将变量 URL_MAP_NAME 替换为网址映射的名称。

  3. 使用 gcloud beta compute url-maps add-path-matcher 命令配置网址映射的主机和路径规则。

    在此示例中,默认后端存储桶为 backend-bucket-cats,它会处理其中存在的所有路径。不过,任何以 http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg 为目标的请求都会使用 backend-bucket-dogs 后端。例如,如果默认后端 (backend-bucket-cats) 中也存在 /love-to-fetch/ 文件夹,负载均衡器会优先使用 backend-bucket-dogs 后端,因为 /love-to-fetch/* 有特定的路径规则。

    gcloud beta compute url-maps add-path-matcher URL_MAP_NAME \
        --path-matcher-name=path-matcher-pets \
        --new-hosts=* \
        --backend-bucket-path-rules="/love-to-fetch/*=backend-bucket-dogs" \
        --default-backend-bucket=backend-bucket-cats
    

    将变量 URL_MAP_NAME 替换为网址映射的名称。

  4. 使用 gcloud compute target-http-proxies create 命令创建目标代理。

    对于 HTTP 流量,请创建目标 HTTP 代理以将请求路由到网址映射:

    gcloud compute target-http-proxies create http-proxy \
        --url-map=URL_MAP_NAME \
        --region=us-east1
    

    将变量 URL_MAP_NAME 替换为网址映射的名称。

    对于 HTTPS 流量,请创建目标 HTTPS 代理以将请求路由到网址映射。该代理属于负载均衡器,包含用于 HTTPS 负载均衡器的 SSL 证书。创建证书后,您可以将该证书附加到 HTTPS 目标代理。

    如需附加 Certificate Manager 证书,请运行以下命令:

    gcloud compute target-https-proxies create https-proxy \
        --url-map=URL_MAP_NAME \
        --certificate-manager-certificates=CERTIFICATE_NAME \
        --region=us-east1
    

    替换以下内容:

  5. 使用 gcloud compute forwarding-rules create 命令创建一条转发规则,该规则使用 us-east1 区域中的 IP 地址。

    对于 HTTP 流量,请创建区域转发规则以将传入请求路由到 HTTP 目标代理:

    gcloud compute forwarding-rules create http-fw-rule \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --network=lb-network \
        --address=RESERVED_IP_ADDRESS \
        --ports=80 \
        --region=us-east1 \
        --target-http-proxy=http-proxy \
        --target-http-proxy-region=us-east1
    

    对于 HTTPS 流量,请创建区域转发规则以将传入请求路由到 HTTPS 目标代理:

    gcloud compute forwarding-rules create https-fw-rule \
        --load-balancing-scheme=EXTERNAL_MANAGED \
        --network=lb-network \
        --address=RESERVED_IP_ADDRESS \
        --ports=443 \
        --region=us-east1 \
        --target-https-proxy=https-proxy \
        --target-https-proxy-region=us-east1
    

向负载均衡器发送 HTTP 请求

现在,负载均衡服务已运行,您可以向负载平衡器的转发规则发送请求。

  1. 获取负载均衡器转发规则 (http-fw-rule) 的 IP 地址,该 IP 地址位于 us-east1 区域。

      gcloud compute forwarding-rules describe http-fw-rule \
          --region=us-east1
    

    复制返回的 IP 地址,以便在下一步中用作 FORWARDING_RULE_IP_ADDRESS

  2. 使用 curl 向转发规则的虚拟 IP 地址 (VIP) 发出 HTTP 请求。

      curl http://FORWARDING_RULE_IP_ADDRESS/love-to-purr/three-cats.jpg --output three-cats.jpg
    
      curl http://FORWARDING_RULE_IP_ADDRESS/love-to-fetch/two-dogs.jpg --output two-dogs.jpg
    

后续步骤