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

本文档介绍了如何创建regional internal Application Load Balancer ,以将针对静态内容的请求路由到 Cloud Storage 存储分区

准备工作

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

安装 Google Cloud CLI

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

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

所需的角色

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

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

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

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

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

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

设置 SSL 证书资源

对于使用 HTTPS 作为请求和响应协议的 regional internal Application Load Balancer ,请按照以下其中一个文档中的说明使用 Certificate Manager 创建 SSL 证书资源:

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

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

限制

当 Cloud Storage 存储分区用作 regional internal Application Load Balancer的后端时,会受到以下限制:

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

  • 不支持签名网址

  • 为regional internal Application Load Balancer创建后端存储分区时,无法使用 Cloud CDN 集成。

  • 使用 regional internal Application Load Balancer 访问后端存储分区时,仅支持 HTTP GET 方法。您可以从存储分区下载内容,但无法通过regional internal Application Load Balancer 将内容上传到存储分区。

  • 对于 regional internal Application Load Balancer,Cloud Storage 存储分区仅在配置负载平衡器的区域中受支持。不支持双区域多区域存储分区。

设置概览

您可以按以下架构图所示,在区域中配置 regional internal Application Load Balancer :

 regional internal Application Load Balancer 将流量发送到 Cloud Storage 后端。
将流量分配到 Cloud Storage(点击可放大)

如架构图所示,此示例在虚拟私有云 (VPC) 网络中创建了一个regional internal Application Load Balancer ,其中包含两个后端存储分区,每个后端存储分区都引用一个 Cloud Storage 存储分区。Cloud Storage 存储分区位于 us-east1 区域,您可以在每个存储分区之间平衡流量负载。

配置网络和子网

在 VPC 网络中,在要配置负载平衡器转发规则的区域 us-east1 中配置子网。此外,请在要配置负载平衡器的区域 us-east1 中配置代理专用子网。

本示例使用以下 VPC 网络、区域和子网:

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

  • 负载平衡器的子网us-east1 区域中名为 subnet-us 的子网使用 10.1.2.0/24 作为其主要 IP 范围。

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

为负载均衡器的转发规则配置子网

在要配置负载平衡器转发规则的区域中创建子网。

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

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

  4. 子网部分中,将子网创建模式设置为自定义

  5. 新子网部分中,输入以下信息:

    1. 名称subnet-us
    2. 选择区域us-east1
    3. IP 地址范围10.1.2.0/24
    4. 点击完成
  6. 点击创建

gcloud

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

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. 使用 gcloud compute networks subnets create 命令us-east1 区域的 lb-network VPC 网络中创建子网。

    gcloud compute networks subnets create subnet-us \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-east1
    

配置代理专用子网

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

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

控制台

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

    进入 VPC 网络页面

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

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

  4. 请输入以下信息:

    1. 对于名称,输入 proxy-only-subnet-us
    2. 对于区域,输入 us-east1
    3. 对于用途,请选择 Regional Managed Proxy
    4. 对于 IP 地址范围,输入 10.129.0.0/23
  5. 点击添加

gcloud

  • 使用 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
    

配置防火墙规则

此示例使用入站防火墙规则 fw-allow-ssh,该规则允许通过端口 22 进行 SSH 访问客户端虚拟机。

控制台

  1. 在 Google Cloud 控制台中,前往防火墙政策页面。

    前往“防火墙政策”

  2. 点击创建防火墙规则,以创建允许在客户端虚拟机上进行传入 SSH 连接的规则:

  3. 创建防火墙规则页面中,输入以下信息:

    1. 名称fw-allow-ssh
    2. 网络lb-network
    3. 流量方向入站
    4. 匹配时执行的操作允许
    5. 目标指定的目标标记
    6. 目标标记allow-ssh
    7. 来源过滤条件IPv4 范围
    8. 来源 IPv4 范围0.0.0.0/0
    9. 协议和端口
      1. 选择指定的协议和端口
      2. 选中 TCP 复选框,然后输入 22 作为端口号。
  4. 点击创建

gcloud

  • 创建 fw-allow-ssh 防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。如果省略 --source-ranges,则Google Cloud 会将规则解读为表示任何来源

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    

配置 Cloud Storage 存储桶

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

  1. 创建存储桶。
  2. 将内容复制到存储桶。
  3. 将存储分区设为可公开读取。

