如何管理和部署同一节点应用程序的单独客户实例?
How to manage and deploy separate customer instances of the same node app?
我正在处理一个个人项目,我正准备将其部署到生产环境中。关于此的独特之处在于可能有多个客户端想要使用该应用程序,并且每个客户端都需要他们自己的独立应用程序实例和他们自己的服务器(我目前正在使用 now.sh
来托管应用程序,用 Nuxt 构建)。如果说我需要更改代码库并希望所有客户实例都获得相同的更改,那么我对如何管理这样的事情感到有点困惑。 2-3 个实例很容易,但如果有 10-20 个或 100-200 个实例怎么办?您将如何组织实例,以便在不花半天时间手动完成的情况下将更改推送到所有实例?我希望这是有道理的,如果我能澄清任何事情,请告诉我。非常感谢!
Each client would need their own separate app instance with their own server
[供将来参考的元数据——它的实用性可能很低,因为您已经实现了您的应用程序。]
从支持以这种方式设计的系统的经验来看,创建要求每个租户都拥有独立基础设施的开发模型在扩展时维护起来会很昂贵。
此外,在特定问题域之外,1很少需要。在生产环境中部署和维护服务时,此类方法通常会以更轻松的开发工作(通过避免与为每个租户划分数据模型相关的问题)与更昂贵和更复杂的运营开销进行交易。特别是,您遇到以下相互关联的问题:
成本低效:您的应用程序的每个实例都需要资源来提供服务。为每个租户复制这些资源将产生大量间接费用,包括支付资源的直接费用以及运输代码和维护车队的运营费用的间接费用。
与每个租户一台机器相比,少数共享机器更容易推理和管理,尤其是当您不熟悉托管生产服务时。此外,如果您希望从 Google 的 SLA 中受益,则必须根据其 robust design principles 部署每个租户实例——这意味着通过多区域部署(更多基础设施成本)为每个租户的部署添加冗余。
更少的资源池化和弹性:public云工作非常好当你可以池化资源(尤其是 CPU,内存),并根据您在所有租户之间共享的全球现实需求做出扩展决策,从而弹性地操作您的应用程序。每个租户的部署模型仍然可以获得这些好处,但是您将扩展域分割为在每个租户的基础上运行。除非您的租户很大并且拥有重要的基础设施,否则这几乎肯定会让您花费更多。每个租户的实例都必须单独扩展,当租户不使用您的系统时,您可能会为大量空闲实例支付费用。 (免责声明:我不知道你的系统是做什么的,所以我只是了解行业趋势。)
1此类问题领域包括高度监管的行业,这些行业需要硬边界来强制执行系统租户之间的严格数据隔离;任何具有安全性质或出售给有安全意识的个人的东西(有争议);在没有对其数据或部署模型进行重大重构的情况下,遗留(本地)应用程序从每个租户本地金属迁移到云部署的实例。
It would be easy with 2-3 instances, but what if there are 10-20, or 100-200? How would you organize the instances in such a way as to push changes to all of them without spending half a day to do it manually?
您需要使您的模型可重现并确保您的流程是自动化的。任何不足都会变得难以管理,并且不可避免地导致部署之间的漂移,使它们变得特殊 "snowflakes" 并且随着时间的推移更难以推理。
这里有多种工具和方法可以提供帮助:
配置管理:类似Ansible or Salt的工具。每个实例的所需配置在源代码中以声明方式指定。您无需手动执行命令(例如通过 SSH 到每台机器),而是委托特定工具来解释所需的配置并改变远程实例的配置以使它们收敛到表达的状态。如果一台机器坏了,您可以通过重新运行针对干净的实例部署剧本来轻松替换它。
Image foundries:public 云使启动新实例变得便宜。与物理机器不同,您可以销毁实例并在每次部署时重新创建它们。这可能会在机器需要为每个租户进行自定义(避免重复工作)之前将构建链中的步骤推得更高,并且用从干净图像构建的已知良好版本替换机器有助于消除漂移。 Packer, combined with a config management tool, help build common images which you can deploy using managed instance groups.
等工具
基础架构即代码:像Terraform这样的工具与配置管理工具的工作类似,用于声明性定义您的基础架构 – 在代码中指定实例组及其配置,而不是在云管理控制台中指向和单击。
要点:这些工具可帮助您定义流程,但它们本身并不是解决方案。您需要确定交付管道中需要哪些步骤才能将代码从提交到生产并实施 that。这些工具会有所帮助,但不是万灵药。
容器
如果您需要按租户部署并且更改应用程序的体系结构为时已晚,您可以考虑将应用程序容器化并使用 Google Kubernetes Engine 等托管容器平台来部署它。 GKE 将允许您为每个租户 运行 一个公共基础设施(Kubernetes "cluster"),因此受益于基础设施的规模经济,同时为系统中的每个租户托管一组独立的容器。
在此模型中,您的部署管道将涉及从代码构建容器映像的步骤(使用您最喜欢的 CI 系统,或 Google Cloud Builder 等托管服务)和实施将这些图像运送到生产环境的流程。
我正在处理一个个人项目,我正准备将其部署到生产环境中。关于此的独特之处在于可能有多个客户端想要使用该应用程序,并且每个客户端都需要他们自己的独立应用程序实例和他们自己的服务器(我目前正在使用 now.sh
来托管应用程序,用 Nuxt 构建)。如果说我需要更改代码库并希望所有客户实例都获得相同的更改,那么我对如何管理这样的事情感到有点困惑。 2-3 个实例很容易,但如果有 10-20 个或 100-200 个实例怎么办?您将如何组织实例,以便在不花半天时间手动完成的情况下将更改推送到所有实例?我希望这是有道理的,如果我能澄清任何事情,请告诉我。非常感谢!
Each client would need their own separate app instance with their own server
[供将来参考的元数据——它的实用性可能很低,因为您已经实现了您的应用程序。]
从支持以这种方式设计的系统的经验来看,创建要求每个租户都拥有独立基础设施的开发模型在扩展时维护起来会很昂贵。
此外,在特定问题域之外,1很少需要。在生产环境中部署和维护服务时,此类方法通常会以更轻松的开发工作(通过避免与为每个租户划分数据模型相关的问题)与更昂贵和更复杂的运营开销进行交易。特别是,您遇到以下相互关联的问题:
成本低效:您的应用程序的每个实例都需要资源来提供服务。为每个租户复制这些资源将产生大量间接费用,包括支付资源的直接费用以及运输代码和维护车队的运营费用的间接费用。
与每个租户一台机器相比,少数共享机器更容易推理和管理,尤其是当您不熟悉托管生产服务时。此外,如果您希望从 Google 的 SLA 中受益,则必须根据其 robust design principles 部署每个租户实例——这意味着通过多区域部署(更多基础设施成本)为每个租户的部署添加冗余。
更少的资源池化和弹性:public云工作非常好当你可以池化资源(尤其是 CPU,内存),并根据您在所有租户之间共享的全球现实需求做出扩展决策,从而弹性地操作您的应用程序。每个租户的部署模型仍然可以获得这些好处,但是您将扩展域分割为在每个租户的基础上运行。除非您的租户很大并且拥有重要的基础设施,否则这几乎肯定会让您花费更多。每个租户的实例都必须单独扩展,当租户不使用您的系统时,您可能会为大量空闲实例支付费用。 (免责声明:我不知道你的系统是做什么的,所以我只是了解行业趋势。)
1此类问题领域包括高度监管的行业,这些行业需要硬边界来强制执行系统租户之间的严格数据隔离;任何具有安全性质或出售给有安全意识的个人的东西(有争议);在没有对其数据或部署模型进行重大重构的情况下,遗留(本地)应用程序从每个租户本地金属迁移到云部署的实例。
It would be easy with 2-3 instances, but what if there are 10-20, or 100-200? How would you organize the instances in such a way as to push changes to all of them without spending half a day to do it manually?
您需要使您的模型可重现并确保您的流程是自动化的。任何不足都会变得难以管理,并且不可避免地导致部署之间的漂移,使它们变得特殊 "snowflakes" 并且随着时间的推移更难以推理。
这里有多种工具和方法可以提供帮助:
配置管理:类似Ansible or Salt的工具。每个实例的所需配置在源代码中以声明方式指定。您无需手动执行命令(例如通过 SSH 到每台机器),而是委托特定工具来解释所需的配置并改变远程实例的配置以使它们收敛到表达的状态。如果一台机器坏了,您可以通过重新运行针对干净的实例部署剧本来轻松替换它。
Image foundries:public 云使启动新实例变得便宜。与物理机器不同,您可以销毁实例并在每次部署时重新创建它们。这可能会在机器需要为每个租户进行自定义(避免重复工作)之前将构建链中的步骤推得更高,并且用从干净图像构建的已知良好版本替换机器有助于消除漂移。 Packer, combined with a config management tool, help build common images which you can deploy using managed instance groups.
等工具
基础架构即代码:像Terraform这样的工具与配置管理工具的工作类似,用于声明性定义您的基础架构 – 在代码中指定实例组及其配置,而不是在云管理控制台中指向和单击。
要点:这些工具可帮助您定义流程,但它们本身并不是解决方案。您需要确定交付管道中需要哪些步骤才能将代码从提交到生产并实施 that。这些工具会有所帮助,但不是万灵药。
容器
如果您需要按租户部署并且更改应用程序的体系结构为时已晚,您可以考虑将应用程序容器化并使用 Google Kubernetes Engine 等托管容器平台来部署它。 GKE 将允许您为每个租户 运行 一个公共基础设施(Kubernetes "cluster"),因此受益于基础设施的规模经济,同时为系统中的每个租户托管一组独立的容器。
在此模型中,您的部署管道将涉及从代码构建容器映像的步骤(使用您最喜欢的 CI 系统,或 Google Cloud Builder 等托管服务)和实施将这些图像运送到生产环境的流程。