本文永久链接: 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和群集放大或缩小需要多长时间,以应对最坏情况和最佳情况。