创建 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

  • 使用 gcloud storage buckets create 命令us-east1 区域中创建存储分区。

    gcloud storage buckets create gs://BUCKET1_NAME \
        --default-storage-class=standard \
        --location=us-east1 \
        --uniform-bucket-level-access
    
    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 存储桶,以便能够测试设置。

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 地址

为负载平衡器的转发规则预留静态内部 IPv4 地址。如需了解详情,请参阅预留静态内部 IP 地址

控制台

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

    前往“预留内部静态 IP 地址”

  2. 名称字段中,输入新地址的名称。

  3. IP 版本列表中,选择 IPv4

  4. 网络列表中,选择 lb-network

  5. 子网列表中,选择 subnet-us

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

  7. 静态 IP 地址列表中,选择自动分配。创建负载平衡器后,此 IP 地址会关联到负载平衡器的转发规则。

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

gcloud

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

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

    ADDRESS_NAME 替换为新地址的名称。

  2. 如需查看有关地址的信息,请使用 gcloud compute addresses describe 命令

    gcloud compute addresses describe ADDRESS_NAME
    

    复制返回的 IP 地址,以便在下一部分中用作 RESERVED_IP_ADDRESS

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

本部分介绍了如何为regional internal Application Load Balancer创建以下资源:

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

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

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

    gcloud beta compute backend-buckets create backend-bucket-cats \
        --gcs-bucket-name=BUCKET1_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --region=us-east1
    
    gcloud beta compute backend-buckets create backend-bucket-dogs \
        --gcs-bucket-name=BUCKET2_NAME \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --region=us-east1
    
  2. 使用 gcloud beta compute url-maps create 命令创建网址映射,以将传入请求路由到后端存储桶。

    gcloud beta compute url-maps create lb-map \
        --default-backend-bucket=backend-bucket-cats \
        --region=us-east1
    
  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 lb-map \
        --path-matcher-name=path-matcher-pets \
        --new-hosts=* \
        --backend-bucket-path-rules="/love-to-fetch/*=backend-bucket-dogs" \
        --default-backend-bucket=backend-bucket-cats \
        --region=us-east1
    
  4. 使用 gcloud compute target-http-proxies create 命令创建目标代理。

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

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

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

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

    CERTIFICATE_NAME 替换为您使用 Certificate Manager 创建的 SSL 证书的名称。

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

    对于 HTTP 转发规则,预留 IP 地址是可选的;但对于 HTTPS 转发规则,您需要预留 IP 地址。

    在此示例中,临时 IP 地址与负载均衡器的 HTTP 转发规则关联。转发规则存在时,临时 IP 地址保持不变。如果您需要删除转发规则并重新创建,则转发规则可能会收到新的 IP 地址。

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

    gcloud compute forwarding-rules create http-fw-rule-1 \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=lb-network \
        --subnet=subnet-us \
        --subnet-region=us-east1 \
        --ports=80 \
        --target-http-proxy=http-proxy \
        --target-http-proxy-region=us-east1 \
        --region=us-east1
    

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

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

    RESERVED_IP_ADDRESS 替换为您在预留静态内部 IP 地址部分中复制的地址的名称。

向负载均衡器发送 HTTP 请求

从内部客户端虚拟机向负载均衡器的转发规则发送请求。

获取负载均衡器转发规则的 IP 地址

获取 us-east1 区域中负载平衡器的转发规则 (http-fw-rule-1) 的 IP 地址,以便使用 curl 向该区域中的虚拟 IP 地址 (VIP) 发出 HTTP 请求。

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

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

创建客户端虚拟机以测试连接性

创建客户端虚拟机,并向 VPC 网络中的 VIP 发送 HTTP 请求。客户端虚拟机可以位于负载平衡器所在的区域的任何可用区中,并且可以使用同一 VPC 网络中的任何子网。在此示例中,您将在与负载平衡器的转发规则相同的子网中创建客户端虚拟机。

  1. us-east1 区域中创建客户端虚拟机。

    gcloud compute instances create client-a \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --network=lb-network \
        --subnet=subnet-us \
        --zone=us-east1-c \
        --tags=allow-ssh
    
  2. 建立与客户端虚拟机的 SSH 连接。

    gcloud compute ssh client-a --zone=us-east1-c
    
  3. 在此示例中, regional internal Application Load Balancer 在 VPC 网络中的 us-east1 区域中具有前端 VIP。使用 curl 向相应区域中的 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
    

    FORWARDING_RULE_IP_ADDRESS 替换为您在获取负载平衡器转发规则的 IP 地址部分中复制的 IP 地址。

后续步骤