本文永久链接: https://www.xtplayer.cn/kubernetes/autoscaling/

Kubernetes的核心是资源管理和编排工具。可以集中精力进行第一天的操作,以探索和试用其很酷的功能来部署,监视和控制 Pod。但是,您还需要考虑第二天的操作。您需要关注以下问题:

  • 我将如何扩展 Pod 和应用程序?
  • 如何保持容器健康运行并高效运行?
  • 随着代码和用户工作量的不断变化,我该如何应对这些变化?

我在这篇文章中提供了 Kubernetes 内部不同可伸缩性机制的高级概述,以及使它们满足您的需求的最佳方法。请记住,要真正掌握 Kubernetes,您需要掌握不同的方法来管理集群资源的规模,这是 Kubernetes 承诺的核心

配置 Kubernetes 集群以平衡资源和性能可能是一项挑战,并且需要具备 Kubernetes 内部运作的专业知识。仅仅因为您的应用程序或服务的工作负载不是恒定的,而是整天(甚至不是整小时)都会波动。将其视为一段旅程和一个持续的过程。

Kubernetes 自动扩展构建基块

有效的kubernetes自动缩放需要两层可缩放性之间的协调:(1)荚层自动缩放器,其中包括水平荚式自动缩放器(HPA)和垂直荚式自动缩放器(VPA);两者都可扩展容器的可用资源,以及(2)由集群自动缩放器(CA)管理的集群级别可扩展性;它可以按比例增加或减少群集内节点的数量。

Pod 水平自动缩放(HPA)

顾名思义,HPA 扩展了 Pod 副本的数量。大多数 DevOps 使用 CPU 和内存作为触发来扩展更多或更少的 Pod 副本。但是,您可以对其进行配置,以根据自定义指标多个指标甚至外部指标来扩展您的广告连播。

高级 HPA 工作流程

  1. HPA 连续检查您在设置过程中配置的指标值,默认间隔为 30 秒
  2. 如果达到 SPECIFIED 阈值,则 HPA 尝试增加 Pod 的数量
  3. HPA 主要更新部署或复制控制器内的副本数
  4. 然后,部署/复制控制器将推出任何其他所需的 Pod

推出 HPA 时请考虑以下几点:

  • HPA 的默认检查间隔为 30 秒。可以通过控制器管理器的“ horizontal-pod-autoscaler-sync-period”标志进行配置
  • 默认 HPA 相对指标公差为 10%
  • 在最后一次扩展事件发生后,HPA 等待 3 分钟,以使指标稳定下来。也可以通过 “horizontal-pod-autoscaler-upscale-delay” 标志进行配置
  • 从上一次缩减事件开始,HPA 等待 5 分钟,以避免自动缩放器跳动。可通过以下方式配置:horizontal-pod-autoscaler-downscale-delay 标志
  • HPA 与部署对象(而不是复制控制器)一起使用时效果最好。不适用于使用直接操作复制控制器的滚动更新。进行部署时,取决于部署对象来管理基础副本集的大小

立式豆荚自动定标器

垂直 Pod Autoscaler(VPA)为现有 Pod 分配更多(或更少)的 CPU 或内存。可以将其视为为豆荚提供一些生长激素,它可以用于有状态和无状态的豆荚,但是它主要是为有状态服务而构建的。但是,如果您想对最初分配给 Pod 的资源实施自动校正,则也可以将其用于无状态 Pod。VPA 还可以对 OOM(内存不足)事件做出反应。VPA 当前需要重新启动 Pod 才能更改分配的 CPU 和内存。VPA 重新启动 Pod 时,它会遵守Pod 的分配预算(PDB),以确保始终有最少数量的必要广告连播。您可以设置 VPA 可分配给任何吊舱的资源的最小值和最大值。例如,您可以将最大内存限制限制为不超过 8 GB。当您知道当前节点不能为每个容器分配超过 8 GB 的内存时,此功能特别有用。阅读VPA 的官方 Wiki 页面以获取详细的规格和设计。

VPA 还具有一个有趣的功能,称为 VPA 推荐器。它监视所有吊舱的历史资源使用情况和 OOM 事件,以建议“请求”资源规范的新值。推荐器通常使用一些智能算法根据历史指标来计算内存和 cpu 值。它还提供了一个使用 pod 描述符并提供建议资源请求的 API。

值得一提的是,VPA Recommender 在设置资源 “限制” 上不起作用。这可能会导致 Pod 垄断节点内部的资源。我建议您在命名空间级别设置一个 “限制” 值,以避免疯狂消耗内存或 CPU

高级 VPA 工作流程

  1. VPA 连续检查您在设置过程中配置的指标值,默认间隔为 10 秒
  2. 如果达到阈值,VPA 会尝试更改分配的内存和/或 CPU
  3. VPA 主要更新部署或复制控制器规范中的资源
  4. 重新启动 Pod 后,新资源将全部应用于创建的实例。

推出 VPA 时需要考虑以下几点:

  • 如果不重新启动 Pod,将无法更改资源。到目前为止,主要的合理性在于,这样的变化可能会导致很多不稳定。因此,考虑重新启动 Pod 并根据新分配的资源对其进行调度。
  • VPA 和 HPA 尚不兼容,不能在同一吊舱上使用。如果要在同一群集中同时使用它们,请确保在设置中分开它们的作用域。
  • VPA 仅根据观察到的过去和当前资源使用情况来调整容器的资源请求。它没有设置资源限制。对于行为不当的应用程序可能会出现问题,这些应用程序开始使用越来越多的资源导致 Pod 被 Kubernetes 杀死。
  • VPA 尚处于初期阶段。它将在接下来的几个月中发展,为此做好准备:)有关已知限制的详细信息,请参见此处和有关未来的工作

