挑战
作为一家 PACE(财产评估清洁能源)融资公司,Ygrene 自 2010 年以来已为超过 10 亿美元的贷款提供资金。为了批准和处理这些贷款,“我们有大量的数据源正在被聚合,我们还有很多系统需要处理这些数据,”Ygrene 开发经理奥斯汀·亚当斯说。该公司正在使用大型服务器,“我们只是达到了垂直扩展的极限。我们的系统非常不稳定,仅仅为了实时进行后台数据处理,就会被请求淹没。用户看到的性能非常差。我们需要一个解决方案,它不会要求我们对代码库进行巨大的重构。”作为一个金融公司,Ygrene 还需要确保他们的应用程序是安全交付的。
解决方案
Ygrene 团队从 Engine Yard 平台和 Amazon Elastic Beanstalk 转移,开始拥抱云原生技术和实践:Kubernetes 帮助垂直扩展和分布工作负载,Notary 用于在构建时实施控制并获得对 Docker 镜像的信任(这些镜像与第三方依赖项一起使用),以及Fluentd 用于“观察我们堆栈的每个部分”,所有这些都在Amazon EC2 Spot 上运行。
影响
之前,部署通常需要 3 到 4 个小时,每隔一到两周,就会在低流量时间部署两个或三个月的代码工作量。现在,使用 Kubernetes 部署只需要 5 分钟,而整个部署(包括冒烟测试)则需要一个小时。亚当斯说:“我们现在每周能够部署 3 到 4 次,每次只部署一周或两天内的代码工作量。”“我们正在工作日的白天进行部署,并且没有停机时间。以前,即使是在半夜,我们也必须请求业务批准才能将系统停机,因为人们可能会在进行贷款。现在,我们可以部署、交付代码和迁移数据库,而无需停机。公司可以获得新功能,而无需担心会丢失或延迟业务。”此外,通过使用 kops 项目,Ygrene 现在可以将其 Kubernetes 集群与 AWS EC2 Spot 结合使用,成本仅为之前的十分之一。这些云原生技术“改变了可扩展性、可观察性和安全性方面的游戏规则——我们正在添加非常安全的新数据源,”亚当斯说。“没有 Kubernetes、Notary 和 Fluentd,我们就无法向投资者和团队成员保证我们知道发生了什么。”
作为一家 PACE(财产评估清洁能源)融资公司,“我们利用房屋或商业建筑的股权,为任何节约电力、生产电力、节约用水或减少碳排放的财产改善项目提供资金,”开发经理奥斯汀·亚当斯说。
为了批准这些贷款,该公司处理了大量的承销数据。“我们必须验证很多关于房产、公司或个人信息,”亚当斯说。“所以我们有大量的数据源正在被聚合,我们还有很多系统需要实时处理这些数据。”
到 2017 年,部署和可扩展性成为了痛点。该公司正在使用大型服务器,“我们只是达到了垂直扩展的极限,”他说。迁移到 AWS Elastic Beanstalk 并没有解决问题:“Scala 服务需要从主要的 Ruby on Rails 服务和不同供应商那里获取大量数据,所以它们以 Ruby 服务无法处理的速度从我们的 Ruby 服务请求信息。我们在 Elastic Beanstalk 上也遇到了很多配置错误。这一切都到了顶点,我们意识到我们的系统非常不稳定。”
亚当斯和团队的其他成员开始寻找一个能够带来变革的解决方案,但“不会要求我们对代码库进行巨大的重构,”他说。作为一家金融公司,Ygrene 需要安全性和可扩展性。他们通过拥抱云原生技术找到了答案:Kubernetes 帮助垂直扩展和分布工作负载,Notary 用于在每个级别实现可靠的安全,以及 Fluentd 用于可观察性。“Kubernetes 是社区前进的方向,我们希望能够适应未来,”亚当斯说。
借助 Kubernetes,团队能够快速使用 Docker 将 Ygrene 应用程序容器化。“我们必须改变一些实践和代码,以及构建方式,”亚当斯说,“但我们能够在一个月左右的时间内将主要系统迁移到 Kubernetes,然后在两个月内投入生产。对于一家金融公司来说,这非常快。”
为什么?云原生“改变了可扩展性、可观察性和安全性方面的游戏规则——我们正在添加非常安全的新数据源,”亚当斯说。“没有 Kubernetes、Notary 和 Fluentd,我们就无法向投资者和团队成员保证我们知道发生了什么。”
特别是 Notary,“一直都是福音,”亚当斯说。“我们需要知道我们在第三方依赖项上的攻击面很低,或者至少是可控的。我们将其用作信任系统,也将其用作隔离系统,因此生产镜像由 Notary 签署,但一些开发镜像没有签署。这样可以确保它们无法进入生产集群。我们一直在测试集群中使用它,以对我们的构建更有信心。”
通过使用 kops 项目,Ygrene 能够从 Elastic Beanstalk 转移到在 AWS EC2 Spot 上运行其 Kubernetes 集群,成本仅为之前的十分之一。“以前,为了扩展,我们需要增加实例大小,从而导致高成本低价值,”亚当斯说。“现在,借助 Kubernetes 和 kops,我们能够在 Spot 上使用多个实例组进行水平扩展。”
这也帮助他们降低了在公共云中运行带来的风险。“我们基本上弄明白了,如果我们可以使用 EC2 Spot 选择实例类别,这些类别极不可能出现中断,并且没有中断历史,而且我们愿意支付足够高的价格,那么我们几乎可以获得相同的保证,因为我们使用 Kubernetes 有足够的节点,”软件工程师扎克·阿诺德说,他是迁移到 Kubernetes 的负责人。“现在,我们已经重新设计了应用程序的这些部分,使其不再位于同一台服务器上,因此我们可以将它们推送到许多不同的服务器上,并实现更稳定的部署。”
因此,团队现在可以随时交付代码。“这很冒险,因为它可能会导致整个贷款管理软件崩溃,”阿诺德说。“但现在,我们可以在白天安全可靠地部署。”
之前,部署通常需要 3 到 4 个小时,每隔一到两周,就会在低流量时间部署两个或三个月的代码工作量。现在,使用 Kubernetes 部署只需要 5 分钟,而整个部署(包括冒烟测试)则需要一个小时。亚当斯说:“我们现在每周能够部署 3 到 4 次,每次只部署一周或两天内的代码工作量。”“我们正在工作日的白天进行部署,并且没有停机时间。以前,即使是在半夜,我们也必须请求业务批准才能将系统停机 30 分钟到一个小时,因为人们可能会在进行贷款。现在,我们可以部署、交付代码和迁移数据库,而无需停机。公司可以获得新功能,而无需担心会丢失或延迟业务。”
云原生还影响了 Ygrene 的 50 多名开发人员和承包商的工作方式。阿诺德说,亚当斯和阿诺德花了很多时间“教人们从一开始就进行分布式思考”。“我们最终选择了我们所说的交付的四个 S:安全、可靠、稳定和快速。”(有关安全方面的更多信息,请参阅他们关于“持续黑客”策略的文章。)至于工程师,亚当斯说,“他们的软件随着软件的进步而进步。我认为,归根结底,开发人员对他们的工作感觉更好,而且他们也感觉与现代软件开发社区更加紧密。”
展望未来,亚当斯很高兴探索更多 CNCF 项目,包括 SPIFFE 和 SPIRE。“CNCF 已经成为如此多项目的惊人孵化器,”他说。“现在,我们会定期查看其网页,了解是否有任何新的、很棒的、高质量的项目可以实现到我们的堆栈中。它实际上已经成为我们了解需要关注哪些软件以使我们的系统更安全或更可扩展的中心。”