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