使用机器学习来实现Kubernetes优化的自动化

123 阅读11分钟

使用机器学习来自动优化Kubernetes

本文解释了如何利用机器学习来有效管理Kubernetes资源。

注:这是涵盖Kubernetes资源管理和优化的系列文章的第三篇。在这篇文章中,我们解释了如何利用机器学习来有效管理Kubernetes资源。之前的文章解释了 Kubernetes资源类型 请求和限制.

随着Kubernetes成为应用容器编排的事实标准,它也提出了关于优化策略和最佳实践的重要问题。组织采用Kubernetes的原因之一是提高效率,甚至在扩大和缩小规模以适应不断变化的工作负载时也是如此;然而,使Kubernetes如此灵活的细粒度控制也使其在有效调整和优化方面具有挑战性。

在这篇文章中,我们将解释如何利用机器学习来自动调整这些资源,并确保为可变的工作负载进行有效的扩展。

优化的复杂性

为Kubernetes优化应用程序,主要是确保代码尽可能有效地使用其基础资源--即CPU和内存。这意味着要确保以最低的成本和最小的努力达到或超过服务级目标的性能。

在创建集群时,我们可以在容器层面上配置两个主要资源的使用--内存和CPU。也就是说,我们可以设置限制,以确定我们的应用程序可以使用和请求多少这些资源。我们可以把这些资源设置看作是我们的输入变量,以及运行我们应用程序的性能、可靠性和资源使用(或成本)方面的输出。随着容器数量的增加,变量的数量也在增加,随之而来的是集群管理和系统优化的整体复杂性成倍增加。

图1:我们可以把Kubernetes配置看作一个方程式,资源设置是我们的变量,成本、性能和可靠性是我们的结果。

为了使问题进一步复杂化,不同的资源参数是相互依赖的。改变一个参数可能会对集群的性能和效率产生意想不到的影响。这意味着,除非你有无限的时间和Kubernetes专家,否则手动确定最佳性能的精确配置是一项不可能的任务。

如果我们不在容器部署期间为资源设置自定义值,Kubernetes会自动分配这些值。这里的挑战是,Kubernetes对其资源相当慷慨,以防止两种情况:由于内存不足(OOM)错误导致的服务失败和由于CPU节流导致的不合理的缓慢性能。然而,使用默认配置来创建一个基于云的集群将导致不合理的高云成本,而不能保证足够的性能。

当我们试图为几个集群管理多个参数时,这一切变得更加复杂。对于优化一个环境的价值指标,机器学习系统可以是一个不可或缺的补充。

机器学习的优化方法

基于机器学习的优化一般有两种方法,每一种都以不同的方式提供价值。首先,基于实验的优化可以在非生产环境中进行,使用各种场景来模拟可能的生产场景。第二,基于观察的优化可以通过观察实际的系统行为在生产或非生产中进行。接下来将介绍这两种方法。

基于实验的优化

通过实验进行优化是一种强大的、基于科学的方法,因为我们可以尝试任何可能的方案,测量结果,调整我们的变量并再次尝试。由于实验是在非生产环境中进行的,我们只受限于我们所能想象的情景以及进行这些实验所需的时间和精力。如果实验是手动完成的,所需的时间和精力可能是不堪重负的。这就是机器学习和自动化发挥作用的地方。

让我们探讨一下基于实验的优化在实践中是如何运作的。

第1步:确定变量

为了建立一个实验,我们必须首先确定哪些变量(也称为参数)可以被调整。这些通常是CPU和内存请求和限制,复制,以及应用程序特定的参数,如JVM堆大小和垃圾收集设置。

一些ML优化解决方案可以扫描你的集群,自动识别可配置的参数。这个扫描过程也会捕捉到集群的当前,或基线,作为我们实验的起点。

第2步:设置优化目标

接下来,你必须指定你的目标。换句话说,你想使哪些指标最小化或最大化?一般来说,目标将由代表权衡的多个指标组成,如性能与成本。例如,你可能想在最小化资源成本的同时最大化吞吐量。

一些优化解决方案将允许你对每个优化目标应用加权,因为在某些情况下,性能可能比成本更重要,反之亦然。此外,你可能想为每个目标指定界限。例如,你可能不希望考虑任何导致性能低于特定阈值的方案。提供这些护栏将有助于提高实验过程的速度和效率。

以下是为你的优化目标选择正确指标的一些考虑:

  • 如果一个容器化的应用是基于事务的,要尽量减少响应时间和错误率。在这种情况下,最大的速度是最理想的,而资源的使用则不太令人关注。
  • 如果应用程序只是为了计算,那么就尽量减少错误率。我们要为性能效率进行优化。
  • 如果应用程序处理数据,速度可能是次要的。对成本进行优化。