集群自动缩放器

群集自动缩放器(CA)根据挂起的 Pod 扩展群集节点。它会定期检查是否有任何暂挂的 Pod,并在需要更多资源以及扩展后的群集是否仍在用户提供的限制内的情况下增加群集的大小。CA 与云提供商接口以请求更多节点或取消分配空闲节点。它适用于 GCP,AWS 和 Azure。Kubernetes 1.8 发行了 1.0 版(GA)。

高级 CA 工作流程

  1. CA 以默认间隔 10 秒检查处于挂起状态的 Pod。
  2. 如果由于集群上没有足够的可用资源而无法在集群上分配一个或多个 Pod 处于挂起状态,则它将尝试设置一个或多个其他节点。
  3. 当云提供商授予该节点后,该节点将加入集群并准备为 Pod 服务。
  4. Kubernetes 调度程序将挂起的 Pod 分配给新节点。如果某些吊舱仍处于挂起状态,则将重复该过程并将更多节点添加到群集中。

*推出 CA 时请考虑这些因素

  • 群集自动缩放器可确保群集中的所有 Pod 都有运行的地方,无论是否有 CPU 负载。而且,它试图确保集群中没有不需要的节点。(来源)
  • CA 大约 30 秒钟即可实现可伸缩性需求。
  • 默认情况下,在不需要节点后,CA 会按比例等待 10 分钟,然后再按比例缩小。
  • CA 具有扩展器的概念。扩展器提供不同的策略来选择要添加新节点的节点组。
  • 负责任地使用“ cluster-autoscaler.kubernetes.io/safe-to-evict”:“true”。如果您在所有节点上设置了许多 Pod 或足够多的 Pod,则将失去很多伸缩的灵活性。
  • 使用PodDisruptionBudgets可以防止 Pod 被删除并最终导致应用程序的一部分完全无法运行。

Kubernetes 自动定标器如何相互作用

如果您想达到自动扩展 Kubernetes集群的必杀技,则需要在 CA 上使用 Pod 层自动扩展器。彼此之间的工作方式相对简单,如下图所示。

  1. HPA 或 VPA 更新分配给现有 Pod 的 Pod 副本或资源。
  2. 如果在伸缩性事件后没有足够的节点运行 Pod,则 CA 会接收到这样的事实,即部分或全部已缩放 Pod 处于挂起状态。
  3. CA 分配新节点
  4. 在已配置的节点上调度 Pod。

常见错误

我曾在不同的论坛上看到过,例如 Kubernetes 的松弛频道和 StackOverflow 问题,这是一些常见问题,这是由于许多 DevOps 在使用自动缩放器弄湿时会错过一些事实。

HPA 和 VPA 取决于指标和一些历史数据。如果您没有分配足够的资源,您的 Pod 将被 OOM 杀死,并且永远不会有机会生成指标。在这种情况下,您的规模可能永远不会发生。

扩大规模主要是对时间敏感的操作。您希望您的 Pod 和集群能够在用户遭受应用程序的任何中断或崩溃之前相当快地扩展。您应该考虑荚和集群扩展所需的平均时间。

最佳情况-4 分钟

  1. 30 秒—目标指标值已更新:30–60 秒
  2. 30 秒-HPA 检查指标值:30 秒->
  3. <2 秒-吊舱已创建并进入待处理状态-1 秒
  4. <2 秒内-CA 看到挂起的 Pod 并向配置节点发出呼叫-1 秒
  5. 3 分钟-云提供商配置节点和 K8 等待节点准备就绪:最多 10 分钟(取决于多种因素)

(合理)最坏的情况-12 分钟

  1. 60 秒-目标指标值已更新
  2. 30 秒— HPA 检查指标值
  3. <2 秒-窗格已创建并进入待处理状态
  4. 不到 2 秒-CA 看到挂起的 Pod 并向配置节点发出呼叫
  5. 10 分钟-云提供商配置节点,而 K8 等待节点准备就绪(取决于多个因素,例如提供商延迟,操作系统延迟,引导捆绑工具等)。

不要将云提供商的可伸缩性机制与 CA 混淆。CA 在您的群集中运行,而云提供商的可伸缩性机制(例如 AWS 内的 ASG)则根据节点分配进行工作。它不知道 Pod 或应用程序正在发生什么。一起使用它们会使您的群集不稳定并且难以预测行为。

TL; DR

  • Kubernetes 是一种资源管理和编排工具。第 2 天的操作来管理您的 Pod 和集群资源是掌握 Kubernetes 旅程中的关键里程碑。
  • 请牢记正确的思维模式,着重使用 HPA 和 VPA 调整 Pod 的可扩展性。
  • 如果您对吊舱和容器的需求有充分的了解,建议使用 CA。
  • 了解不同的自动缩放器如何协同工作将有助于您配置集群。
  • 确保您的 Pod 和群集放大或缩小需要多长时间,以应对最坏情况和最佳情况。