挑战
Squarespace 站点可靠性团队的工程师 Kevin Lynch 表示,2014 年从单体架构迁移到微服务“解决了开发方面的问题,但却将该问题推给了基础设施团队”。“我们在 5,000 台虚拟机主机上的基础设施部署流程正在拖慢所有人的速度。”
解决方案
该团队尝试了容器编排平台,发现 Kubernetes “回答了我们所有的问题”,Lynch 说。该公司于 2016 年开始在其数据中心运行 Kubernetes。
影响
自从 Squarespace 迁移到 Kubernetes 并结合其网络堆栈现代化以来,部署时间缩短了近 85%。以前,他们的虚拟机部署需要半小时;现在,Lynch 说,“有人可以生成一个模板化的应用程序,在五分钟内完成部署,并且在那个时候,实际的实例已经容器化并在我们的暂存环境中运行。” 因此,“生产力时间是最大的成本节约,”他补充说。“当我们启动 Kubernetes 项目时,我们可能只有十几个微服务。如今,在正在积极开发的管道中有两倍的微服务。” Kubernetes 也提高了弹性:“如果一个节点宕机,它会立即重新调度,并且不会对性能产生影响。”
然而,在幕后,该公司单体 Java 应用程序使得开发人员难以持续改进平台。因此,在 2014 年,该公司决定“走微服务之路”,Squarespace 站点可靠性团队的工程师 Kevin Lynch 说。“但是我们始终是在(我们自己的数据中心)vCenter VMware 虚拟机中部署我们的应用程序。微服务解决了开发方面的问题,但却将该问题推给了基础设施团队。我们在 5,000 台虚拟机主机上的基础设施部署流程正在拖慢所有人的速度。”
在尝试了另一个容器编排平台并“以非常痛苦的方式将其破坏”后,Lynch 说,该团队于 2016 年年中开始尝试 Kubernetes,并发现它“回答了我们所有的问题”。在数据中心而不是公共云中部署它是他们最大的挑战,而且当时没有很多其他公司这样做。“我们必须弄清楚如何在我们的基础设施中自行部署它,并且必须将其与其他应用程序集成,”Lynch 说。
与此同时,Squarespace 的网络工程团队正在对其网络堆栈进行现代化改造,从传统的二层网络切换到三层脊叶网络。“它与我们想要使用 Kubernetes 做的事情完美契合,”Lynch 说。“它使我们的服务器能够直接与架顶交换机通信。我们使用 Calico 进行 Kubernetes 的 CNI 网络,因此我们可以公布所有这些单独的 Kubernetes Pod IP 地址,并使它们与仍然在虚拟机中配置的其他服务无缝集成。”
在几个月内,他们就拥有了一个稳定的内部使用集群,并开始为生产环境推出 Kubernetes。他们还将 Zipkin 和 CNCF 项目 Prometheus 和 fluentd 添加到其云原生堆栈中。“我们切换到 Kubernetes,一个新世界,我们也改进了所有其他工具,”Lynch 说。“这使我们能够简化流程,因此我们现在可以轻松地从模板创建整个微服务项目,生成该项目的代码和部署管道,生成 Dockerfile,然后立即将可工作、可部署的项目发布到 Kubernetes。”跨开发/质量保证/暂存/生产环境的部署也“大大简化了”,Lynch 补充说。“现在配置差异很小。”
整个过程只需五分钟,与他们的虚拟机部署相比,时间缩短了近 85%。“从头到尾可能需要半个小时,这还没有考虑到基础设施工程师会负责执行此操作的事实,因此也存在一些业务延迟。”
由于部署速度更快,“生产力时间是最大的成本节约,”Lynch 说。“我们有一个团队正在实施一个新的文件存储服务,他们只是在没有我们参与的情况下开始将其与我们的存储后端集成”——这在 Kubernetes 之前是不可能实现的。他补充说:“当我们启动 Kubernetes 项目时,我们可能只有十几个微服务。如今,在正在积极开发的管道中有两倍的微服务。”
它还对应用程序的弹性产生了积极影响。“当我们部署虚拟机时,我们必须构建工具来确保服务在机架上正确分布并能承受故障,”他说。“Kubernetes 只需这样做。如果一个节点宕机,它会立即重新调度,并且不会对性能产生影响。”
另一个主要好处是自动扩展。“在我们使用 VMware 的方式下,它实际上是不可能的,”Lynch 说,“但现在我们可以直接通过 Kubernetes 添加适当的自动扩展功能,并且随着需求的增加,它就会立即扩展。而且它开箱即用。”
对于其他刚开始使用 Kubernetes 的人,Lynch 说他最好的建议是“快速失败”:“一旦你计划好事情,就执行。Kubernetes 非常适合快速尝试某些东西并查看它是否有效。”
Lynch 和他的团队计划开源他们开发的一些工具,以扩展 Kubernetes 并将其用作 API 本身。第一个工具将依赖应用程序作为容器注入 Pod 中。“当你发布应用程序时,通常会附带许多需要一起发布的依赖应用程序,例如,用于日志记录的 fluentd,”他解释说。有了这个工具,开发人员无需担心配置。
展望未来,Squarespace 的所有新服务都将进入 Kubernetes,最终目标是转换所有可以转换的服务。大约四分之一的现有服务已经迁移。“我们的单体应用程序将是最后一个,因为它太庞大和复杂了,”Lynch 说。“但是现在我看到其他服务也被迁移过来,比如文件存储服务。有人只是这样做并且成功了——毫无痛苦。因此我相信如果我们解决它,它可能比我们担心的要容易得多。也许我应该听取自己的建议,快速失败!”