当然,这些仅仅是几个例子。确定优先考虑的适当指标需要开发人员和负责业务运营的人之间的沟通。确定组织的主要目标。然后研究技术如何实现这些目标,以及实现这些目标需要什么。最后,建立一个计划,强调最能适应成本和功能平衡的指标。

第3步:建立优化方案

通过基于实验的方法,我们需要建立要优化的场景,并将这些场景建立在一个负载测试中。这可能是一个预期的用户流量范围,或者是一个特定的场景,如基于零售假日的流量激增。这个性能测试将在实验过程中被用来模拟生产负荷。

第4步:运行实验

一旦我们用优化目标和可调整参数设置了我们的实验,我们就可以启动实验了。一个实验由多个试验组成,你的优化方案在每个试验中都会通过以下步骤进行迭代。

  1. 实验控制器使用第一次试验的基线参数在你的集群中运行容器化应用程序。
  2. 然后控制器运行之前创建的性能测试,为我们的优化方案向系统施加负载。
  3. 控制器捕获与我们的目标相对应的指标,例如,持续时间和资源成本。
  4. 机器学习算法分析结果,然后为下一次试验计算一组新的参数。
  5. 这个过程然后重复进行,无论在配置实验时指定多少次试验。典型的实验范围是20到200次试验,更多的参数需要更多的试验来获得明确的结果。

机器学习引擎使用每个试验的结果来建立一个代表多维参数空间的模型。在这个空间里,它可以检查参数之间的关系。随着每一次迭代,ML引擎更接近于确定优化目标指标的配置。

第5步:分析结果

虽然机器学习会自动推荐能产生最佳结果的配置,但一旦实验完成,还可以进行额外的分析。例如,你可以将两个不同目标之间的权衡可视化,看看哪些参数对结果有重大影响,哪些参数不太重要。

结果往往是令人惊讶的,并且可以导致关键的架构改进:例如,确定更多数量的小副本比更少数量的 "重 "副本更有效。

图2:实验结果可以被可视化和分析,以充分了解 系统 *行为。
*

基于观察的优化

虽然基于实验的优化对于分析广泛的场景来说是很强大的,但不可能预测到每一种可能的情况。此外,高度可变的用户流量意味着在某个时间点上的最佳配置可能不会随着情况的变化而成为最佳配置。Kubernetes自动扩展器可以提供帮助,但它们是基于历史使用情况的,未能考虑到应用性能。

这就是基于观察的优化可以帮助的地方。让我们看看它是如何工作的。

第1步:配置应用程序

根据你所使用的优化解决方案,为基于观察的优化配置一个应用程序可能包括以下步骤:

  • 指定命名空间和可选的标签选择器,以确定要调整哪些资源。
  • 为要调整的CPU和内存参数指定保护线(最小和最大)。
  • 指定系统应该多长时间推荐一次更新的参数设置。
  • 指定是自动部署建议还是经批准后部署。

第二步:机器学习分析

一旦配置好,机器学习引擎就开始分析从PrometheusDatadog或其他可观察性工具收集的可观察性数据,以了解实际的资源使用情况和应用性能趋势。然后,系统开始按照配置时指定的时间间隔提出建议。

第3步:部署建议

如果你在配置过程中指定了自动实施建议,那么优化解决方案将在推荐的配置中自动修补部署。如果您选择手动部署,您可以在决定是否批准之前查看建议,包括容器级别的细节。

最佳实践

正如你可能已经注意到的,基于观察的优化比基于实验的方法更简单。它以更少的努力更快地提供价值,但另一方面,基于实验的优化更强大,可以提供深入的应用洞察力,这是基于观察的方法所无法做到的。

使用哪种方法不应该是一个非此即彼的决定:两种方法都有自己的位置,并且可以一起工作,缩小生产和非生产之间的差距。这里有一些需要考虑的准则。

  • 因为基于观察的优化很容易实施,而且可以很快看到改进,所以应该在你的环境中广泛部署。
  • 对于更复杂或关键的应用,将受益于更深层次的分析,使用基于实验的优化来补充基于观察的优化。
  • 基于观察的优化也可以用来识别那些需要基于实验的优化提供更深入分析的场景。
  • 然后,使用基于观察的方法,在生产环境的良性循环优化中,不断验证和完善基于实验的实施。

图3:同时使用基于实验和基于观察的方法创造了一个系统的、持续的良性循环。 良性循环的系统、持续优化。

总结

优化我们的Kubernetes环境,使其效率最大化(性能与成本的关系),智能扩展,并实现我们的业务目标,需要:

  1. 在部署前对我们的应用和环境参数进行理想的配置
  2. 部署后的持续监控和调整

对于小型环境来说,这项任务是很艰巨的。对于在Kubernetes上大规模运行应用程序的组织来说,这很可能已经超出了人工劳动的范围。幸运的是,机器学习可以弥补自动化差距,为优化Kubernetes环境的各个层面提供强大的洞察力。