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