挑战
NBC Sports Group 成员之一,GolfNow 是高尔夫行业的技术和服务领导者,管理着 10 种不同的产品,以及全球最大的电商开球时间交易市场。随着业务快速全球扩张,GolfNow 的单体应用变得棘手。“我们一直在垂直而非水平地扩展基础设施,导致运营成本变得很高,”GolfNow 的架构总监 Sheriff Mohamed 说。“我们希望能够更容易地进行全球扩张。”
解决方案
转向微服务和容器化,GolfNow 开始将其应用和数据库从第三方服务迁移到运行在 Docker 和 Kubernetes 上的自己的集群中。
影响
结果立竿见影。在保持相同容量(甚至在高峰期超出)的同时,GolfNow 的第一个应用的基础设施成本几乎削减了一半。
但 Sheriff Mohamed 和 Josh Chandler 做到这一点,他们帮助领导他们的公司 GolfNow 从单体架构转向由 Kubernetes 管理的容器化云原生基础设施。
作为 NBC Sports Group 的顶尖业务之一,GolfNow 是一家技术和服务公司,拥有世界上最大的开球时间交易市场。GolfNow 通过 10 种不同的产品服务着 500 万活跃的高尔夫球手。近年来,业务增长如此之快,以至于支持其庞大单体应用(用 C#.NET 编写,由 SQL Server 数据库管理系统支持)的基础设施无法跟上。“随着业务增长,我们显然需要扩展基础设施,但我们一直在垂直而非水平地扩展,”GolfNow 架构总监 Sheriff 说。“我们的成本呈指数级增长。最重要的是,我们必须构建一个灾难恢复 (DR) 环境,这意味着我们必须将原始数据中心中的所有内容精确复制到另一个仅作为备用的数据中心。我们基本上在浪费资金,导致基础设施成本翻倍。”
Sheriff 说,仅仅将 GolfNow 的第一个重要应用——一个高尔夫球场预订引擎和 B2B 营销平台——从第三方服务迁移到他们自己的 Kubernetes 环境,“我们的账单大幅下降”。
取得这些显著成果的道路始于 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 环境。Sheriff 说:“我们的核心团队正在将许多 .NET 应用重写为 .NET Core [它与 Linux 和 Docker 兼容],以便我们可以在容器中运行它们。”
展望未来,Sheriff 和他的团队希望在 2017 年继续围绕 Kubernetes 和 Drone(一个开源持续交付平台)构建一个完整的平台,使其更加以开发者为中心。“现在他们能够管理配置,管理他们的部署等等,让所有这些正在创建微服务的子团队能够自给自足,”他说。“这样我们就可以从应用中抽身,只需确保集群运行良好和健康,然后实际将其迁移给我们的运维团队。”
从长远来看,Sheriff 有一个更大的目标,那就是让更多人加入 Kubernetes 的大家庭。“我们实际上正在努力使这个平台足够通用,以便我们任何一家姐妹公司如果愿意都可以使用它,”他说。“我非常肯定它可以用作一个模型。我认为我们迁移到其中的方式,以及我们构建它的方式,都是其他公司可以学习并且不应害怕的方式。”
GolfNow 团队也通过开源 Josh 构建的一个机器人框架来回馈 Kubernetes 社区。“我们注意到控制面板的用户界面实际上比我们刚开始时要快得多,”Sheriff 说。“然而,我们意识到我们需要的是一个更像机器人的东西,它能真正帮助我们通过 Slack 管理整个 Kubernetes。” Josh 解释说:“通过 Kubernetes-Slack 集成,你基本上可以连接到一个集群,并发布命令和编辑配置。我们已尽力简化安全配置。我们希望这是我们对 Kubernetes 的主要感谢,感谢你给予我们的一切。”
从完全的新手到三个月内实现生产就绪,GolfNow 团队渴望鼓励其他公司跟随他们的脚步。他们学到的经验是:“你必须得到老板的支持,”Sheriff 说。“另一个重要的事情是需要有两到三个人专门投入到这项工作中。你不能让人们三心二意。” 如果一开始没有得到支持,通过实践证明它会帮助你实现目标。
“这就像云端的六百万美元先生,,”Josh 补充道。“试试看,看着它发生。我觉得当你看到这类应用栈时,事实胜于雄辩。它们更快、更具弹性。”