google-cloud-platform - 如何以最低的成本将简单的应用程序部署到 GCP(或如何在部署后禁用自动缩放)?
问题描述
在我第一次尝试使用 Cloud 部署应用程序时...
问题:GCP(谷歌云平台)意外的实例小时使用(前端实例小时)。高流量不是问题,但由于某种原因,它们的自动缩放功能创建了一堆“实例”和“版本”。
他们建议的解决方案:禁用自动缩放并停止提供以前部署的实例版本。我仍然需要一个版本/实例运行,但通过他们的控制台我仍然没有找到它显示我运行了多少版本/实例或在哪里停止它们(同时验证至少 1 个实例仍在工作,以免破坏我的应用程序)
我的应用程序是由 Google 开发人员开发的简单应用程序,并被他们推荐用于动态呈现 JS SPA(允许搜索引擎和爬虫查看完全呈现的 html)。
我的实际网站以及指向 GCP 以供爬虫的节点应用程序托管在其他地方(在 Godaddy 上),并且两者都很好地协同工作。
我部署到 GCP 的应用程序称为 Rendertron ( https://github.com/GoogleChrome/rendertron )
Google 还建议部署到 GCP(大多数文档都涵盖了这种部署形式)。我尝试部署到我的 Godaddy 共享主机,但它并不简单且易于操作,所以我只是尝试创建一个 GCP 项目并尝试在那里部署。一切都很好!
在将应用程序部署到几乎没有流量的 GCP 之后,我预计零成本或最多不到 1 美元。
不幸的是,我收到了本月超过 150 美元的账单,预计下个月的账单大致相同。
在没有额外支付 150 美元的技术支持费用的情况下,我可以通过电话联系 GCP 计费,他们非常棒,因为他们愿意报销费用,但前提是我自己解决了问题。
他们慷慨地向您抛出一组文档链接(意外实例小时使用的常见原因),但除此之外无济于事。
经过多次google搜索,通读文档,付费并通过pluralsight.com观看gcloud教程, 我目前了解或不了解的方向如下:
- 几乎所有文档、视频和教程都谈到了使用 Compute Engine 实例组管理或关闭自动扩缩
- 目前尚不清楚实例组不是我会陷入的另一个漏洞,这是一项付费服务,我将被收取超过必要的费用
- 对于只希望以最低成本运行一个实例的简单应用程序来说,实例组似乎有点过头了
- 没有足够或难以找到有关如何使用最少的资源以最低的成本运行非常小规模的应用程序的文档
- 我还没有阅读或看过任何关于如何简单地使用 config .yaml 文件(最初部署)来确保应用程序不会自动缩放以及如果我发现我似乎仍然需要删除已经存在的版本或实例的任何内容已经开始了,也不清楚如何做到这一点。
- 实例和版本在谷歌控制台上不清楚有多少正在运行,我仍然没有在谷歌控制台上找到运行多个实例/版本的地方。
我可以使用指示继续尝试调查如何解决问题。
我需要创建一个组实例(这样我可以从那里管理无自动缩放)的方向是要走的路,我应该把我的尝试集中在哪里?
继续学习如何在 .yaml 文件中简单地更新我的配置以创建不缩放的方向,例如将 min_instances 和 max_instances 设置为 1 以及学习如何手动停止(直接从 GCP 控制台)超过 1 个实例/当前运行的版本是我应该关注的地方?
第三种选择?
附带说明一下,使用 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 --> Versions
下列出了 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,但应用程序仍在正常运行:
屏幕截图显示更改后 GCP 计费报告成本下降
****解决方案****
解决方案
推荐阅读
- python - Python Pandas 将两个数据帧与相似的(字符串)列进行比较,其中 1 个 df 的值是其他 df 值的子字符串
- android - 如何在 RecyclerView 中的最后一项之后设置恒定边距?
- javascript - 如何使用 babel 或 webpack 在 ES6 导入/导出模块中使用 Node.js CommonJS 模块?
- r - 试图改变日期的格式 R
- angular - Angular 12 APP_INITIALIZER 未在其他模块之前触发
- c# - 如何将 .Net 框架包与 AWS Lambda 一起使用
- .net - 初始化字符串的格式不符合从索引 0 开始的规范错误 EF Core
- unity3d - unity:计算刚体的角速度以始终面向特定方向
- javascript - 使用 Date-fns 将小时分钟和秒缩短到几分钟
- python - 随着时间的推移,如何将列标签添加到具有之前、期间和之后阶段的数据框?