如何使用负载均衡器为不同的 GCP 应用程序设置自定义域

用简单的例子揭开神秘的负载均衡器的神秘面纱——默认情况下,我们只能通过虚拟机 (VM) 的 IP 访问我们在谷歌云平台 (GCP) 上的应用程序,或者通过带有谷歌签名的长 URL 来访问我们在谷歌云平台 (GCP) 上的应用程序,比如 Cloud Run、Cloud函数、App Engine 以及 Cloud Storage 对象。 …

如何使用负载均衡器为不同的 GCP 应用程序设置自定义域

用简单的例子揭开神秘的负载均衡器的神秘面纱

默认情况下,我们只能通过虚拟机 (VM) 的 IP 或带有 Google 签名的长 URL 访问我们在 Google Cloud Platform (GCP) 上的应用程序,以访问 Cloud Run、Cloud Function、App Engine 和 Cloud Storage 等无服务器应用程序对象。如果我们想使用自定义域访问它们,我们将需要使用负载均衡器。

Google Cloud Platform 上的 Cloud Load Balancer 实际上是一个相当复杂的概念,阅读官方文档时很容易迷失方向。简单地说,负载均衡器让您可以使用一个 IP 地址从世界各地访问您的应用程序。从技术上讲,它涉及根据流量扩大和缩小后端服务。[0][1]

在这篇文章中,我们将介绍最实际的案例,并使用负载均衡器为我们的后端应用程序添加自定义域。我们介绍如何使用自定义域访问虚拟机、Cloud Run 服务和 Cloud Storage 存储桶。

Preparations

在创建云负载均衡器之前,我们首先需要获取自定义域,预留静态 IP,添加 DNS 记录,并创建 SSL 证书。此外,我们还需要创建一个 VM 实例、一个 Cloud Run 服务和一个存储桶。

获取自定义域

您可以从任何域注册商处获取自定义域。有关流行域名注册商的比较,请查看此帖子。我的域 (superdataminer.com) 的注册商是 DOMAIN.COM。从技术上讲,您选择哪个域名注册商并不重要。重要的是价格,通常包括起始价格和续订价格。如果您需要一些特殊服务,也可能会产生一些额外费用。一个参考文献中的排名可能存在偏差。但是,如果不同的参考文献总是对同一个注册商排名靠前,那么它不会很糟糕。应该注意的是,一些寄存器的起价可能非常低甚至免费,但是当您想要更新它时,它可能会非常昂贵。因此,请检查不同的参考资料以进行排名和比较,并选择最适合您项目的参考资料。[0][1]

预留静态IP

为了使用 Google Cloud Load Balancer 为我们的应用程序添加自定义域,我们需要为其保留一个静态 IP。在 GCP 控制台上搜索“IP”并选择“IP 地址”。然后点击“RESERVE EXTERNAL STATIC ADDRESS”来保留一个静态地址。

为其命名并将类型设置为“全局”,因为 IP 旨在全局访问。所有其他选项都可以保留为默认值。

当我们点击“RESERVE”时,会为我们保留一个静态IP。记下这个静态 IP,因为它将用于为您的域添加 DNS 记录。

为静态 IP 添加 DNS 记录

我们需要为静态 IP 添加一些 DNS 记录,以便我们的域可以指向该 IP。登录您的域名注册商并添加以下 DNS 记录:

NAME                  TYPE     DATA
@ A <Your-Ststic-IP>
www CNAME superdataminer.com
api CNAME superdataminer.com

@名称表示根域,即本文中的superdataminer.com,www是对应www.superdataminer.com的子域,api子域类似。此外,A代表“地址”,指定目标域的IP地址,而CNAME代表“锥形名称”,实际上是指向创建的A记录的别名。[0][1]

对于 DOMAIN.COM,您可以在您购买的域名上单击“管理”,然后在左侧导航栏中找到“DNS 和域名服务器”选项卡。最后,单击“DNS RECORDS”选项卡,然后单击“Add DNS Record”以添加新的 DNS 记录:

