如何以最低的成本将简单的应用程序部署到 GCP(或如何在部署后禁用自动缩放)?

How to deploy a simple app to GCP with minimal costs (or how to disable autoscaling after deploy)?

我第一次尝试使用 Cloud 部署应用程序...

问题: GCP(Google 云平台)意外的实例小时使用率(前端实例小时数)。 高流量不是问题,但出于某种原因,创建了一堆“实例”和“版本” 通过他们的自动缩放功能。

他们建议的解决方案: 禁用自动缩放并停止服务之前部署的实例版本。 我仍然需要一个 version/instance 运行ning 但通过他们的控制台我仍然没有找到 它显示了我有多少 versions/instances 运行ning 或在哪里停止它们 (同时验证至少有 1 个实例仍在工作,以免破坏我的应用程序)

我的应用程序是简单的应用程序,由 Google 开发人员开发并由他们推荐用于动态呈现 JS SPA(允许搜索引擎和爬虫看到完全呈现的 html)。
我的实际网站和一个指向 GCP 的节点应用程序 爬虫托管在其他地方(在 Godaddy 上) 两者配合得很好。

我部署到 GCP 的应用叫做 Rendertron (https://github.com/GoogleChrome/rendertron)

Google 还建议部署到 GCP (大多数文档涵盖了这种部署形式)。 我尝试部署到我的 Godaddy 共享主机,但并不简单直接 为了工作,所以我只是尝试创建一个 GCP 项目并尝试在那里部署。 一切都很好!

将应用程序部署到几乎没有流量的 GCP 后, 我希望零成本或最多不到一美元。

不幸的是,我收到了一个月超过 150 美元的账单 与下个月的预计大致相同。

无需额外支付 150 美元的技术支持,我就可以联系 GCP 结算 超过 phone,他们很棒,因为他们愿意报销费用 但只有在我自己解决问题之后。

他们很慷慨地向你扔了一组文档链接 (意外实例小时使用的常见原因) 但除此之外别无他法。

经过多次 google 搜索,阅读文档, 通过 pluralsight.com 支付和观看 gcloud 教程, 目前我理解或不理解的方向如下:

我可以根据指示继续尝试调查如何解决问题。

  1. 我的方向需要创建一个组实例(这样我就可以 从那里管理无自动缩放)是要走的路,我应该把我的尝试集中在哪里?

  2. 继续学习如何简单地更新 .yaml 文件中的配置以创建无缩放的方向,例如将 min_instances 和 max_instances 都设置为 1连同学习如何手动停止(直接从 GCP 控制台)超过 1 个 instance/version 当前 运行ning 是我应该关注的地方?

  3. 第三种选择?

附带说明一下,使用 GCP 进行自动缩放似乎不是很智能。
为什么我的几乎没有流量的应用 运行 会变成创建多个实例的问题?

任何见解将不胜感激。


**** 更新 **** 平台信息

我的应用程序已部署到 Google App Engine (GAE) (部署的代码,不是容器)

部署步骤:

git clone https://github.com/GoogleChrome/rendertron.git
cd rendertron
npm install && npm run build
gcloud app deploy app.yaml --project MY_PROJECT_ID

我只是按照上面的步骤操作,我的应用程序一直在运行 太棒了,自部署以来就没有碰过任何东西。

最初部署的配置 (app.yaml) 是:
(我没有对 Rendertron 存储库进行任何更改)

runtime: nodejs12
instance_class: F4_1G
automatic_scaling:
  min_instances: 1
env_variables:
  DISABLE_LEGACY_METADATA_SERVER_ENDPOINTS: "true"

-- Google 云控制台信息

在 App Engine 下 --> 版本
列出了 1 个具有以下值的项目:

Instances: 1
Runtime: nodejs12

环境:标准

Size: 392.7 MB
Deployed: Feb 23, 2021
Config:
  runtime: nodejs12
  env: standard
  instance_class: F4_1G
  handlers:
    url: .*
    script: auto
  env_variables:
    DISABLE_LEGACY_METADATA_SERVER_ENDPOINTS: 'true'
  automatic_scaling:
    min_idle_instances: automatic
    max_idle_instances: automatic
    min_pending_latency: automatic
    max_pending_latency: automatic
    min_instances: 1
  network: {}


**** 解决方案 ****
我上传了一个新的 app.yaml 文件并更改了: min_instances: 1 到 max_instances: 1 (必须使用更新的 app.yaml 重新部署整个项目)

一开始我也是为了省钱把“instance_class”从F4_1G改成了F1, 但是我的应用程序出现错误,内存不足,我的应用程序因 500 服务器错误而崩溃。 (rendertron 应用出现了,但在尝试渲染某些东西时崩溃了) 我再次将其更新回 F4_1G,该应用程序似乎可以正常运行。

如果我以后在流量上升时再次看到收费,我会检查 F1 到 F4_1G 之间是否有一个实例 class 可以为我的应用程序提供足够的内存但尽可能累积最低费用。

下面您可以看到,当我在周五和下周日进行更改时,成本降至 0,但该应用程序仍 运行 正常运行:
Screenshot showing GCP billing report costs dropped after change
**** 解决方案 ****

rendertron repo suggests using App Engine standard (app.yaml) 所以我假设这就是你正在使用的。

如果您使用的是 App Engine 标准,则:

  • 使用 Compute Engine [实例组],因为这些资源由 App Engine 灵活使用(非标准);
  • 管理多个部署应该不是问题,因为标准不对维护多个非流量接收版本收费(!?),并且应该自动将流量从当前版本迁移到新版本。

App Engine 标准至少有 2 个关键变量:您正在使用的 App Engine 实例的大小及其数量:

  1. 您可能希望使用(更便宜的)实例 class (link)。
  2. 您可以max_instances: 1限制实例数(link)。

看来您的带宽使用率很低(并且会在很大程度上受到上述限制)但也要记住这一点,以及...

您的应用程序可能暴露在 public 互联网上,因此很容易消耗来自偶然发现您的端点和 GET 它的爬虫和其他“参与者”的流量。

如您所见,过度消耗(基于云的)资源并面临超出预期的账单是很容易的。 GCP 中有一些控件允许您监控(不一定取消)大额账单 (link)。

唯一真正的解决办法是尽可能熟悉该平台及其资源的定价方式。

更新 #1

我更喜欢使用 gcloud (CLI) 来管理服务,但我认为您更喜欢控制台。

当您将“应用程序”部署到 App Engine 时,它​​包含 >=1 个服务 (default)。我已经部署了最简单的“Hello World!”包含单个 default 服务 (Node.JS) 的应用:

https://console.cloud.google.com/appengine/services?serviceId=default&project=[[YOUR-PROJECT-ID]]

我将它部署了多 (3) 次,就好像我在改进应用程序一样。在“版本”页面上,列出了 3 个版本:

https://console.cloud.google.com/appengine/versions?serviceId=default&project=[[YOUR-PROJECT-ID]]

NOTE There are multiple versions stored on the platform but only the latest is serving (and 100% of) traffic. IIRC App Engine standard does not charge to store multiple versions.

我调整了配置 (app.yaml) 以指定 instance_class (F1) 并限制 max_instances: 1:

app.yaml:

runtime: nodejs14
instance_class: F1
automatic_scaling:
  max_instances: 1

并且,这反映在部署的应用程序的配置中:

更新 #2

如果您可以鼓励某人编写 Dockerfile 并将其贡献给 rendertron 存储库,则您可以将容器部署到各种替代服务(Google 和非Google).

App Engine 标准的一个奇怪事实是,当您将 'code' 部署到平台时,它会根据您的工件创建一个容器映像,这就是部署到 App Engine 的内容。您可以通过查看项目中的 Container Registry(服务)来证明这一点:

https://console.cloud.google.com/gcr/images/dazwilkin-210503-67357098?project=[[YOUR-PROJECT-ID]]

而且,如果您愿意,可以在其他地方重复使用该图像。

Google Cloud 运行 可能是您在 Google 上的最佳选择。云 运行 允许您限制您 运行 的实例数量,并且您可以更轻松地将对已部署应用程序的访问限制为经过身份验证的用户。

使用容器,您可以将 rendertron 部署到 运行 容器即服务的任何地方。

配置了automatic_scaling,为可选配置。
其他可用的选项是 basic_scalingmanual_scaling.

最便宜的配置可能是 manual_scaling 具有单个 B1 实例:

instance_class: B1
manual_scaling:
  instances: 1

这两个配置参数直接影响定价,也就是那种“按配置付费”。

虽然这可能不是建议的生产配置。
有关详细信息,请参阅 scaling elements and princing