使用 Cloud Run、Cloud Functions 或 App Engine 设置 Cloud CDN

本页面介绍了如何创建外部 HTTP(S) 负载平衡器,以将请求路由到无服务器后端。在此处,“无服务器”这一术语指的是以下无服务器计算产品:

  • App Engine
  • Cloud Functions
  • Cloud Run

借助无服务器 NEG,您可以将 Google Cloud 无服务器应用与外部 HTTP(S) 负载平衡搭配使用。使用无服务器 NEG 后端配置负载平衡器后,对负载平衡器发出的请求会被路由到无服务器应用后端。

如需详细了解无服务器 NEG,请参阅无服务器 NEG 概览

准备工作

  1. 部署 App Engine、Cloud Functions 或 Cloud Run 服务
  2. 如果尚未安装,请安装 Cloud SDK
  3. 配置权限
  4. 添加 SSL 证书资源

部署 App Engine、Cloud Functions 或 Cloud Run 服务

本页面中的说明假定您已运行 Cloud Run、Cloud Functions 或 App Engine 服务。

对于本页面中的示例,我们已使用 Cloud Run Python 快速入门us-central1 区域中部署 Cloud Run 服务。本页面的其余部分介绍了如何设置外部 HTTP(S) 负载平衡器,以使其使用无服务器 NEG 后端将请求路由到此服务。

如果您尚未部署无服务器应用,或者如果您想试用示例无服务器 NEG 应用,请按照以下快速入门之一进行操作。您可以在任何地区中创建无服务器应用,但稍后必须使用相同地区创建无服务器 NEG 和负载平衡器。

Cloud Run

如需创建简单的 Hello World 应用,将其打包到一个容器映像中,然后将该容器映像部署到 Cloud Run,请参阅快速入门:构建和部署

如果您已将示例容器上传到 Container Registry,请参阅快速入门:部署预建的示例容器

Cloud Functions

请参阅《Cloud Functions:Python 快速入门》

App Engine

请参阅以下 App Engine Python 3 快速入门指南:

安装 Cloud SDK

安装 gcloud 命令行工具。如需了解该工具的概念信息和安装信息,请参阅 gcloud 概览

如果您之前未运行过 gcloud 工具,请先运行 gcloud init,以初始化您的 gcloud 目录。

配置权限

如需按照本指南中的说明进行操作,您需要创建无服务器 NEG 并在项目中创建外部 HTTP(S) 负载平衡器。您应该是项目的 Owner 或 Editor,或者应具有下列 Compute Engine IAM 角色

任务 所需的角色
创建负载平衡器和网络组件 Network Admin
创建和修改 NEG Compute Instance Admin
创建和修改 SSL 证书 Security Admin

预留外部 IP 地址

现在您的服务已启动并正在运行,接下来请设置一个全球静态外部 IP 地址,以供客户用来访问您的负载平衡器。

控制台

  1. 转到 Google Cloud Console 中的“外部 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

创建 SSL 证书资源

如需创建 HTTPS 负载平衡器,您必须向该负载平衡器的前端添加 SSL 证书资源。使用 Google 管理的 SSL 证书自行管理的 SSL 证书创建 SSL 证书资源。

  • Google 管理的证书。建议使用 Google 管理的证书,因为 Google Cloud 会自动获取、管理和续订这些证书。如需创建 Google 管理的证书,您必须拥有该网域的网域和 DNS 记录,才能预配证书。如果您还没有域名,则可以从 Google Domains 获取一个。此外,您还需要更新网域的 DNS A 记录,以指向上一步 (example-ip) 中创建的负载平衡器的 IP 地址。有关详细说明,请参阅使用 Google 管理的证书

  • 自签发证书。如果您暂时不想设置网域,则可以使用自签名 SSL 证书进行测试。

此示例假定您已创建 SSL 证书资源。

如果您想在不创建 SSL 证书资源(或 Google 管理的证书所需的网域)的情况下测试此过程,则仍然可以改用此页面中的说明来设置 HTTP 负载平衡器。

