挑战
GolfNow 是 NBC 体育集团的成员,是高尔夫行业的技术和服务领导者,管理着 10 种不同的产品,以及世界上最大的电子商务开球时间市场。随着业务在全球范围内的快速扩张,GolfNow 的单体应用变得问题重重。GolfNow 架构总监 Sheriff Mohamed 表示:“我们一直在垂直而非水平地扩展基础设施,导致运营成本问题重重。我们希望能够更轻松地在全球范围内扩张。”
解决方案
GolfNow 转向微服务和容器化,开始将其应用程序和数据库从第三方服务迁移到自己运行在 Docker 和 Kubernetes 上的集群。
影响
效果立竿见影。在保持相同容量(高峰期甚至更高)的同时,GolfNow 的第一个应用程序的基础设施成本几乎减半。
但 Sheriff Mohamed 和 Josh Chandler 就是这样做的,他们帮助他们的公司 GolfNow 完成了从单体到由 Kubernetes 管理的容器化云原生基础设施的转型。
GolfNow 是 NBC 体育集团中表现出色的业务,是一家技术和服务公司,拥有世界上最大的开球时间市场。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 获胜,因为有社区支持,并且建立在谷歌已经完成的工作之上。”
但在他们选择 Kubernetes 之前,GolfNow 的母公司 NBC 也要求他们与另一家公司进行比较。Sheriff 和他的团队喜欢竞争公司的平台用户界面,但不喜欢它的平台不允许容器在 Docker 上本地运行。由于没有明确的决定,Sheriff 在 GolfNow 的副总裁 Steve McElwee 安排了一次为期三个月的试用,在此期间,一个 GolfNow 团队(由 Sheriff 和 Josh 组成,Josh 现在是开放平台首席架构师)将构建一个 Kubernetes 环境,而一个大型 NBC 团队将使用另一家公司的平台构建一个。
“我们启动了集群,并尝试让一切都按照我们想要的方式运行,”Sheriff 说,“我们从中得到的最大启示是,我们不仅希望我们的应用程序在 Kubernetes 和 Docker 中运行,我们还希望我们的数据库也在其中运行。我们确实希望我们的整个基础设施都在 Kubernetes 中运行。”
当时社区中没有任何东西可以帮助他们在 Kubernetes 和 Docker 环境中运行 Kafka 和 MongoDB 集群,所以 Sheriff 和 Josh 自己解决了这个问题,花了整整一个月才搞定。“一切都从那时开始,”Sheriff 说,“我们能够连接所有应用程序,我们提前一个月完成了概念验证。我的副总裁说,‘好了,结束了。Kubernetes 赢了。’”
下一步,从 2016 年 1 月开始,是将所有东西投入生产。团队首先专注于一个已经用 Node.js 和 MongoDB 编写的应用程序。该应用程序是一个高尔夫球场的预订引擎和 B2B 营销平台,当时已经朝着微服务方向发展,但尚未完全完成。当时,它运行在 Heroku Compose 和其他第三方服务中,导致每月账单高昂。
Sheriff 说:“我们的目标是将其全部取出,并将其放入我们使用 Google Compute Engine (GCE) 上的 Kubernetes 创建的新平台中。因此,我们最终在 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 团队还在回馈 Kubernetes 社区,他们开源了 Josh 构建的一个机器人框架。Sheriff 说:“我们注意到仪表板用户界面实际运行的速度比我们刚开始时快得多。然而,我们意识到我们需要的是一个更像机器人的东西,可以真正帮助我们通过 Slack 全面管理 Kubernetes。”Josh 解释说:“通过 Kubernetes-Slack 集成,你基本上可以连接到一个集群,然后发布命令和编辑配置。我们已经尽力简化了安全配置。我们希望这将是我们对 Kubernetes 的主要感谢,感谢你给予我们的一切。”
从完全新手到生产就绪,GolfNow 团队在三个月内完成了转型,他们渴望鼓励其他公司效仿。他们学到的经验教训:“你必须得到老板的支持,”Sheriff 说,“另一个重要的因素是,要有两到三名人员专门从事这类工作。你不能让那些半心半意的人来做。”如果你一开始没有得到支持,通过实践来证明它会让你成功。
“这就像现在的云端‘六百万美元先生’,”Josh 补充说,“只需尝试一下,看看会发生什么。我觉得当你看到这种应用程序堆栈时,证据就在眼前。它们更快、更具弹性。”