Azure Kubernetes 服务中的群集自动缩放概述

若要满足 Azure Kubernetes 服务 (AKS) 中的应用程序需求,可能需要调整运行工作负载的节点数。 群集自动缩放程序组件可监视群集中由于资源约束而无法进行计划的 Pod。 当群集自动缩放程序检测到问题时,它会纵向扩展节点池中的节点数来满足应用程序需求。 它还会定期检查节点是否缺少正在运行的 Pod,并根据需要纵向缩减节点数。

本文介绍群集自动缩放程序在 AKS 中的工作原理。 此外,还提供了为 AKS 工作负载配置群集自动缩放程序时的指导、最佳做法和注意事项。 若要为 AKS 工作负载启用、禁用或更新群集自动缩放程序,请参阅在 AKS 中使用群集自动缩放程序

关于群集自动缩放程序

群集通常需要一种自动缩放方式以适应不断变化的应用程序需求(例如,工作日与夜间或周末之间)。 可以通过以下方式缩放 AKS 群集:

  • 群集自动缩放程序会定期检查由于资源约束而无法在节点上计划的 Pod。 群集随后会自动增加节点数。 使用群集自动缩放程序时,会禁用手动缩放。 有关详细信息,请参阅纵向扩展的工作原理
  • 水平 Pod 自动缩放程序会在 Kubernetes 群集中使用指标服务器来监视 Pod 的资源需求。 如果应用程序需要更多资源,则会自动增加 Pod 数以满足需求。

显示群集自动缩放程序和水平 Pod 自动缩放程序通常如何协同工作以支持所需的应用程序需求的屏幕截图。

通常的做法是为节点启用群集自动缩放程序,为 Pod 启用水平 Pod 自动缩放程序。 启用群集自动缩放程序后,当节点池大小低于最小值或高于最大值时,将会应用指定的缩放规则。 群集自动缩放程序会等待生效,直到节点池中需要新节点或可从当前节点池中安全删除某个节点为止。 有关详细信息,请参阅纵向缩减的工作原理

最佳做法和注意事项

  • 使用群集自动缩放程序实现可用性区域时,建议为每个区域使用一个节点池。 可以将 --balance-similar-node-groups 参数设置为 True,在纵向扩展操作期间为工作负载保持区域间的节点均衡分布。 如果不这样做,纵向缩减操作可能会破坏区域间的节点平衡。
  • 对于具有超过 400 个节点的群集,建议使用 Azure CNI 或 Azure CNI Overlay
  • 若要在现成虚拟机和固定节点池上同时有效运行工作负载,请考虑使用优先级扩展器。 此方法允许你根据节点池的优先级计划 Pod。
  • 在 Pod 上分配 CPU/内存请求时,请谨慎行事。 群集自动缩放程序将根据挂起的 Pod(而不是节点上的 CPU/内存压力)纵向扩展。
  • 对于同时托管长时间运行的工作负载(例如 Web 应用)和短期/突发作业工作负载的群集,建议使用相关性规则/扩展器或使用 PriorityClass 将它们分成不同的节点池,以帮助防止不必要的节点耗尽或纵向缩减操作
  • 在已启用自动缩放程序的节点池中,删除工作负载以纵向缩减节点,而不是手动减少节点计数。 如果节点池已达到最大容量,或者节点上正在运行活动工作负载,这可能会出现问题,可能会导致群集自动缩放程序出现意外行为
  • 如果 Pod 的 PriorityClass 值低于 -10,则节点不会纵向扩展。 优先级 -10 保留给超量预配 Pod。 有关详细信息,请参阅将群集自动缩放程序与 Pod 优先级和抢占结合使用
  • 请勿将其他节点自动缩放机制(例如虚拟机规模集自动缩放程序)与群集自动缩放程序结合使用
  • 如果无法移动 Pod,则群集自动缩放程序可能无法纵向缩减,如以下情况
    • 不受控制器对象支持的直接创建的 Pod,如部署或副本集。
    • Pod 中断预算 (PDB) 限制太多,不允许 Pod 数低于特定阈值。
    • Pod 使用在不同节点上进行计划时无法遵循的节点选择器或反相关性。 有关详细信息,请参阅哪些类型的 Pod 可防止群集自动缩放程序移除节点?

重要

不要对自动缩放节点池中的单个节点进行更改。 同一节点组中的所有节点应具有统一的容量、标签、污点和运行的系统 Pod。

群集自动缩放程序配置文件

群集自动缩放程序配置文件是一组控制群集自动缩放程序行为的参数。 可以在创建群集或更新现有群集时配置群集自动缩放程序配置文件。