为每个 DNS 记录填写如上所示的表格。特别是,IP 地址是上面创建的静态 IP。此外,我们需要为记录设置一个 TTL,它告诉 DNS 解析器将缓存该记录多长时间。对于此示例,TTL 设置为什么值并不重要。通常,较小的 TTL 意味着可以更快地传播 DNS 记录更改。如果您想了解有关 DNS TTL 的更多信息,网上有大量参考资料。例如,这个是一个很好的。最后,优先级字段可以留空。[0]

添加的 DNS 记录如下所示:

现在所有的 DNS 记录都已添加,我们需要等待一段时间让更改传播,这可能需要数小时甚至数天。但是,通常我们只需要等待几个小时甚至十几分钟就可以传播它们。如果您需要更长的时间,请不要担心,请多一点耐心,它们最终会起作用。

添加 DNS 记录后,您可以使用 ping 或 dig 命令检查它们是否已正确添加以及是否已传播:

$ ping superdataminer.com
$ ping www.superdataminer.com
$ ping api.superdataminer.com
64 bytes from 230.190.111.34.bc.googleusercontent.com (<Your-static-IP>)
$ dig superdataminer.com
;; ANSWER SECTION:
superdataminer.com. 3469 IN A <Your-static-IP>
$ dig www.superdataminer.com
;; ANSWER SECTION:
www.superdataminer.com. 3529 IN CNAME superdataminer.com.
superdataminer.com. 3453 IN A <Your-static-IP>
$ dig api.superdataminer.com
;; ANSWER SECTION:
api.superdataminer.com. 3522 IN CNAME superdataminer.com.
superdataminer.com. 3406 IN A <Your-static-IP>

如果IP地址是上面保留的静态IP,则说明DNS记录设置正确并已传播。

创建虚拟机

现在,让我们在 GCP 上创建一个虚拟机 (VM) 并在其中运行一个 Flask 应用程序。请在计算引擎页面上创建一个虚拟机实例,也可以在搜索框中进行搜索。

出于测试目的,我们将选择最低配置:

如果您想为生产创建一个 VM 实例,那么您应该选择适合您的应用程序的配置。

此外,重要的是,由于我们将从 GCP 外部访问 VM,因此我们需要允许 HTTP 和 HTTPS 流量:

点击“CREATE”后,VM 实例将被配置和创建。

在我们可以通过自定义端口 (5000) 访问 VM 实例之前,我们需要为其创建特定的防火墙规则。在 GCP Console 上搜索“防火墙”,然后选择“防火墙 VPC 网络”。单击“创建规则”以创建新的防火墙规则。首先,我们需要给它一个唯一的名字:

然后我们需要指定目标、IP 范围和端口:

我们也可以使用默认端口,即 80 用于 HTTP,443 用于 HTTPS。但是,这里我们演示了如何为我们的应用程序指定自定义端口,这在默认端口不适用的许多情况下会很有帮助。

现在我们需要将新防火墙规则的标签(上面指定的烧瓶标签)添加到我们的 VM 实例中。单击虚拟机实例上的“编辑”并为其添加网络标签:

单击“保存”以保存更改。现在,让我们通过单击实例右侧的 SSH 链接登录到 VM 实例,如上所示:

由于 git 不可用,我们先安装它:

$ sudo apt update
$ sudo apt install git

在 CPU/内存配置较低的 VM 中安装软件/库可能会很慢,因此在安装 git 和 pip/venv(如下)时请耐心等待。

然后为 Flask 克隆这个示例项目并安装 requirements.txt 中指定的库。[0]

$ git clone https://github.com/lynnkwong/flask-cloud-run-app.git
$ cd flask-cloud-run-app
$ sudo apt install python3-pip
$ sudo apt install python3-venv
$ python3 -m venv .venv
$ source .venv/bin/activate
(.venv) $ pip install -r requirements.txt

请注意,虚拟环境是使用 Python 的 venv 库创建的。这些库安装在虚拟环境中,而不是直接安装在系统中,推荐用于生产使用。

最后,让我们启动应用程序。请注意,我们需要为其设置一个环境变量,以便我们可以判断响应来自 VM 实例,而不是来自 Cloud Run,正如我们将很快展示的那样。

