挑战
作为 NBC 体育集团 的一员,GolfNow 是高尔夫行业的领先技术和服务公司,管理着 10 种不同的产品,以及全球最大的电子商务开球时间市场。随着其业务开始快速和全球扩张,GolfNow 的单体应用程序变得 problematic。“我们一直在垂直扩展基础架构,而不是水平扩展,而且开展业务的成本也变得 problematic,”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 说。“所以我们最终在我们的 Kubernetes 集群中逐个并行构建了 Heroku 和 Compose 中的东西。然后,从字面上看,只是在后台切换配置。所以在 Heroku 中,我们让应用程序运行并连接到 Compose 数据库。我们会获取配置,更改它并使其连接到在我们的集群中运行的数据库。”
使用此过程,他们能够零停机地逐步迁移。第一次迁移是在非工作时间进行的,但为了测试极限,团队在白天用户大量运行应用程序时迁移了第二个数据库。“我们做到了,”Sheriff 说,“而且再次成功了。没有人注意到。”
经过三个月的监控以确保一切稳定运行后,团队将应用程序的其余部分迁移到他们的 Kubernetes 集群中。影响是立竿见影的:除了将每月成本削减很大一部分之外,Sheriff 说,“在相同的容量和高峰时间运行时,我们能够水平扩展。由于我们通过容器更有效地使用虚拟机,因此我们根本不需要支付额外的费用。”
他们不仅节省了资金,还节省了时间。“我今天早上开会讨论了将一些应用程序从一个集群迁移到另一个集群的问题,”Josh 说。“我花了大约 2 个小时来解释这个过程。我实际迁移应用程序的时间不到 30 秒!我们可以在难以置信的短时间内迁移数据中心。如果你不是来自 Kubernetes 世界,你不会相信我的话。”Sheriff 这样说:“在 Kubernetes 之前,我晚上睡不着觉,真的。我总是被吵醒,因为事情不顺利。在 Kubernetes 之后,我一直睡到天亮。”
GolfNow 上的一小部分应用程序已迁移到 Kubernetes 环境。“我们的核心团队正在将许多 .NET 应用程序重写为 .NET Core [它与 Linux 和 Docker 兼容],以便我们可以在容器中运行它们,”Sheriff 说。
展望未来,Sheriff 和他的团队希望在 2017 年继续使用开源持续交付平台 Drone 围绕 Kubernetes 构建一个完整的平台,使其更加以开发人员为中心。“现在他们能够管理配置,他们能够管理他们的部署等等,使所有这些现在正在创建所有这些微服务的子团队都能自给自足,”他说。“所以它可以让我们摆脱应用程序,让我们只负责确保集群运行正常,然后将其迁移到我们的运维团队。”
从长远来看,Sheriff 有一个更大的目标,那就是让更多的人加入 Kubernetes 的行列。“我们实际上正在努力使这个平台足够通用,以便我们的任何姊妹公司都可以根据需要使用它,”他说。“我绝对认为它可以作为一个模型。我认为我们迁移到它的方式,我们构建它的方式,都是我认为其他公司可以学习的方式,并且不应该害怕。”
GolfNow 团队还通过开源 Josh 构建的机器人框架来回馈 Kubernetes 社区。Sheriff 说:“我们注意到,仪表板用户界面的发展速度比我们开始时快了很多。然而,我们意识到我们需要的是更像机器人的东西,它可以通过 Slack 真正帮助我们管理整个 Kubernetes。” Josh 解释说:“通过 Kubernetes-Slack 集成,您基本上可以连接到集群并发出命令和编辑配置。我们试图尽可能地简化安全配置。我们希望这是我们对 Kubernetes 的主要感谢,感谢您为我们提供的一切。”
GolfNow 团队从完全的新手到在三个月内做好生产准备,他们渴望鼓励其他公司效仿他们的做法。他们吸取的教训是:“你必须得到你老板的支持,”Sheriff 说。“另一个重要因素是安排两到三个人专门负责这类工作。你不能让人们半途而废。” 如果你一开始就没有得到支持,那么证明它的价值就能让你得到支持。
“这就是现在的云计算领域的‘六百万美元先生’,”Josh 补充道。“尽管尝试一下,看看会发生什么。 当你看到这些应用程序堆栈时,你会发现事实胜于雄辩。它们更快,更有弹性。”