优化群集自动缩放程序配置文件

应根据特定的工作负载场景微调群集自动缩放程序配置文件设置,同时还要考虑性能和成本之间的权衡。 本部分提供了演示这些权衡的示例。

请务必注意,群集自动缩放程序配置文件设置是群集范围的,并应用于所有启用自动缩放的节点池。 在一个节点池中执行的任何缩放操作都可能会影响其他节点池的自动缩放行为,这可能会导致意外结果。 务必在所有相关节点池中应用一致且同步的配置文件配置,以确保获得所需的结果。

示例 1:优化性能

对于处理大量突发工作负载且主要关注性能的群集,建议增加 scan-interval 并减少 scale-down-utilization-threshold。 这些设置有助于将多个缩放操作批处理到单个调用中,从而优化缩放时间和计算读取/写入配额的利用率。 它还有助于缓解未充分利用的节点上快速纵向缩减操作的风险,从而提高 Pod 计划效率。 同时增加ok-total-unready-countmax-total-unready-percentage

对于具有 daemonset Pod 的群集,建议将 ignore-daemonset-utilization 设置为 true,这可以有效地忽略 daemonset Pod 的节点利用率,并最大程度地减少不必要的纵向缩减操作。 请参阅突发工作负载的配置文件

示例 2:优化成本

如果需要成本优化的配置文件,建议设置以下参数配置:

  • 减少 scale-down-unneeded-time,即节点有资格进行纵向缩减之前闲置的时间。
  • 减少 scale-down-delay-after-add,即添加节点后在考虑纵向缩减节点之前等待的时间。
  • 增加 scale-down-utilization-threshold,即删除节点的利用率阈值。
  • 增加 max-empty-bulk-delete,即可以在单个调用中删除的最大节点数。
  • skip-nodes-with-local-storage设置为 false。
  • 增加ok-total-unready-countmax-total-unready-percentage

常见问题和缓解建议

通过CLI 或门户查看缩放失败和纵向扩展未触发的事件。

不触发纵向扩展操作

常见原因 缓解建议
PersistentVolume 节点相关性冲突,当群集自动缩放程序用于多个可用性区域时,或者当 Pod 或永久性卷的区域与节点的区域不同时,可能会出现这种情况。 为每个可用性区域使用一个节点池并启用 --balance-similar-node-groups。 还可以将 volumeBindingMode 字段设置为 Pod 规范中的 WaitForFirstConsumer,以防止卷绑定到节点,直到创建使用该卷的 Pod。
排斥和容许/节点相关性冲突 评估分配给节点的排斥,并查看 Pod 中定义的容许。 如有必要,请调整排斥和容许,以确保可以在节点上有效地计划 Pod。

纵向扩展操作失败

常见原因 缓解建议
子网中的 IP 地址耗尽 在同一虚拟网络中添加另一个子网,并将另一个节点池添加到新子网中。
核心配额耗尽 批准的核心配额已耗尽。 当群集自动缩放程序经历多次失败的纵向扩展尝试时,会在特定节点组内进入指数退避状态
节点池的最大大小 增加节点池中的最大节点数或创建新的节点池。
请求/调用超出速率限制 请参阅“429 请求过多”错误

纵向缩减操作失败

常见原因 缓解建议
Pod 阻止节点耗尽/无法逐出 Pod • 查看哪些类型的 Pod 可能会阻止纵向缩减
• 对于使用本地存储(例如 hostPath 和 emptyDir)的 Pod,请将群集自动缩放程序配置文件标志 skip-nodes-with-local-storage 设置为 false
• 在 Pod 规范中,将 cluster-autoscaler.kubernetes.io/safe-to-evict 注释设置为 true
• 检查 PDB,因为它可能存在限制。
节点池的最小大小 减小节点池的最小大小。
请求/调用超出速率限制 请参阅“429 请求过多”错误
写入操作被锁定 请勿对完全托管的 AKS 资源组进行任何更改(请参阅 AKS 支持策略)。 删除或重置之前应用于资源组的任何资源锁

其他问题

常见原因 缓解建议
PriorityConfigMapNotMatchedGroup 务必将需要自动缩放的所有节点组添加到扩展器配置文件中。

节点池回退

版本 0.6.2 中引入了节点池回退,它将导致群集自动缩放程序在发生故障后回退节点池的缩放。

根据缩放操作遇到故障的时间长短,可能需要最长 30 分钟的时间才能再次尝试。 可以通过禁用然后再重新启用自动缩放来重置节点池的回退状态。