设置后端存储桶

Cloud CDN 利用您选择的全球外部应用负载均衡器或传统版应用负载均衡器来提供路由、健康检查和任播 IP 支持。由于全球外部应用负载均衡器可以有多种后端实例类型(Compute Engine 虚拟机实例、Google Kubernetes Engine pod、Cloud Storage 存储桶或 Google Cloud 之外的外部后端),因此您可以选择为哪些后端(源站)启用 Cloud CDN。

本设置指南介绍如何创建一个启用了 Cloud CDN 的外部应用负载均衡器。该示例使用以下资源:

  • 默认 Virtual Private Cloud (VPC) 网络
  • 默认网址映射
  • 预留的外部 IP 地址
  • 作为后端的 Cloud Storage 存储分区
  • 一个负载平衡器后端存储分区,用作 Cloud Storage 存储分区的封装容器

后端存储分区支持以下功能:

  • 任何存储类别的 Cloud Storage 存储桶(包括多区域存储桶)
  • 用来在 Google 全球边缘缓存内容的 Cloud CDN 政策

如需了解 Cloud CDN 的工作原理,请参阅 Cloud CDN 概览

默认情况下,Cloud Storage 使用 Cloud CDN 使用的同一缓存。如果您在后端存储桶上启用 Cloud CDN,则可以对内容使用 Cloud CDN 控件。Cloud CDN 控件包括缓存模式、签名网址和失效操作等。Cloud CDN 还允许您缓存大型内容(大于 10 MB)。如果您未在后端存储桶上启用 Cloud CDN,则只能使用源 Cache-Control 标头来控制由 Cloud Storage 元数据设置的较小内容的缓存。

负载均衡器后端

外部应用负载均衡器使用网址映射将来自指定网址的流量定向到指定服务。下表汇总了您可以在其中托管内容和服务的后端类型。

负载平衡器后端配置 典型媒体类型 后端类型
后端服务 动态(如数据)
  • 非代管实例组
  • 代管实例组
  • Google Cloud 内部的网络端点组
  • Google Cloud 外部的网络端点组
后端存储分区 静态(如映像)
  • Cloud Storage 存储分区(在本页中讨论)

准备工作

控制台

  1. 在 Google Cloud 控制台中,转到首页

    转到 Google Cloud 首页

  2. 在 Google Cloud 的右侧,从下拉菜单中选择一个项目。

gcloud

     gcloud config set project PROJECT_ID
   

PROJECT_ID 替换为您的 Google Cloud 项目 ID。

Terraform

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
   

创建 Cloud Storage 存储桶

如果您已有尚未分配给负载平衡器的 Cloud Storage 存储分区,则可以跳至下一步

创建 Cloud Storage 存储桶以用作已启用 Cloud CDN 的外部应用负载均衡器的后端时,我们建议您选择一个多区域存储桶,它会自动跨多个 Google Cloud 区域复制对象。这可以提高内容的可用性,并提高应用的故障容忍度。

控制台

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

    打开“存储桶”页面

  2. 点击创建存储桶
  3. 为下表中的字段指定值,其他所有字段保留默认值:

    属性 值(输入值或选择指定的选项)
    名称 为每个存储分区输入一个全局唯一的名称。如果您输入的名称不是唯一的,则会看到一条消息,提示您尝试使用其他名称
    位置类型 多地区
    位置 选择一个区域,例如 us(美国的多个区域)
    默认存储类别 标准版
    访问权限控制 统一
  4. 点击创建

  5. 记下新创建的 Cloud Storage 存储桶的名称,以执行下一步。

gcloud

gcloud storage buckets create gs://BUCKET_NAME --project=PROJECT_ID --default-storage-class=standard --location=us-east1 --uniform-bucket-level-access

Terraform

如需创建存储桶,请使用 google_storage_bucket 资源

# Cloud Storage bucket
resource "random_id" "bucket_prefix" {
  byte_length = 8
}

