挑战
作为 NBC 体育集团 的成员,GolfNow 是高尔夫行业的技术和服务领导者,管理着 10 种不同的产品,以及世界上最大的电子商务预订平台。随着其业务开始快速且全球化地扩张,GolfNow 的单体应用程序变得越来越成问题。“我们一直垂直扩展基础设施,而不是水平扩展,这使得运营成本变得非常高,”GolfNow 的架构总监谢里夫·穆罕默德说。“我们希望能够更容易地进行全球扩展。”
解决方案
GolfNow 开始转向微服务和容器化,将应用程序和数据库从第三方服务迁移到运行在 Docker 和 Kubernetes 上的自己的集群中。
影响
结果是立竿见影的。在保持相同容量(甚至在高峰期超过容量)的同时,GolfNow 发现其第一个应用程序的基础设施成本几乎减少了一半。
但谢里夫·穆罕默德和乔希·钱德勒做到了,他们在带领他们的公司 GolfNow 从单体架构过渡到由 Kubernetes 管理的容器化、云原生基础设施的过程中起到了重要作用。
作为 NBC 体育集团中表现优异的企业之一,GolfNow 是一家技术和服务公司,拥有世界上最大的预订平台。GolfNow 为 500 万活跃高尔夫球手提供 10 种不同的产品。近年来,业务发展迅速,以至于支持其庞大单体应用程序(用 C#.NET 编写,并由 SQL Server 数据库管理系统支持)的基础设施无法跟上。“随着我们的增长,我们显然需要扩展基础设施,而我们一直是垂直扩展,而不是水平扩展,”谢里夫,GolfNow 的架构总监说。“我们的成本呈指数级增长。除此之外,我们还需要构建一个灾难恢复 (DR) 环境,这意味着我们将不得不将原始数据中心的全部内容复制到另一个备用数据中心。我们基本上是在浪费钱,并且使基础设施成本翻倍。”
在将 GolfNow 的第一个重要应用程序(一个高尔夫球场预订引擎和 B2B 营销平台)从第三方服务迁移到自己的 Kubernetes 环境后,“我们的账单大幅下降,”谢里夫说。
这些出色成果的道路始于 2014 年底。为了支持 GolfNow 的全球增长,团队决定公司需要拥有多个数据中心,并且能够根据需要快速轻松地重新路由流量。“从那时起,我们就知道我们需要朝向拆分、微服务和容器化的方向发展,”谢里夫说。“当时我们正试图摆脱 C#.NET 和 SQL Server,因为它们在 Linux 上运行效果不佳,而所有容器都在 Linux 上运行得非常流畅。”
为此,团队开始使用 Node.js(用于开发工具和应用程序的开源跨平台 JavaScript 运行时环境)和 MongoDB(开源数据库程序)。当时,Docker(用于在容器中部署应用程序的平台)还很新。但是,一旦团队开始尝试使用它,谢里夫说,“我们意识到这就是我们想要走的路,尤其是在行业发展方向就是如此的情况下。”
GolfNow 的开发团队进行了一次“内部低调的”概念验证,并被说服了。“我们真的很喜欢容器之间传递的便捷性,以及能够快速启动和运行容器的便捷性,这与它在我的机器上运行的方式完全一样,”谢里夫说。“因为这始终是运维部门对开发人员最大的抱怨,对吧?‘它在我的机器上运行没问题!’但随后我们开始思考‘如何确保这些东西始终保持运行?’这个问题。”
这使得团队开始寻找适合公司需求的正确编排系统。谢里夫说,他们尝试的前几个选项要么太重,要么“感觉不太对”。在 2015 年夏末,他们发现了刚刚发布的 Kubernetes,谢里夫立即喜欢上了它的易用性。“我们又进行了一次概念验证,”他说,“Kubernetes 胜出,因为它的社区支持非常强大,并且建立在 Google 已有的成果之上。”
但在他们使用 Kubernetes 之前,GolfNow 的母公司 NBC 也要求他们与另一家公司进行比较。谢里夫和他的团队喜欢竞争对手的平台用户界面,但不喜欢其平台不允许容器在 Docker 上原生运行。在没有明确的决定的情况下,谢里夫在 GolfNow 的副总裁史蒂夫·麦克尔维安排了一个为期三个月的试用期,在此期间,一个 GolfNow 团队(由谢里夫和乔希组成,乔希现在是开放平台的首席架构师)将构建一个 Kubernetes 环境,而一个庞大的 NBC 团队将构建一个使用另一家公司的平台的环境。
"我们启动了集群,并尝试让所有东西都按我们想要的方式运行,”谢里夫说。“我们最大的收获是,我们不仅希望我们的应用程序在 Kubernetes 和 Docker 中运行,而且还希望我们的数据库在那里运行。我们希望我们的整个基础设施都在 Kubernetes 中运行。”
当时,社区中没有任何东西可以帮助他们将 Kafka 和 MongoDB 集群运行在 Kubernetes 和 Docker 环境中,因此谢里夫和乔希自己解决了这个问题,并花了整整一个月的时间才把它做好。“从那时起,一切都开始顺利,”谢里夫说。“我们能够将所有应用程序连接起来,并且比预期提前一个月完成了我们这边的概念验证。我的副总裁说,‘好吧,结束了。Kubernetes 胜出。’"
下一步是,从 2016 年 1 月开始,让所有东西都可以在生产环境中正常运行。团队首先专注于一个已经用 Node.js 和 MongoDB 编写的应用程序。这个应用程序是一个高尔夫球场预订引擎和 B2B 营销平台,它已经朝着微服务方向发展,但还没有完全完成。当时,它运行在 Heroku Compose 和其他第三方服务中,导致每月产生高昂的费用。
"目标是将所有这些都迁移到我们使用 Kubernetes 在 Google Compute Engine (GCE) 上创建的新平台中,”谢里夫说。“因此,我们最终构建了在 Heroku 和 Compose 中运行的组件,并在 Kubernetes 集群中并行地构建了这些组件。然后,实际上只是在后台切换了配置。因此,在 Heroku 中,我们有一个运行的应用程序,它连接到一个 Compose 数据库。我们将配置更改为连接到我们集群中运行的数据库。”
使用此过程,他们能够分段迁移,并且没有出现任何停机时间。第一次迁移是在非工作时间进行的,但为了测试极限,团队在白天用户大量使用应用程序时迁移了第二个数据库。“我们做到了,”谢里夫说,“而且再次成功。没有人注意到。”
经过三周的监控以确保一切稳定运行后,团队将应用程序的其余部分迁移到 Kubernetes 集群中。效果立竿见影:谢里夫说,除了将月度成本大幅削减外,‘在相同容量下,以及在高峰时段,我们能够进行水平扩展。由于我们更有效地利用了 VM,并且使用了容器,因此我们根本不需要额外付费。’"
他们不仅节省了资金,而且还节省了时间。“今天早上我参加了一个关于将一些应用程序从一个集群迁移到另一个集群的会议,”乔希说。“我花了大约 2 个小时来解释这个过程。我真正花费在迁移应用程序上的时间不到 30 秒!我们可以在极短的时间内迁移数据中心。如果你没有使用过 Kubernetes,你可能不会相信我。’谢里夫用这样的话来形容:‘在使用 Kubernetes 之前,我晚上睡不着觉,真的。我经常被叫醒,因为东西坏了。在使用 Kubernetes 之后,我晚上就能睡个好觉了。’"
GolfNow 上只有很小一部分应用程序迁移到了 Kubernetes 环境中。“我们的核心团队正在将许多 .NET 应用程序重写为 .NET Core [它与 Linux 和 Docker 兼容],以便我们能够在容器中运行它们,”谢里夫说。
展望未来,谢里夫和他的团队希望在 2017 年继续围绕 Kubernetes 构建一个完整的平台,并使用 Drone(一个开源的持续交付平台)使其更以开发人员为中心。“现在他们能够管理配置,能够管理部署等,这使得所有现在正在创建这些微服务的子团队能够实现自管理,”他说。“这样,我们可以摆脱应用程序,并确保集群正常运行且状态良好,然后实际上将这些工作迁移到我们的运维团队。”
从长远来看,Sheriff 对于让更多人加入 Kubernetes 的行列有一个更大的目标。"我们实际上试图将这个平台变得足够通用,以便我们任何一家姊妹公司都可以使用它,如果他们愿意的话," 他说。"我认为它绝对可以作为一种模式。我认为我们迁移到它的方式,我们构建它的方式,都是我认为其他公司可以借鉴的方式,而且不应该害怕。"
GolfNow 团队也通过开源 Josh 构建的机器人框架回馈给 Kubernetes 社区。"我们注意到仪表板用户界面实际上比我们开始时移动得更快," Sheriff 说。"但是我们意识到我们需要的是更多像机器人一样的东西,它真正帮助我们通过 Slack 来管理整个 Kubernetes。"Josh 解释道:"通过 Kubernetes-Slack 集成,你可以基本上连接到集群并执行命令和编辑配置。我们已经尽可能简化了安全配置。我们希望这将是我们对 Kubernetes 的主要感谢,感谢你为我们提供的一切。"
GolfNow 团队从完全的新手到在三个月内就达到生产就绪,他们渴望鼓励其他公司效仿。他们所学到的经验教训:"你必须得到你的老板的认可," Sheriff 说。"另一个重要的事情是,要有两到三个人专门负责这种类型的努力。你不能让那些半途而废的人参与进来。"如果你一开始没有得到认可,证明它就能让你获得认可。"
"这是现在云计算中的六百万美元先生," Josh 补充道。"只需试一试,看看会发生什么。我觉得当你看到这些类型的应用程序堆栈时,证明就在于实践。它们更快,更具弹性。"