创建外部 HTTP(S) 负载平衡器

在下图中,负载平衡器使用无服务器 NEG 后端将请求定向到无服务器 Cloud Run 服务。对于本示例,我们按照 Cloud Run Python 快速入门中的说明来部署 Cloud Run 服务。

适用于 Cloud Run 应用的 HTTPS 负载平衡(点击可放大)
适用于 Cloud Run 应用的 HTTPS 负载平衡

由于使用无服务器 NEG 后端的后端服务不支持运行状况检查,因此如果负载平衡器只有无服务器 NEG 后端,则您无需创建允许运行状况检查的防火墙规则。

控制台

开始配置
  1. 在 Google Cloud Console 中,转到负载均衡页面。

    转到“负载均衡”

  2. HTTP(S) 负载平衡下,点击开始配置
  3. 选择从互联网到我的虚拟机,然后点击继续
  4. 高级流量管理下,选择传统 HTTP(S) 负载均衡器
  5. 点击继续
  6. 对于负载平衡器的名称,请输入 serverless-lb
  7. 不关闭窗口继续操作。

配置后端服务

  1. 点击后端配置
  2. 创建或选择后端服务下拉菜单中,将鼠标指针悬停在后端服务上,然后选择创建后端服务
  3. 输入名称
  4. 后端类型下,选择无服务器网络端点组
  5. 保持协议不变。此参数会被忽略。
  6. 后端下的新建后端窗口中,选择创建无服务器网络端点组
  7. 输入名称
  8. 点击创建
  9. 新建后端窗口下,点击完成
  10. 选择启用 Cloud CDN。保留默认的缓存模式TTL 设置。
  11. 点击创建

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

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

  1. 点击主机和路径规则
  2. 保留默认主机和路径。对于本示例,所有请求都会转到上一步中创建的后端服务。

配置前端

  1. 点击前端配置
  2. 输入名称
  3. 要创建 HTTPS 负载均衡器,您必须有一个 SSL 证书 (gcloud compute ssl-certificates list)。

    我们建议您使用 Google 管理的证书,如先前所述。

  4. 如需配置外部 HTTP(S) 负载均衡器,请按如下所示填写各个字段。

    验证以下选项配置了以下值:

    属性 值(按照说明输入值或选择选项)
    协议 HTTPS
    网络服务层 优质
    IP 版本 IPv4
    IP 地址 example-ip
    端口 443
    证书 选择现有的 SSL 证书或创建新证书。

    如需创建 HTTPS 负载均衡器,您必须具有要在 HTTPS 代理中使用的 SSL 证书资源。您可以使用 Google 管理的 SSL 证书或自行管理的 SSL 证书创建 SSL 证书资源。
    如需创建 Google 管理的证书,您必须拥有一个网域。该网域的 A 记录必须解析为负载均衡器的 IP 地址(在此示例中为 example-ip)。建议使用 Google 管理的证书,因为 Google Cloud 会自动获取、管理和续订这些证书。如果您没有网域,则可以使用自签名 SSL 证书进行测试。
    (可选)启用从 HTTP 到 HTTPS 的重定向 使用此复选框可启用从端口 80 到端口 443 的重定向。

    启用此复选框会创建一个额外的部分 HTTP 负载均衡器,它使用与 HTTPS 负载均衡器相同的 IP 地址,并将 HTTP 请求重定向到负载均衡器的 HTTPS 前端。

    只有在选择 HTTPS 协议并使用预留 IP 地址时,才能选中此复选框。

  5. 点击完成

检查配置

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