(.venv) $ export APP_NAME="App in VM instance"
(.venv) $ gunicorn -w 4 -b 0.0.0.0:5000 app:app &

我们使用 gunicorn 在 VM 实例中启动 Flask 应用程序。请注意命令末尾的与号 (&),即使我们退出控制台,它也会使应用程序保持运行。[0]

现在,当您尝试使用其外部 IP 从任何地方访问 Flask 应用程序时,您可以获得响应:

$ curl <Your-VM-external-IP>:5000
<h1>Hello from App in VM instance!<h1>

创建实例组

我们需要为 VM 实例创建一个“实例组”,以便它可以用于创建负载均衡中的后端服务。在 GCP Console 中搜索“instance group”,选择“Instance groups”,然后点击“CREATE INSTANCE GROUP”。我们需要选择“New unmanaged instance group”进行负载均衡。然后在我们设置网络和实例之前指定名称、区域和区域。

对于“网络和实例”部分,选择默认网络和子网,然后选择要包含在此实例组中的虚拟机。我们可以在一个实例组中选择多个虚拟机,流量将由负载均衡器进行均衡。对于本教程,我们只有一个 VM 实例。

重要的是,对于“端口映射”部分,我们需要创建一个映射,因为我们在 VM 中运行的 Flask 应用程序使用端口 5000。因此,我们需要为其创建一个映射:

当我们为实例组创建后端服务时,将使用此端口映射。

创建 Cloud Run 服务

在 GCP Console 中找到“Cloud Run”选项卡,然后单击“CREATE SERVICE”创建服务。您可以从现有容器映像或源存储库部署服务的一个修订版本。我们将选择后者,因为我们不需要提前创建自定义图像。

如果您想继续,请在单击“SET UP WITH CLOUD BUILD”后分叉此存储库并设置您的 Cloud Build 以链接到此存储库:[0]

如果您在此 repo 中设置存储库,则无需更改任何内容。默认设置将起作用。单击“保存”后,将为源代码创建一个 Cloud Build Trigger。将来,每当您将一些新代码推送到 repo 时,都会构建一个新映像并部署一个新服务(技术上是服务的新修订版)。

此外,出于测试目的,我们将为我们的服务“允许所有流量”和“允许未经身份验证的调用”。如果您的应用程序具有高安全性要求,您可能需要选择不同的。

最后,由于我们的 Flask 应用程序需要一个环境变量,让我们为它创建一个。展开“容器、变量和机密、连接、安全”部分,然后单击“变量和机密”选项卡。添加一个名为“APP_NAME”的新环境变量:

现在,一切准备就绪,您可以保留其他选项的默认值。单击“单击”以创建服务。一段时间后,您的服务将可用,您可以通过 Cloud Run 自动分配的 URL 访问您的 Flask 应用程序:

如果您的部署出现任何问题,请检查“日志”选项卡中的日志。通常你会在那里找到原因。

要了解有关如何为 Flask 应用程序创建 Cloud Run 服务的更多信息,请查看这篇文章。[0]

创建一个bucket并上传一些图片

首先,转到 Google Cloud Storage,然后创建一个存储桶来存储您的图像。通常您只需要指定存储桶名称并选择一个区域,并且可以将所有其他选项保留为默认值:

然后,您可以像使用 Google Drive 一样创建文件夹并将文件上传到存储桶。这篇文章中使用的图片是从Pixabay下载的免费图片。[0]

默认情况下,bucket 中的图片只有经过身份验证的用户才能访问,外部无法访问。如果我们想让图像公开并可供任何人从任何地方访问,我们需要更改存储桶的权限。要添加权限主体,请单击“PERMISSIONS”,然后单击“ADD”。要公开存储桶,我们需要为“allUsers”添加“存储对象查看者”角色。谷歌会警告您此操作,但如果您知道自己在做什么,则可以安全地确认它。

现在,任何人都可以从任何地方访问这些图像:

创建 SSL 证书资源

由于我们正在创建一个 HTTPS 负载均衡器,因此我们需要为其创建一个 SSL 证书资源。建议将 Google 管理的证书用于生产目的,这也比自签名证书更容易设置。[0]

