挑战
全球最大的纯在线杂货零售商 Ocado 开发了 Ocado 智能平台来管理其自身的运营,从网站到仓库,现在正在将该技术授权给其他零售商,如 Kroger。为了为该平台建立首批仓库,Ocado 从虚拟机和 Puppet 基础设施转向 Docker 容器,使用 CoreOS 的 fleet 调度器在其基于 OpenStack 的裸机私有云上配置所有服务。随着智能平台的增长和“fleet 走向生命周期结束”,平台工程师 Mike Bryant 说,“我们开始寻找一个更完整的平台,将所有这些不同的基础设施服务整合到一个统一的 API 中。”
解决方案
团队决定将 Ocado 私有云上的 fleet 迁移到 Kubernetes。当前的 Kubernetes 堆栈使用 kubeadm 进行引导,使用 CNI 和 Weave Net 进行网络,使用 Prometheus Operator 进行监控,使用 Fluentd 进行日志记录,以及使用 OpenTracing 进行分布式跟踪。Kubernetes 上的第一个应用程序,即仓库中的一项业务关键型服务,于 2017 年夏季投入生产,大规模迁移持续到 2018 年。现在,数百名在智能平台上工作的 Ocado 工程师正在 Kubernetes 上部署。
影响
Bryant 说,有了 Kubernetes,“从想法到实施再到部署的速度令人惊叹。”“我现在看到功能在一周内从开发到生产。在过去,新应用程序的部署可能轻易花费一个多月。”由于仓库中不再有限制性部署窗口,部署频率已从每周两次少到每周数十次。Ocado 还实现了成本节约,因为 Kubernetes 使团队能够进行更精细的资源分配。DevOps 团队负责人 Kevin McCormack 说:“我们对 Kubernetes 的资源分配/分离功能更有信心,因此我们已能够从大约 10 个 fleet 集群迁移到一个 Kubernetes 集群。”团队还使用 Prometheus 和 Grafana 来可视化资源分配,并将数据提供给开发人员。McCormack 说:“Prometheus 提供的可见性提高意味着开发人员更清楚他们正在使用什么以及他们的使用如何影响他人,特别是现在我们拥有一个共享集群。”“我估计在我们的测试环境中,我们在 Kubernetes 中托管相同的应用程序使用的硬件资源减少了大约 15-25%。”
该公司开始开发其 Ocado 智能平台来管理其自身的运营,从网站到仓库,现在正在将该技术授权给世界各地的其他杂货连锁店,如 Kroger。为了为该平台建立首批仓库,Ocado 从虚拟机和 Puppet 基础设施转向 Docker 容器,使用 CoreOS 的 fleet 调度器在其基于 OpenStack 的裸机私有云上配置所有服务。随着智能平台的增长和“fleet 走向生命周期结束”,平台工程师 Mike Bryant 说,“我们开始寻找一个更完整的平台,将所有这些不同的基础设施服务整合到一个统一的 API 中。”
Bryant 之前一直在 Code for Life(Ocado 慈善机构的一部分儿童教育项目)中使用 Kubernetes。“我们真的很喜欢它,所以我们开始认真考虑将其用于我们的生产工作负载,”Bryant 说。管理 fleet 的团队已经研究了编排解决方案,并最终选择了 Kubernetes。“我们正在寻找一个被广泛采用的平台,那里的发展势头很好,”DevOps 团队负责人 Kevin McCormack 说。两条路径汇合了,Bryant 说:“我们甚至没有经历任何概念验证阶段。Code for Life 的工作起到了这个作用。”
2016 年夏季,团队开始将 Ocado 私有云上的 fleet 迁移到 Kubernetes。当前的 Kubernetes 堆栈使用 kubeadm 进行引导,使用 CNI 和 Weave Net 进行网络,使用 Prometheus Operator 进行监控,使用 Fluentd 进行日志记录,以及使用 OpenTracing 进行分布式跟踪。
Kubernetes 上的第一个应用程序,即仓库中的一项业务关键型服务,于一年后投入生产。一旦该应用程序顺利运行,大规模迁移持续到 2018 年。现在,数百名在智能平台上工作的 Ocado 工程师正在 Kubernetes 上部署,该平台已在 Ocado 的仓库中上线,每周管理数万份订单。在满负荷运行时,Ocado 位于伦敦东南部埃里思的最新仓库每周将交付超过 20 万份订单,使其成为世界上最大的在线杂货设施。
大约有 150 个微服务现在正在 Kubernetes 上运行,其中许多有多个实例。Bryant 说:“我们不仅仅是一次性部署所有这些微服务。我们是为一个仓库部署所有这些微服务,然后为下一个仓库再次部署它们,一次又一次。”
向 Kubernetes 的迁移对 Ocado Technology 的许多人来说都是一次开眼界。Bryant 回忆说:“在最初将平台部署到我们的测试基础设施中时,技术架构师询问开启加密的 Weave Net 的网络性能如何。”“所以我们找到了一个用于 iPerf 的 Docker 容器,编写了一个守护程序集,并将其部署。片刻之后,我们就在这个集群中部署了整个东西。他对此感到非常震惊。”
事实上,影响是深远的。Bryant 说:“在容器化之前,我们的仓库有相当严格的部署窗口。”“转向微服务后,我们能够更频繁地部署。我们已经能够在多个领域朝着持续交付迈进。在我们的旧仓库中,新应用程序的部署涉及与不同团队就堆栈的不同层面进行沟通:从虚拟机配置,到存储,到负载均衡器等等。Kubernetes 统一的 API 意味着所有这些都在一个地方,并且是一个审批和发布流程。我现在看到功能在一周内从开发到生产。在过去,新应用程序的部署可能轻易花费一个多月。”
部署频率已从每周两次少到每周数十次。Bryant 说:“有了 Kubernetes,我们的一些开发团队已经能够在我们不知情的情况下将他们的应用程序部署到新平台,这意味着他们可以更快地完成他们需要做的事情,而我们的工作量也更少。”
Ocado 还实现了成本节约,因为 Kubernetes 使团队能够进行更细粒度的资源分配。Bryant 说:“这让我们能够将许多部署从按核心虚拟机部署缩小到只有核心的一小部分。”McCormack 补充说:“我们对 Kubernetes 的资源分配/分离功能更有信心,因此我们已能够从大约 10 个 fleet 集群迁移到一个 Kubernetes 集群。这意味着我们更好地利用了硬件,因为如果我们在节点故障时必须始终保持两个节点的额外容量可用,那么我们只需要额外的两个而不是 20 个。”
团队还使用 Prometheus 和 Grafana 来可视化资源分配,并将数据提供给开发人员。McCormack 说:“Prometheus 提供的可见性提高意味着开发人员更清楚他们正在使用什么以及他们的使用如何影响他人,特别是现在我们拥有一个共享集群。”“我估计在我们的测试环境中,我们在 Kubernetes 中托管相同的应用程序使用的硬件资源减少了大约 15-25%。”
Bryant 说,云原生更广泛的好处之一是统一的 API。“我们有一种部署方法,可以涵盖我们需要做的各种事情,并且我们可以扩展 API,”他说。除了使用 Prometheus Operator,Ocado 团队已经开始编写自己的 Operator,其中一些已经开源。此外,“CNCF 为我们提供了这些不同技术的支持。我们能够以非常简单的方式采用这些技术。我们确实喜欢 CNCF 是供应商中立的。我们没有被要求承诺这种单一的做事方式。CNCF 中观点的巨大多样性带来了更好的技术。”
Ocado 自己的技术,以其智能平台的形式,很快将在世界各地使用。云原生在全球扩张中发挥着关键作用。Bryant 说:“如果没有 Kubernetes,我不会想尝试这样做。Kubernetes 让它变得好得多,尤其是拥有这种一致的部署所有应用程序的方式,然后能够复制相同的东西。这非常有价值。”