公司:诺德斯特龙 (Nordstrom) 地点:华盛顿州西雅图 行业:零售

挑战

诺德斯特龙希望提高其技术运营的效率和速度,其中包括 Nordstrom.com 电子商务网站。与此同时,诺德斯特龙技术部门也在寻找降低技术运营成本的方法。

解决方案

在拥抱 DevOps 转型并启动持续集成/持续部署 (CI/CD) 项目四年后,该公司将其部署时间从三个月缩短至 30 分钟。但他们希望在各个环境中实现更快的速度,因此他们开始了云原生之旅,采用 Docker 容器,并使用 Kubernetes 进行编排。

影响

诺德斯特龙技术部门的开发人员现在使用 Kubernetes 部署速度更快,并且可以“专注于编写应用程序”,负责为诺德斯特龙构建 Kubernetes 企业平台的团队高级工程师 Dhawal Patel 说。此外,该团队还提高了运营效率,将 CPU 利用率提高了 5 倍到 12 倍,具体取决于工作负载。“我们运行着数千台虚拟机 (VM),但没有有效地利用所有这些资源,”Patel 说。“使用 Kubernetes,即使不尝试优化我们的集群,我们目前的效率也提高了 10 倍。”

当 Dhawal Patel 五年前加入 Nordstrom 担任零售商网站的应用程序开发人员时,他意识到有机会帮助加快开发周期。

在早期的 DevOps 时代,诺德斯特龙技术部门仍然遵循传统的孤岛团队和职能模式。“作为一名开发人员,我花费更多的时间来修复环境,而不是编写代码和为业务增加价值,”Patel 说。“我对这一点充满热情,所以我得到了帮助解决这个问题的机会。”

该公司也渴望加快速度,并在 2013 年启动了第一个持续集成/持续部署 (CI/CD) 项目。该项目是诺德斯特龙云原生之旅的第一步。

开发和运营团队成员构建了 CI/CD 管道,与公司本地的服务器一起工作。该团队选择了 Chef,并编写了自动创建虚拟 IP、服务器和负载均衡的食谱。“在我们完成项目后,部署时间从三个月缩短到 30 分钟,”Patel 说。“我们仍然有多个环境——开发、测试、暂存,然后是生产——因此在每个环境中运行 Chef 食谱都需要 30 分钟。在那时,这是一个巨大的成就。”

但是,新环境仍然需要太长时间才能启动,因此下一步是在云中工作。如今,诺德斯特龙技术部门已经构建了一个企业平台,允许公司 1,500 名开发人员部署作为 Docker 容器在云中运行的应用程序,并使用 Kubernetes 进行编排。

“云提供了更快的资源访问,因为我们在本地获取虚拟机 (VM) 需要数周时间,”Patel 说。“但是现在我们可以在短短五分钟内完成同样的事情。”

诺德斯特龙首次尝试在集群上调度容器是基于 CoreOS fleet 的自建系统。他们开始使用该系统进行一些概念验证项目,直到 Kubernetes 1.0 发布后他们才进行了切换。“我们押注 Kubernetes 将会兴起,这得益于社区支持和项目速度的早期指标,因此我们以 Kubernetes 为核心重建了我们的系统,”诺德斯特龙 Kubernetes 团队的高级经理 Marius Grigoriu 说。

虽然 Kubernetes 通常被认为是微服务的平台,但在诺德斯特龙的 Kubernetes 上以关键生产角色启动的第一个应用程序是 Jira。“这不是我们希望作为第一个应用程序获得的理想微服务,”Patel 承认,“但是负责该应用程序的团队对 Docker 和 Kubernetes 非常热情,他们想尝试一下。他们的应用程序在本地运行,并希望将其迁移到 Kubernetes。”

加入的团队立即获得了好处。“在我们 Kubernetes 集群上运行的团队喜欢他们需要担心的的较少的问题。他们不需要管理基础设施或操作系统,”Grigoriu 说。“早期的采用者喜欢 Kubernetes 的声明式特性。他们喜欢他们需要处理的较少的表面积。”

为了支持这些早期的采用者,Patel 的团队开始扩大集群并构建生产级服务。“我们集成了 Prometheus 进行监控,并使用 Grafana 前端;我们使用 Fluentd 将日志推送到 Elasticsearch,这样就为我们提供了日志聚合,”Patel 说。该团队还添加了数十个开源组件,包括 CNCF 项目,并为 Kubernetes、Terraform 和 kube2iam 做了贡献。

现在,诺德斯特龙技术部门有 60 多个开发团队在运行 Kubernetes,随着成功案例的涌现,越来越多的团队加入了进来。“我们最初的客户群,那些愿意尝试的人,现在正在向下一批用户宣传,”Patel 说。“一位早期的采用者拥有 Docker 容器,但不确定如何在生产环境中运行它。我们和他坐在一起,在 15 分钟内将其部署到生产环境中。他认为这太神奇了,他的组织中更多的人开始加入。”

对于诺德斯特龙技术部门而言,采用云原生极大地提高了开发和运营效率。使用 Kubernetes 的开发人员现在部署速度更快,并且可以专注于在其应用程序中构建价值。其中一个团队最初通过在云中启动虚拟机来完成 25 分钟的合并到部署。切换到 Kubernetes 使他们的流程加快了 5 倍,将他们的合并到部署时间缩短到 5 分钟。

速度是巨大的,并且很容易展示,但更大的影响可能在于运营效率。“我们在 AWS 上运行着数千台 VM,它们的总体平均 CPU 利用率约为 4%,”Patel 说。“使用 Kubernetes,即使不尝试优化我们的集群,我们目前的 CPU 利用率也达到了 40%——提高了 10 倍。我们正在运行 2600 多个客户 Pod,如果他们直接进入云端,这些 Pod 将会变成 2600 多个 VM。我们现在在 40 台 VM 上运行它们,因此运营开销大大减少了。”

诺德斯特龙技术部门还在探索在本地裸机上运行 Kubernetes。“如果我们可以在本地构建一个 Kubernetes 集群,”Patel 说,“我们可以将云的强大功能带到本地,以便快速配置资源。然后对于开发人员来说,他们的界面是 Kubernetes;他们甚至可能没有意识到或关心他们的服务现在部署在本地,因为他们只使用 Kubernetes。”

因此,Patel 正在密切关注 Kubernetes 的多集群功能开发。“通过集群联邦,我们可以将本地作为主集群,并将云作为辅助可突发集群,”他说。“因此,当有周年促销或黑色星期五促销,我们需要更多容器时,我们可以去云端。”

这种可能性以及 Grigoriu 和 Patel 的团队已经使用 Kubernetes 带来的影响,正是最初促使诺德斯特龙踏上云原生之旅的原因。“按照今天的零售环境,我们正在努力尽可能地建立响应性和灵活性,”Grigoriu 说。“Kubernetes 可以轻松地:为开发和运营双方带来效率。这是一个双赢的局面。”