当前位置:首页 > 最新资讯 > 行业资讯

使用机器学习自动优化Kubernetes

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

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

优化的复杂性

为Kubernetes优化应用程序主要是确保代码尽可能高效地使用其底层资源(即CPU和内存)。这意味着以尽可能低的成本和最小的努力确保满足或超过服务级别目标的性能。

创建集群时,我们可以在容器级别配置两种主要资源的使用——内存和CPU。也就是说,我们可以设置应用程序可以使用和请求多少资源的限制。我们可以将这些资源设置视为我们的输入变量,以及运行应用程序的性能、可靠性和资源使用(或成本)方面的输出。随着容器数量的增加,变量的数量也在增加,集群管理和系统优化的整体复杂度呈指数级增长。

我们可以将Kubernetes配置视为一个方程式,其中资源设置是我们的变量,成本、性能和可靠性是我们的结果。

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

更复杂的是,不同的资源参数是相互依赖的。更改一个参数可能会对集群性能和效率产生意想不到的影响。这意味着手动确定最佳性能的精确配置是一项不可能完成的任务,除非您有无限的时间和Kubernetes专家。

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

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

机器学习优化方法

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

基于实验的优化

通过实验进行优化是一种强大的、基于科学的方法,因为我们可以尝试任何可能的场景,衡量结果,调整我们的变量,然后再试一次。由于实验是在非生产环境中进行的,因此我们只受到我们可以想象的场景以及执行这些实验所需的时间和精力的限制。如果实验是手动完成的,所需的时间和精力可能会很大。这就是机器学习和自动化的用武之地。

让我们探索基于实验的优化在实践中是如何工作的。

第1步:识别变量

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

一些ML优化解决方案可以扫描您的集群以自动识别可配置参数。此扫描过程还捕获集群的当前值或基线值,作为我们实验的起点。

第2步:设定优化目标

接下来,您必须指定您的目标。换句话说,您试图最小化或最大化哪些指标?一般而言,目标将由代表权衡的多个指标组成,例如性能与成本。例如,您可能希望最大限度地提高吞吐量,同时最大限度地降低资源成本。

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

以下是为优化目标选择正确指标的一些注意事项:

如果容器化应用程序是基于事务的,请尽量减少响应时间和错误率。在这种情况下,最大速度是理想的,资源使用问题不大。

如果应用程序仅用于计算,请将错误率降至最低。我们希望优化性能效率。

如果应用程序处理数据,速度可能是次要的。优化成本。

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

第3步:建立优化方案

使用基于实验的方法,我们需要建立场景以优化并将这些场景构建到负载测试中。这可能是一系列预期的用户流量或特定场景,例如基于零售假期的流量高峰。此性能测试将在实验过程中用于模拟生产负载。

第4步:运行实验

一旦我们设置了优化目标和可调参数的实验,我们就可以开始实验了。一个实验由多个试验组成,您的优化解决方案在每个试验中迭代以下步骤:

实验控制器使用第一次试验的基线参数在您的集群中运行容器化应用程序。

然后控制器运行之前创建的性能测试,为我们的优化方案应用负​​载到系统。

控制器捕获与我们的目标相对应的指标,例如持续时间和资源成本。

机器学习算法分析结果,然后为下一次试验计算一组新参数。

然后重复此过程,但在配置实验时指定了许多试验。典型的实验范围从20到200次试验,更多的参数需要更多的试验才能获得明确的结果。

机器学习引擎使用每次试验的结果来构建表示多维参数空间的模型。在这个空间中,它可以检查彼此相关的参数。随着每次迭代,ML引擎更接近于识别优化目标指标的配置。

第5步:分析结果

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

结果通常令人惊讶,并可能导致关键的架构改进:例如,确定大量较小的副本比较少数量的“较重”副本更有效。

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

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

基于观察的优化

虽然基于实验的优化对于分析广泛的场景非常强大,但不可能预测每一种可能的情况。此外,高度可变的用户流量意味着某个时间点的最佳配置可能不会随着事情的变化而变得最佳。Kubernetes自动扩缩器可以提供帮助,但它们基于历史使用情况,没有考虑应用程序性能。

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

第1步:配置应用程序

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

指定命名空间和可选的标签选择器,以识别要调整的资源。

为要调整的CPU和内存参数指定护栏(最小值和最大值)。

指定系统建议更新参数设置的频率。

指定是自动部署建议还是经批准部署。

第2步:机器学习分析

配置完成后,机器学习引擎开始分析从Prometheus、Datadog或其他可观察性工具收集的可观察性数据,以了解实际资源使用情况和应用程序性能趋势。然后系统开始在配置期间指定的时间间隔提出建议。

第3步:部署建议

如果您在配置期间指定自动实施建议,则优化解决方案将根据推荐的配置自动修补部署。如果您选择手动部署,您可以在决定是否批准之前查看建议,包括容器级别的详细信息。

最佳实践

您可能已经注意到,基于观察的优化比基于实验的方法更简单。它以更少的努力更快地提供价值,但另一方面,基于实验的优化更强大,并且可以提供使用基于观察的方法无法实现的深入的应用程序洞察力。

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

由于基于观察的优化易于实施并且可以快速看到改进,因此应该在您的环境中广泛部署。

对于将受益于更深层次的分析的更复杂或关键的应用程序,使用基于实验的优化来补充基于观察的优化。

基于观察的优化也可用于识别需要由基于实验的优化提供的更深入分析的场景。

然后,使用基于观察的方法在生产环境中的优化良性循环中不断验证和改进基于实验的实现。

同时使用基于实验和基于观察的方法可以创建系统、持续优化的良性循环。

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

结论

优化我们的Kubernetes环境以最大限度地提高效率(性能与成本)、智能扩展并实现我们的业务目标需要:

在部署之前对我们的应用程序和环境参数进行理想配置

部署后持续监控和调整

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

猜你喜欢