Kubernetes VPA

Kubernetes Vertical Pod Autoscaler (VPA) 是一种自动缩放器,可以根据历史资源使用情况对CPU memory 的 request 和 limit 调整。如果使用得当,可以帮助您在容器级别高效、自动地分配 Kubernetes 集群的资源。

从技术角度了解 VPA 的工作原理以及它的作用可以更好的利用这种机制

本文将介绍三种类型的自动扩缩容,然后详细探讨 VPA 的用法和优势,以便可以使用 Kubernetes VPA!

Kubernetes三种自动扩缩容机制

有三种类型的 K8s 自动扩缩容机制,每种都有不同的用途。它们是:

  • Horizontal Pod Autoscaler(HPA):调整应用程序的副本数。HPA 根据 CPU 利用率扩展复制控制器、部署、副本集或有状态集中的 Pod 数量。HPA 还可以配置为根据自定义或外部指标做出扩展决策。
  • Cluster Autoscaler (CA):调整集群中的节点数。当节点没有足够的资源来运行 Pod(添加节点)或节点仍未充分利用时,群集自动缩放程序会自动添加或删除群集中的节点,并且可以将其 Pod 分配给另一个节点(删除节点)。
  • Vertical Pod Autoscaler (VPA):调整集群中容器的资源请求和限制。

什么是 Kubernetes VPA?

Kubernetes Vertical Pod Autoscaler (VPA) 是在集群中安装的组件。它增加和减少容器 CPU 和内存资源配置,使集群资源分配与实际使用情况保持一致。

接下来,介绍一些重要的 VPA 概念。

Kubernetes VPA 资源配置类型

使用 VPA,我们可以在 Pod 的每个容器上管理两种不同类型的资源配置:

  • 请求Requests
  • 限制Limits

什么是请求?

请求定义容器所需的最小资源量。例如,应用程序可以使用超过 256MB 的内存,但如果其请求是 256MB 的内存,则 Kubernetes 将保证容器至少为 256MB。

什么是限制?

限制定义给定容器可以消耗的最大资源量。您的应用程序可能需要至少 256MB 的内存,但您可能希望确保它消耗的内存不超过 512MB,即将其内存消耗限制为 512MB

Kubernetes VPA vs. HPA

从根本上说,VPA 和 HPA 之间的区别在于它们的扩展方式。HPA 通过添加或删除 Pod 进行扩展,从而水平扩展容量。但是,VPA 通过增加或减少现有 Pod 容器中的 CPU 和内存资源进行扩展,从而垂直扩展容量。下表更详细地解释了 Kubernetes VPA 和 HPA 之间的差异。

需要调整容量 HPA VPA
需要扩容时 添加更多Pod 增加现有 Pod 容器的 CPU 或内存资源
需要缩容时 移除Pod 减少现有 Pod 容器的 CPU 或内存资源

参考下图了解 VPA 的工作原理:
Kubernetes VPA_第1张图片

VPA 的组件

VPA 部署有三个主要组件:VPA Recommender, VPA Updater, and VPA Admission Controller。

VPA Recommender:

  • 监视资源利用率并计算目标值。
  • 查看指标历史记录、OOM 事件和部署spec,并提出公平的请求。限制根据定义的限制-请求比例提高/降低。

VPA 更新程序:

  • 逐出那些需要新资源限制的 Pod。
  • 实现Recommender建议的内容(如果定义了“updateMode: Auto”)。

VPA 准入控制器:

  • 每当 VPA 更新程序逐出并重新启动容器时,都会在新容器启动之前更改 CPU 和内存设置(使用 Webhook)。
  • 如果 Pod 需要在垂直容器自动缩放程序将 updateMode 设置为“自动”时更改容器的资源请求,则逐出容器。由于 Kubernetes 的设计,修改正在运行的 Pod 的资源请求的唯一方法是重新创建 Pod。

Kubernetes VPA 如何工作?

下图提供了 Kubernetes VPA 如何工作的实际示例,并随后对每个步骤进行了编号说明。
Kubernetes VPA_第2张图片

  1. 用户配置 VPA。
  2. VPA Recommender从指标服务器读取 VPA 配置和资源利用率指标。
  3. VPA Recommender提供容器资源建议。
  4. VPA Updater程序会读取容器资源建议。
  5. VPA Updater程序启动容器终止。
  6. deployment意识到容器已终止,并将重新创建容器以匹配其副本配置。
  7. 当容器处于重新创建过程中时,VPA Admission Controller会获取容器资源建议。由于 Kubernetes 不支持动态更改正在运行的 Pod 的资源限制,因此 VPA 无法使用新的限制更新现有 Pod。它会终止使用过时限制的 Pod。当容器的控制器从 Kubernetes API 服务请求替换时,VPA Admission Controller会将更新的资源请求和限制值注入到新容器的spec中。
  8. 最后,VPA 准入控制器会覆盖对容器的建议。在我们的示例中,VPA 准入控制器向 Pod 添加了一个“250m”CPU。

Kubernetes VPA 的局限性

VPA 在许多应用程序中都很有用,但有几个重要的限制需要牢记。

  • 请勿将垂直容器自动缩放与水平容器自动缩放机制一起使用,后者根据相同的资源指标(如 CPU 和内存使用情况)进行缩放。这是因为当指标(CPU/内存)达到其定义的阈值时,VPA 和 HPA 将同时发生扩展事件,这可能会产生未知的副作用并可能导致问题。
  • VPA 可能会建议比集群中可用的资源更多,从而导致 Pod 未分配给节点(由于资源不足),因此永远不会运行。若要克服此限制,最好将 LimitRange 设置为最大可用资源。这将确保 Pod 请求的资源不会超过限制范围定义的资源。

总结

以下是本文关键要点的摘要:

  • Kubernetes 中有三种类型的自动缩放:Horizontal Pod Autoscaler, Cluster Autoscaler, and Vertical Pod Autoscaler
  • 三种自动扩缩容机制都是不同的,了解不同他们的工作原理将有助于更好地配置集群。
  • 在没有 VPA 的情况下使用 HPA 可能会通过复制未充分利用的 Pod 来满足不断增加的工作负载来积累浪费的资源。
  • 使用 VPA 时,请确保设置每个 Pod 的最大资源数,因为 VPA 建议可能会超过集群中的可用资源。

你可能感兴趣的:(K8s,kubernetes,docker,java)