Google 管理的证书的入口点有点隐藏。如果您在 Google Cloud Console 的搜索框中搜索“SSL 证书”,则找到的是自签名证书,而不是我们正在寻找的 Google 管理的证书。要找到合适的,首先需要进入负载均衡页面,点击“高级菜单”找到它。

在“高级菜单”打开的“负载均衡组件”页面中,点击“证书”选项卡,然后点击“CREATE SLL CERTIFICATE”按钮,创建一个新的谷歌管理的证书:

填写表格如下:

Importantly:

  • 给它一个描述性的名称,因为它将在稍后创建负载均衡器时使用。
  • 在“创建模式”中,选择“创建 Google 管理的证书”。
  • 在“域名”部分,输入您从域名注册商处购买的域名。我们应该添加根域(superdataminer.com)和所有子域(在这个例子中只有 api.superdataminer.com)。

然后点击“CREATE”创建证书:

SSL 证书的状态将在“Provisioning”停留一段时间,然后变为“Active”,稍后我们将在创建负载均衡器时进行更详细的演示。

创建 Google Cloud 负载均衡器

最后,一切准备就绪,我们可以开始创建一个谷歌云负载均衡器来为我们的应用程序设置一个自定义域。在 GCP Console 的搜索框中搜索“负载”,然后选择“负载均衡”。在打开的窗口中,单击“CREATE LOAD BALANCER”:

然后点击“HTTP(S) Load Balancing”上的“START CONFIGURATION”,也就是我们要创建的那个:

保留默认选项如下,这是我们想要的:

单击“CONTINUE”后,我们需要为负载均衡器指定一个名称,然后设置后端、主机和路径规则以及前端的配置:

首先点击“后端配置”。由于我们还没有任何后端服务,我们需要先创建它们。我们将分别为实例组、无服务器 Cloud Run 服务和 Cloud Storage 存储桶创建后端服务。

为实例组创建后端服务

在“后端配置”部分,单击“后端服务和后端存储桶”,然后选择“创建后端服务”。

在“创建后端服务”窗口中,指定后端服务的名称并选择“实例组”作为后端类型。然后将协议更改为“HTTP”并将命名端口设置为“flask”,这是我们在上面为实例组创建的端口。该协议可以是 HTTP 而不必是 HTTPS,因为流量从负载均衡器转发到 GCP 系统内的实例组。

然后在“后端”部分,选择我们创建的实例组。端口号将被自动检测并选择:

重要的是,我们需要为实例组创建健康检查策略,否则实例组的后端服务将无法正常工作:

在“健康检查”的新窗口中,指定名称、协议和端口。除非您想根据您的特定要求微调性能,否则其他选项可以保留为默认值。

请注意,该协议可以是“TCP”,因为健康检查是在 GCP 系统内部由内部 IP 完成的。

创建健康检查策略后,我们可以点击“CREATE”为实例组创建这个后端服务。

为 Cloud Run 创建后端服务

为 Cloud Run 创建后端服务的过程实际上与为实例组创建后端服务的过程大不相同,尽管两者属于同一类型。要为 Cloud Run 创建后端服务,我们还需要从“后端配置”开始:

在打开的“创建后端服务”窗口中,指定后端服务的名称,并选择“无服务器网络端点组”作为后端类型。

然后,我们需要为我们的 Cloud Run 服务创建一个无服务器网络端点组 (NEG):

单击“CREATE SERVERLESS NETWORK ENDPOINT GROUP”为我们的无服务器 Cloud Run 服务创建后端:

有时 GCP UI 中可能存在错误,当您尝试创建网络端点组时无法选择 Cloud Run 服务。这发生在创建本教程时。在这种情况下,您可以使用 gcloud 命令创建一个:

gcloud compute network-endpoint-groups create <neg-name> \
--region=<region> \
--network-endpoint-type=serverless \
--cloud-run-service=<serviceName>

对于本教程,命令将是:

gcloud compute network-endpoint-groups create neg-superdataminer \
--region=europe-west1 \
--network-endpoint-type=serverless \
--cloud-run-service=superdataminer-cloud-run

命令成功完成后,您将看到:

