Pod 横向自动扩缩


本页面简要介绍 Pod 横向自动扩缩并说明其在 Google Kubernetes Engine (GKE) 中的运作方式。您还可以了解如何在集群上配置和使用 Pod 横向自动扩缩

Pod 横向自动扩缩器根据工作负载的 CPU 或内存消耗情况,或者根据 Kubernetes 报告的自定义指标或来自集群外部来源的外部指标来自动增加或减少 Pod 的数量,从而改变 Kubernetes 工作负载的状况。

具有节点自动预配功能的 GKE 集群会根据 Pod 数量的变化自动扩缩集群中的节点数。因此,我们建议您对所有集群使用 Pod 横向自动扩缩。

为何使用 Pod 横向自动扩缩

您首次将工作负载部署到 Kubernetes 集群时,可能无法确定其资源要求,也无法确定这些要求可能会因为使用模式、外部依赖项或其他因素而发生怎样的变化。Pod 横向自动扩缩有助于确保您的工作负载在不同情况下始终正常运行,并且有助于您控制费用(您只需在需要时为额外容量付费即可)。

要想预测一些能够显示您的工作负载是存在资源不足问题还是存在利用不足问题的指标,并非易事。Pod 横向自动扩缩器可以根据以下类型的一个或多个指标来自动扩缩工作负载中的 Pod 数量:

  • 实际资源使用率:给定 Pod 的 CPU 或内存使用率超过阈值时。此值可以表示为原始值或 Pod 所请求相应资源数量的百分比。

  • 自定义指标:基于集群中 Kubernetes 对象报告的任何指标,例如客户端每秒请求次数或每秒 I/O 写入次数。

    如果您的应用容易出现网络(而不是 CPU 或内存)瓶颈,则此指标将非常有用。

  • 外部指标:基于集群外部应用或服务的指标。

    例如,从 Pub/Sub 等流水线提取大量请求时,您的工作负载可能需要更多 CPU。您可以为队列大小创建外部指标,并将横向 Pod 自动扩缩器配置为在队列大小达到给定阈值时自动增加 Pod 数量,并减少队列大小缩小时的 Pod。

您可以将 Pod 横向自动扩缩器与 Pod 纵向自动扩缩器结合使用,但有一些限制

Pod 横向自动扩缩的工作原理

每个已配置的横向 Pod 自动扩缩器对象均使用控制循环来运行。每个工作流都有一个单独的 Pod 横向自动扩缩器。每个 Pod 横向自动扩缩器会根据您配置的目标阈值定期检查给定工作负载的指标,并自动更改工作负载的形态。

每个 Pod 的资源

对于为每个 Pod 分配的资源(例如 CPU),控制器都会查询该 Pod 中运行的每个容器的资源指标 API。

  • 如果您为 CPU 或内存指定了原始值,则系统会使用该值。
  • 如果您为 CPU 或内存指定了百分比值,则横向 Pod 自动扩缩器会以该 Pod 的 CPU 或内存请求百分比的形式计算平均利用率值。
  • 自定义指标和外部指标会表示为原始值或平均值。

控制器会使用报告指标的平均值或原始值来生成比率,并使用该比率自动扩缩工作负载。您可以在 Kubernetes 项目文档中阅读有关横向 Pod 自动扩缩程序算法的说明。

对多个指标做出响应

如果您将工作负载配置为根据多个指标进行自动扩缩,Pod 横向自动扩缩器会分别评估每个指标,并使用扩缩算法根据每个指标确定新的工作负载规模。系统会为自动扩缩操作选择最大规模。

如果一个或多个指标因某种原因而不可用,则 Pod 横向自动扩缩器仍会根据计算的最大大小纵向扩容,但不会缩减

防止抖动

抖动指的是 Pod 横向自动扩缩器在工作负载完成对之前的自动扩缩操作的响应之前尝试执行后续自动扩缩操作的情况。为了防止抖动,Pod 横向自动扩缩器会根据最近五分钟的情况选择最大的建议。

限制

  • 不要在 CPU 或内存上一并使用 Pod 横向自动扩缩器和 Pod 纵向自动扩缩器。您可以将 Pod 横向自动扩缩器与 Pod 纵向自动扩缩器搭配使用以获取其他指标。
  • 如果您有 Deployment,请勿在支持 Pod 的 ReplicaSet 或副本控制器上配置 Pod 横向自动扩缩。在 Deployment 或副本控制器上执行滚动更新时,Deployment 或副本控制器会被新的副本控制器所替换。请改为在 Deployment 本身上配置 Pod 横向自动扩缩。
  • 您不能将 Pod 横向自动扩缩用于无法扩缩的工作负载,例如 DaemonSet。
  • 您不能将自定义指标或外部指标与 Pod 横向自动扩缩功能搭配使用来缩减到零个 Pod,然后再扩容。
  • Pod 横向自动扩缩会将指标作为 Kubernetes 资源公开,这会对指标名称施加限制,例如不允许使用大写字母或“/”字符。您的指标适配器可能允许重命名。例如,请参阅 prometheus-adapter as Operator

可伸缩性

Pod 横向自动扩缩器对支持的 HPA 对象数量没有硬性限制。但是,当 HPA 对象超过特定数量时,HPA 重新计算之间的时间段可能会超过标准的 15 秒。

  • GKE 次要版本 1.21 或更早版本:重新计算时间段应保持在 15 秒内,最多包含 100 个 HPA 对象
  • GKE 次要版本 1.22 或更高版本:重新计算时间段应保持在 15 秒内,最多包含 300 个 HPA 对象

以下因素也会影响性能:

  • 针对多个指标进行扩缩:每个指标都会添加一个用于推荐计算的提取调用,从而影响重新计算时间段。
  • 自定义指标堆栈的延迟时间:超过 50 毫秒的响应时间通常比标准 Kubernetes 指标观察到的时间长,这会影响重新计算时间段。

HorizontalPodAutoscaler 对象交互

在 Google Cloud 控制台的工作负载页面中,您可以为工作负载配置 Pod 横向自动扩缩器,并获取自动扩缩事件及其原因的相关信息。

每个 Pod 横向自动扩缩器以 HorizontalPodAutoscaler 对象的形式存在于集群中。您可以使用 kubectl get hpakubectl describe hpa HPA_NAME 等命令与这些对象交互。

您还可以使用 kubectl autoscale 命令创建 HorizontalPodAutoscaler 对象。

后续步骤