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