Created network endpoint group [neg-superdataminer].

如果您遇到此权限错误:

ERROR: (gcloud.compute.network-endpoint-groups.create) Could not fetch resource:
- Required 'compute.regionNetworkEndpointGroups.create' permission for

您可以运行以下命令来验证您的 Google Cloud SDK:

$ gcloud auth login
$ gcloud config set project <Your-Project-ID>
$ gcloud auth application-default login

从 UI 或通过 gcloud 命令创建无服务器网络端点组时,您可以选择并使用它来创建后端服务:

现在单击“CREATE”为我们的 Cloud Run 服务创建后端服务。

为 Cloud Storage 创建后端服务

最后,让我们继续为您的 Cloud Storage 存储桶创建一个后端存储桶:

在打开的“创建后端存储桶”窗口中,输入后端存储桶的名称并选择您要访问的 Cloud Storage 存储桶。此外,建议启用 Cloud CDN 以更快地交付内容并节省成本,尤其是对于静态内容:

这个过程要简单得多,通常你不会遇到任何问题。现在,我们的负载均衡器的所有后端配置都已完成:

指定主机和路径规则

配置后端后,我们需要指定主机和路径规则,这些规则决定了您的流量将如何被引导。正如我们在上面配置的那样,流量可以被定向到后端服务或存储桶。

指定了三个主机和路径规则:

  • 第一个是默认的,其路径和路径不能更改。所有不匹配的主机和路径都将发送到分配给此规则的后端,即我们的 Cloud Run 服务。
  • 第二个是图像的规则。它指定图像将被定向到“superdataminer.com/images/*”。此规则的后端是上面创建的 Bucket 后端。
  • 第三个是针对以实例组为后端的 API 子域。

Frontend configuration

最后,让我们设置前端配置。点击左侧的“前端配置”,配置如下:

重要的是,我们需要:

  • 指定前端的名称。
  • 将协议更改为“HTTP/2”。
  • 将 IP 设置为之前保留的静态 IP。
  • 选择之前创建的 SSL 证书。

请注意,“启用 HTTP 到 HTTPS 重定向”选项可能无法正常工作。在这种情况下,如果需要,您需要创建一个单独的 HTTP 前端。

现在一切都准备好了。如果一切正常,我们可以查看并完成配置,然后单击“CREATE 🔥”创建负载均衡器。

检查您的 SSL 证书的状态

正如我们之前提到的,在满足以下两个条件之前,您的 SSL 证书的状态将保持在“PROVISIONING”甚至“FAILED_NOT_VISIBLE”:[0][1]

  • DNS 记录已正确添加,并已为您的静态 IP 传播,如上所示。
  • SSL 证书已附加到负载均衡器的前端,如上所示。

如果满足上述两个条件,状态将变为“ACTIVE”,这意味着一切正常:

测试负载均衡器

Test instance group

$ curl https://api.superdataminer.com
<h1>Hello from App in VM instance!<h1>

Test Cloud Run

当您访问 https://superdataminer.com 时,您将看到来自 Cloud Run 的问候:[0]

测试云存储桶

当您访问 https://superdataminer.com/images/cloud-compute.jpg 时,您可以看到在 Google Cloud Storage 存储桶中提供的图像:[0]

干杯!所有 GCP 应用程序的自定义域都按预期工作。

在这篇长文中,我们详细讨论了如何创建负载均衡器并为您的后端服务和 Cloud Storage 存储分区分配自定义域。现在您应该对什么是负载均衡器以及如何使用它来为您在 GCP 中的应用程序提供服务有了更好的理解。

乍一看,负载平衡可能会让人不知所措。但是,如果您仔细遵循这些步骤并尝试了解每个步骤的底层逻辑,它实际上并没有那么复杂。如果您在为本文中演示的示例设置负载均衡器时遇到任何问题,欢迎您给我留言或私信,我会尽力帮助您。

另外,请注意,域 superdataminer.com 仅用于本文中的演示,当您阅读本文时,它可能用于其他用途。因此,如果您想跟随,您需要拥有自己的域。[0]

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2022年5月11日
下一篇 2022年5月11日