resource "google_storage_bucket" "default" {
  name                        = "${random_id.bucket_prefix.hex}-my-bucket"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
  // Assign specialty files
  website {
    main_page_suffix = "index.html"
    not_found_page   = "404.html"
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

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

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

gcloud

在 Cloud Shell 中运行以下命令。将 BUCKET_NAME 替换为您的 Cloud Storage 存储分区的唯一名称:

gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_NAME/never-fetch/

Terraform

如需复制对象,请使用 local-exec Provisionergcloud storage cp 命令。

resource "null_resource" "upload_image" {
  provisioner "local-exec" {
    command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://${google_storage_bucket.default.name}/never-fetch/ --recursive"
  }
}

或者,如需上传对象,请使用 google_storage_bucket_object 资源

# image object for testing, try to access http://<your_lb_ip_address>/test.jpg
resource "google_storage_bucket_object" "test_image" {
  name = "test-object"
  # Uncomment and add valid path to an object.
  #  source       = "/path/to/an/object"
  #  content_type = "image/jpeg"

  # Delete after uncommenting above source and content_type attributes
  content      = "Data as string to be uploaded"
  content_type = "text/plain"

  bucket = google_storage_bucket.default.name
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

在 Google Cloud 控制台中,点击刷新,以验证图形文件是否已复制。

将 Cloud Storage 存储桶设为公开

此示例使您的 Cloud Storage 存储分区可供公开读取。这是公开内容的推荐方法。如此设置时,互联网上的任何人都可以查看和列出您的对象及其元数据(不包括 ACL)。为了降低意外数据泄露的风险,您通常应为公开对象专门创建 Cloud Storage 存储分区。

以下是将整个 Cloud Storage 存储桶设为公开的其他方法:

以下过程授予所有用户查看 Cloud Storage 存储分区中的对象的权限,使该存储分区可公开读取。

控制台

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

    打开“存储桶”页面

  2. 导航到该存储分区,然后点击权限标签页。
  3. 点击添加主账号
  4. 新主账号中,输入 allUsers
  5. 对于角色,请选择 Cloud Storage > Storage Object Viewer
  6. 点击保存

gcloud

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

Terraform

如需将您的 Cloud Storage 存储桶设为公开,请使用 google_storage_bucket_iam_member 资源

# make bucket public
resource "google_storage_bucket_iam_member" "default" {
  bucket = google_storage_bucket.default.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

保留外部 IP 地址

现在您的 Cloud Storage 存储分区已启动并运行,接下来请设置全局静态外部 IP 地址,您的客户将使用此地址访问负载平衡器。

此步骤是可选的,但建议执行,因为静态外部 IP 地址会提供单个地址以指向您的网域。

控制台

  1. 在 Google Cloud 控制台中,转到外部 IP 地址页面。

    转到“外部 IP 地址”页面

  2. 如需预留 IPv4 地址,请点击预留静态地址
  3. 指定名称 example-ip
  4. 网络服务层级设置为优质
  5. IP 版本设置为 IPv4
  6. 类型设置为全局
  7. 点击预留

gcloud

gcloud compute addresses create example-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

请记下预留的 IPv4 地址:

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

Terraform

如需预留 IP 地址,请使用 google_compute_global_address 资源

# reserve IP address
resource "google_compute_global_address" "default" {
  name = "example-ip"
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

创建外部应用负载均衡器

在此过程中,您将创建负载平衡器的后端存储分区,充当 Cloud Storage 存储分区的封装容器。创建或修改后端存储分区时,您可以启用 Cloud CDN。

控制台

开始外部应用负载均衡器配置过程

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载平衡”页面

  2. HTTP(S) 负载平衡下,点击开始配置
  3. 选择从互联网到我的虚拟机,然后点击继续
  4. 高级流量管理下,选择以下任一选项:
    • 对于传统版应用负载均衡器,请选择传统版 HTTP(S) 负载均衡器
    • 对于全球外部应用负载均衡器,请选择具有高级流量管理的 HTTP(S) 负载均衡器
  5. 名称设置为 http-lb,然后转到下一步。

配置后端并启用 Cloud CDN

创建负载平衡器的后端存储分区,将其用作 Cloud Storage 存储分区的封装容器。创建或修改后端存储分区时,您可以启用 Cloud CDN。

  1. 点击后端配置
  2. 后端服务和后端存储分区下,点击创建或选择后端服务和后端存储分区,然后点击后端存储分区 > 创建后端存储分区
  3. 名称设置为 cat-backend-bucket。此名称不必全局唯一,并且可以与实际 Cloud Storage 存储分区的名称不同。
  4. Cloud Storage 存储分区下,点击浏览
  5. 选择您创建的 Cloud Storage 全局唯一 BUCKET_NAME,然后点击选择
  6. 点击启用 Cloud CDN

  7. (可选)修改缓存模式TTL 设置。

  8. 点击创建

配置主机规则和路径匹配器

主机规则和路径匹配器是外部应用负载均衡器网址映射的配置组件。

主机和路径规则中,您可以保留默认设置。

如需查看自定义设置示例,请参阅将后端存储分区添加到负载平衡器

如需详细了解主机规则和路径匹配器,请参阅网址映射概览

配置前端

  1. 点击前端配置
  2. 验证这些选项是否配置了以下值。

    属性 值(按照说明输入值或选择选项)
    协议 HTTP
    网络服务层级 优质
    IP 版本 IPv4
    IP 地址 example-ip
    端口 80

    如果您希望创建 HTTPS 负载平衡器而不是 HTTP 负载平衡器,则必须拥有 SSL 证书 (gcloud compute ssl-certificates list),并且必须按如下所示填写相关字段。

    属性 值(按照说明输入值或选择选项)
    协议 HTTPS
    网络服务层级 优质
    IP 版本 IPv4
    IP 地址 example-ip
    端口 443
    证书 选择证书创建新证书
  3. 点击完成

检查配置

  1. 点击检查并最终确定
  2. 检查后端存储分区主机和路径规则前端部分。
  3. 点击创建
  4. 等待负载平衡器完成创建。
  5. 点击负载平衡器的名称 (http-lb)。
  6. 请记下负载均衡器的 IP 地址,以便在下一个任务中使用。它被称为 IP_ADDRESS

gcloud

配置后端

gcloud compute backend-buckets create cat-backend-bucket \
    --gcs-bucket-name=BUCKET_NAME \
    --enable-cdn \
    --cache-mode=CACHE_MODE

通过将 CACHE_MODE 替换为以下项之一来设置缓存模式

  • CACHE_ALL_STATICUSE_ORIGIN_HEADERS:使用根据 Cloud Storage 中的缓存控制元数据设置的标头。Cloud Storage 始终向 Cloud CDN 提供 Cache-Control 标头。如果未明确选择值,它会发送默认值。

  • FORCE_CACHE_ALL:缓存所有内容,并忽略 Cloud Storage 发送的 Cache-Control 响应标头中的任何 privateno-storeno-cache 指令。

配置网址映射

gcloud compute url-maps create http-lb \
    --default-backend-bucket=cat-backend-bucket

配置目标代理

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

配置转发规则

  • 对于全球外部应用负载均衡器,请将 gcloud CLI 命令与 load-balancing-scheme=EXTERNAL_MANAGED 结合使用。此设置提供了高级流量管理功能
  • 对于经典版应用负载均衡器,请使用 load-balancing-scheme=EXTERNAL
gcloud compute forwarding-rules create http-lb-forwarding-rule \
    --load-balancing-scheme=LOAD_BALANCING_SCHEME \
    --network-tier=PREMIUM \
    --address=example-ip \
    --global \
    --target-http-proxy=http-lb-proxy \
    --ports=80

Terraform

配置后端

如需配置后端,请使用 google_compute_backend_bucket 资源

# backend bucket with CDN policy with default ttl settings
resource "google_compute_backend_bucket" "default" {
  name        = "cat-backend-bucket"
  description = "Contains beautiful images"
  bucket_name = google_storage_bucket.default.name
  enable_cdn  = true
  cdn_policy {
    cache_mode        = "CACHE_ALL_STATIC"
    client_ttl        = 3600
    default_ttl       = 3600
    max_ttl           = 86400
    negative_caching  = true
    serve_while_stale = 86400
  }
}

配置网址映射

如需配置后端,请使用 google_compute_url_map 资源

# url map
resource "google_compute_url_map" "default" {
  name            = "http-lb"
  default_service = google_compute_backend_bucket.default.id
}

配置目标代理

如需配置目标代理,请使用 google_compute_target_http_proxy 资源google_compute_target_https_proxy 资源

# http proxy
resource "google_compute_target_http_proxy" "default" {
  name    = "http-lb-proxy"
  url_map = google_compute_url_map.default.id
}

配置转发规则

如需配置转发规则,请使用 google_compute_global_forwarding_rule 资源

# forwarding rule
resource "google_compute_global_forwarding_rule" "default" {
  name                  = "http-lb-forwarding-rule"
  ip_protocol           = "TCP"
  load_balancing_scheme = "EXTERNAL"
  port_range            = "80"
  target                = google_compute_target_http_proxy.default.id
  ip_address            = google_compute_global_address.default.id
}
  • 对于全球外部应用负载均衡器,请使用 load_balancing_scheme="EXTERNAL_MANAGED"。 此设置提供了高级流量管理功能
  • 对于经典版应用负载均衡器,请使用 load_balancing_scheme="EXTERNAL"

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

将流量发送到您的后端存储桶

创建全局转发规则后,您的配置可能需要几分钟时间才能传播到全球范围。几分钟后,您就可以开始将流量发送到负载平衡器的 IP 地址。

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载平衡”页面

  2. 点击 http-lb,展开您刚创建的负载平衡器。

    后端部分中,确认后端存储分区运行状况良好。您的后端存储分区旁边应该有一个绿色选中标记。否则,请先尝试重新加载页面。Google Cloud 控制台可能需要一段时间才能指示后端运行状况良好。

  3. 在 Google Cloud 控制台显示后端存储桶运行状况良好后,您可以使用网络浏览器转到 http://IP_ADDRESS/never-fetch/three-cats.jpg 来测试您的负载均衡器。将 IP_ADDRESS 替换为负载平衡器的 IP 地址。您的浏览器应该会打开一个页面,其中包含呈现图形文件的内容。

gcloud

使用 curl 命令测试网址的响应。将 IP_ADDRESS 替换为负载平衡器的 IPv4 地址

请记下预留的 IPv4 地址:

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

发送 curl 请求:

curl http://IP_ADDRESS/never-fetch/three-cats.jpg

验证 Cloud CDN 是否正常运行

如果您连续多次重新加载 http://IP_ADDRESS/never-fetch/three-cats.jpg 页面,则应该有多次缓存命中。

以下日志条目显示了缓存命中。您可以通过在 Google Cloud 控制台中打开日志浏览器并按转发规则名称进行过滤来查看缓存命中。

打开日志浏览器

日志浏览器

{
    insertId: "1oek5rg3l3fxj7"
    jsonPayload: {
        @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
        cacheId: "SFO-fbae48ad"
        statusDetails: "response_from_cache"
    }
    httpRequest: {
        requestMethod: "GET"
        requestUrl: "http://LOAD_BALANCER_IP_ADDRESS/never-fetch/three-cats.jpg"
        requestSize: "577"
        status: 254
        responseSize: "157"
        userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
        remoteIp: "CLIENT_IP_ADDRESS"
        cacheHit: true
        cacheLookup: true
    }
    resource: {
        type: "http_load_balancer"
        labels: {
            zone: "global"
            url_map_name: "URL_MAP_NAME"
            forwarding_rule_name: "FORWARDING_RULE_NAME"
            target_proxy_name: "TARGET_PROXY_NAME"
            backend_service_name: ""
            project_id: "PROJECT_ID"
        }
    }
    timestamp: "2020-06-08T23:41:25.078651Z"
    severity: "INFO"
    logName: "projects/PROJECT_ID/logs/requests"
    trace: "projects/PROJECT_ID/traces/241d69833e64b3bf83fabac8c873d992"
    receiveTimestamp: "2020-06-08T23:41:25.588272510Z"
    spanId: "7b6537d3672e08e1"
}

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载平衡”页面

  2. 点击 http-lb,展开您刚创建的负载平衡器。

    后端部分中,确认后端存储分区运行状况良好。您的后端存储分区旁边应该有一个绿色选中标记。否则,请先尝试重新加载页面。Google Cloud 控制台可能需要一段时间才能指示后端运行状况良好。

  3. 在 Google Cloud 控制台显示后端存储桶运行状况良好后,您可以使用网络浏览器转到 http://IP_ADDRESS/never-fetch/three-cats.jpg 来测试您的负载均衡器。将 IP_ADDRESS 替换为负载平衡器的 IP 地址。您的浏览器应该会打开一个页面,其中包含呈现图形文件的内容。

gcloud

使用 curl 命令测试网址的响应。将 IP_ADDRESS 替换为负载平衡器的 IPv4 地址

请记下预留的 IPv4 地址:

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

发送 curl 请求:

curl -D- -o /dev/null /dev/null http://IP_ADDRESS/never-fetch/three-cats.jpg

从 Cloud Storage 中获取内容,并由 Cloud CDN 缓存,然后在内容过期或从缓存中逐出时对其进行验证并重新获取。

来自缓存的内容的 Age 标头大于零。

需要在 TTL 之前刷新的内容可以失效,并可从 Cloud Storage 中重新抓取。

停用 Cloud CDN

控制台

为单个后端存储分区停用 Cloud CDN

  1. 在 Google Cloud 控制台中,转到 Cloud CDN 页面。

    转到 Cloud CDN 页面

  2. 在源站所在行的右侧,点击菜单 ,然后选择修改
  3. 取消选中您想要停止使用 Cloud CDN 的所有后端存储分区的复选框。
  4. 点击更新

为某个源站的所有后端存储分区移除 Cloud CDN

  1. 在 Google Cloud 控制台中,转到 Cloud CDN 页面。

    转到 Cloud CDN 页面

  2. 在源站所在行的右侧,点击菜单 ,然后选择移除
  3. 点击移除进行确认。

gcloud

gcloud compute backend-buckets update BACKEND_BUCKET_NAME \
    --no-enable-cdn

停用 Cloud CDN 后,系统不会使缓存失效或完全清除缓存。如果您关闭 Cloud CDN,然后重新开启 Cloud CDN,则大部分或所有缓存的内容仍可能会被缓存。为了防止缓存使用内容,您必须使该内容失效

后续步骤

  • 如需了解缓存的内容,请参阅缓存概览
  • 如需在 GKE 中使用 Cloud CDN,请参阅 Ingress 功能
  • 如需检查 Cloud CDN 是否正在从缓存传送响应,请参阅查看日志
  • 如需了解常见问题及解决方案,请参阅问题排查
  • 如需为您的内容配置过滤和访问权限控制政策,请参阅边缘安全政策