gcloud

  1. 为您的无服务器应用创建无服务器 NEG。

    如需使用 Cloud Run 服务创建无服务器 NEG,请运行以下命令:

             gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
                 --region=us-central1 \
                 --network-endpoint-type=serverless  \
                 --cloud-run-service=CLOUD_RUN_SERVICE_NAME
             

    如需使用 Cloud Functions 函数创建无服务器 NEG,请使用以下命令:

             gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
                --region=us-central1 \
                --network-endpoint-type=serverless  \
                --cloud-function-name=CLOUD_FUNCTION_NAME
             

    如需使用 App Engine 服务创建无服务器 NEG,请运行以下命令:

             gcloud compute network-endpoint-groups create SERVERLESS_NEG_NAME \
                 --region=us-central1 \
                 --network-endpoint-type=serverless  \
                 --app-engine-service=APP_ENGINE_SERVICE_NAME
             

  2. 如需了解更多选项,请查看 gcloud compute network-endpoint-groups creategcloud 参考指南。

  3. 创建后端服务。

             gcloud compute backend-services create BACKEND_SERVICE_NAME \
                 --load-balancing-scheme=LOAD_BALANCING_SCHEME \
                 --global \
                 --enable-cdn \
                 --cache-mode=CACHE_MODE \
                 --custom-response-header='Cache-Status: {cdn_cache_status}' \
                 --custom-response-header='Cache-ID: {cdn_cache_id}'
             

    CACHE_MODE 替换为以下项之一:

    • CACHE_All_STATIC(默认):自动缓存静态内容。标记为不可缓存的响应(Cache-Control 响应标头中的 privateno-storeno-cache 指令)不会被缓存。为了缓存动态内容,内容必须具有有效的缓存标头。这是所有已启用 Cloud CDN 的新后端的默认行为。
    • USE_ORIGIN_HEADERS:要求源站设置有效缓存标头以缓存内容。不带这些标头的响应不会在 Google 边缘缓存,且需要根据每个请求完成访问源站的完整行程,这可能会影响源服务器性能并增加其负载。这是所有已启用 Cloud CDN 的现有后端的默认行为。
    • FORCE_CACHE_ALL:缓存所有内容,并忽略 Cache-Control 响应标头中的任何 privateno-storeno-cache 指令。这可能导致缓存特定于每位用户的(可识别用户个人身份信息的)非公开内容。您应仅在不会提供非公开内容或动态内容的后端(比如 Cloud Storage 存储桶)中启用此项设置。

    如需了解 Cloud CDN 理解的缓存指令以及 Cloud CDN 未缓存的内容,请参阅可缓存的内容无法缓存的内容

  4. 将无服务器 NEG 作为后端添加到此后端服务:

             gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
                 --global \
                 --network-endpoint-group=SERVERLESS_NEG_NAME \
                 --network-endpoint-group-region=us-central1
             

  5. 创建网址映射以将传入的请求路由到此后端服务:

             gcloud compute url-maps create URL_MAP_NAME \
                 --default-service BACKEND_SERVICE_NAME
             

    此示例网址映射仅会定位到一项代表单个无服务器应用的后端服务,因此我们不需要设置主机规则或路径匹配器。如果您有多项后端服务,则可以使用主机规则根据主机名将请求定向到不同的服务,还可以设置路径匹配器以根据请求路径将请求定向到不同的服务。
  6. 如需创建 HTTPS 负载均衡器,您必须具有要在 HTTPS 目标代理中使用的 SSL 证书资源。您可以使用 Google 管理的 SSL 证书或自行管理的 SSL 证书创建 SSL 证书资源。建议使用 Google 管理的证书,因为 Google Cloud 会自动获取、管理和续订这些证书。

    如需创建 Google 管理的证书,您必须拥有一个网域。如果您没有网域,则可以使用自签名 SSL 证书进行测试。

    如需创建 Google 管理的 SSL 证书资源,请运行以下命令:

             gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
                 --domains DOMAIN
             
    如需创建自行管理的 SSL 证书资源,请运行以下命令:
             gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \
                 --certificate CRT_FILE_PATH \
                 --private-key KEY_FILE_PATH
             

  7. 创建目标 HTTPS 代理以将请求路由到您的网址映射:

    对于 HTTPS 负载均衡器,请创建 HTTPS 目标代理。该代理属于负载均衡,保存用于 HTTPS 负载均衡的 SSL 证书,因此您还需要在此步骤中加载证书。

            gcloud compute target-https-proxies create TARGET_HTTPS_PROXY_NAME \
                --ssl-certificates=SSL_CERTIFICATE_NAME \
                --url-map=URL_MAP_NAME
            

  8. 创建全球转发规则以将传入的请求路由到相应代理。

    对于 HTTPS 负载均衡器:

          gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \
              --load-balancing-scheme=EXTERNAL \
              --network-tier=PREMIUM \
              --address=example-ip \
              --target-https-proxy=TARGET_HTTPS_PROXY_NAME \
              --global \
              --ports=443
          

