【问题标题】:How to deploy a simple app to GCP with minimal costs (or how to disable autoscaling after deploy)?如何以最低的成本将简单的应用程序部署到 GCP(或如何在部署后禁用自动缩放)?
【发布时间】:2021-07-25 04:00:08
【问题描述】:

在我第一次尝试使用云部署应用程序时...

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

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

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

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

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

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

很遗憾,我收到了本月超过 150 美元的账单 下个月的预计大致相同。

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

他们慷慨地向您抛出一组文档链接 (意外实例小时使用的常见原因) 但无能为力。

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

  • 几乎所有文档、视频和教程都在谈论管理或关闭自动缩放 使用 Compute Engine 实例组
  • 目前尚不清楚实例组不是我会陷入的另一个漏洞,即付费服务 我会被收取超出必要的费用
  • 对于只希望以最低成本运行一个实例的简单应用来说,实例组似乎有点过头了
  • 没有足够的文档或很难找到有关如何使用最少的资源以最低的成本运行非常小规模的应用程序的文档
  • 我还没有阅读或观看任何关于如何简单地使用 config .yaml 文件(最初部署)来确保应用程序不会自动缩放以及如果我发现我似乎仍然需要删除版本或实例的任何内容已经开始了,也不清楚如何做。
  • 实例和版本在谷歌控制台上不清楚有多少正在运行,我仍然没有在谷歌控制台上找到有多个实例/版本正在运行。

我可以使用指导来继续尝试调查如何解决问题。

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

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

  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"

-- 谷歌云控制台信息

在 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 服务器错误而崩溃。 (渲染器应用程序出现但在尝试渲染某些内容时崩溃) 我再次将其更新回 F4_1G,并且该应用似乎可以正常运行。

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

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

【问题讨论】:

  • 您的应用是否已部署到 Google App Engine (GAE)?如果是这样,它是标准环境还是灵活环境?您的运行时是什么?
  • 您的环境听起来像是 App Engine 灵活的,或具有手动扩展的标准环境。您需要分享更多关于您的平台、部署和配置的信息。如果你部署你的代码或容器,你也可以分享一下吗?
  • 我对问题进行了更新以回答您的问题。感谢您的关注:)

标签: google-cloud-platform gcloud autoscaling google-cloud-billing rendertron


【解决方案1】:

rendertron 存储库建议使用 App Engine 标准 (app.yaml),所以我认为这就是您正在使用的。

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

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

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

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

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

您的应用很可能暴露在公共互联网上,因此很容易消耗来自抓取工具和其他“参与者”的流量,这些“参与者”偶然发现了您的端点和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]]

注意平台上存储了多个版本,但只有最新的版本在提供(和 100% 的)流量。 IIRC App Engine 标准不收取存储多个版本的费用。

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

app.yaml:

runtime: nodejs14
instance_class: F1
automatic_scaling:
  max_instances: 1

而且,这反映在已部署应用的配置中:

更新 #2

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

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

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

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

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

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

【讨论】:

  • 我对问题进行了更新。感谢您的回答 :) 当我继续思考您的回答中的项目时,如果我的更新引发了我可以采取的更具体方向的想法,请告诉我。
  • 如果是一个,请考虑“接受”我的回答。 Stackoverflow 上的人们为帮助他人做出了贡献,但我们通过接受的答案和支持来衡量。
  • 对于以后的问题,我建议您考虑将多部分问题分解为多个问题。此处的贡献者会更快(也更有可能)回答这些问题。像这样的广泛问题令人生畏,往往会阻碍回应。
  • 我更新了我的答案,解释了部署的工作原理,并且可以在 GCP 上查看。第二个更新建议考虑使用容器作为更“便携”的解决方案。
【解决方案2】:

配置了automatic_scaling,这是一个可选配置。
其他可用选项为basic_scalingmanual_scaling

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

instance_class: B1
manual_scaling:
  instances: 1

这两个配置参数直接影响定价,即“按配置付费”。

虽然这可能不是用于生产的建议配置。
请参阅scaling elementsprincing 了解更多信息。

【讨论】:

    猜你喜欢
    • 2022-12-14
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2020-03-21
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多