将您的网域连接到负载均衡器

创建负载均衡器后,请记好与负载均衡器关联的 IP 地址:例如 30.90.80.100。如需将您的网域指向负载均衡器,请使用您的网域注册服务创建 A 记录。如果您向 SSL 证书添加了多个网域,则必须为每个网域添加一条 A 记录,所有网域均指向负载均衡器的 IP 地址。例如,为 www.example.comexample.com 创建 A 记录:

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

如果您使用的是 Google Domains,请参阅 Google Domains 帮助页面了解详情。

测试负载均衡器

现在您已经配置了负载平衡器,接下来可以开始向负载平衡器的 IP 地址发送流量了。如果您配置了网域,则还可以将流量发送到该域名。不过,DNS 传播可能需要一些时间才能完成,因此您可以先使用 IP 地址进行测试。

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”
  2. 点击刚刚创建的负载均衡器。
  3. 记下负载平衡器的 IP 地址
  4. 对于 HTTPS 负载平衡器,您可以使用网络浏览器转到 https://IP_ADDRESS 来测试负载平衡器。将 IP_ADDRESS 替换为负载平衡器的 IP 地址。系统会将您定向到 helloworld 服务首页。

    如果此操作无效并且您使用的是 Google 管理的证书,请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态

    如果您使用自签名证书进行测试,您的浏览器将显示警告。您必须明确指示浏览器接受自签名证书。点击该警告即可查看实际页面。

  5. 如需验证缓存响应,请通过本地机器的命令行使用 curl。将 IP_ADDRESS 替换为负载平衡器的 IPv4 地址

    curl -v -o/dev/null https://IP_ADDRESS
    

    如果您使用的是 Google 管理的证书,请测试指向负载平衡器的 IP 地址的网域。例如:

    curl -v -o/dev/null -k -s 'https://DOMAIN:443' --connect-to DOMAIN:443:IP_ADDRESS:443
    

    如果您使用的是自签名证书,则还必须指定 -k 标志。如果您有自签名证书,则 curl -k 选项可让 curl 正常工作。您只能将 -k 参数用于测试您自己的网站。在正常情况下,有效证书是一项重要的安全措施,因此不应忽略证书警告。

    输出应包含您配置的自定义标头 Cache-IDCache-Status,以指示响应是否是从缓存传送的:

    HTTP/2 200
    cache-status: hit
    cache-id: SEA-b9fa975e
    

    输出包含指示存在缓存命中的响应标头,这意味着无服务器应用中的静态资源是从 Cloud CDN 边缘缓存传送给用户的。

    对于 Cloud CDN 中未缓存的响应,cache-status 标头会显示 disabled 值。对于缓存的响应,cache-status 标头值为 hitmissrevalidated

停用 Cloud CDN

控制台

不支持 Google Cloud Console。

为单个后端服务停用 Cloud CDN

  1. 在 Google Cloud Console 中,转到 Cloud CDN 页面。

    转到 Cloud CDN

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

为某个源站的所有后端服务移除 Cloud CDN

  1. 在 Cloud Console 中,转到 Cloud CDN 页面。

    转到 Cloud CDN

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

gcloud

gcloud beta compute backend-services update BACKEND_SERVICE_NAME \
    --no-enable-cdn
gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --no-enable-cdn

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

后续步骤