第 5 章 将自动扩展应用到 OpenShift Container Platform 集群

在 OpenShift Container Platform 集群中应用自动扩展功能涉及到部署 ClusterAutoscaler,然后为集群中每种 Machine 类型部署 MachineAutoscaler。

重要

您只能在机器 API 正常工作的集群中配置 ClusterAutoscaler。

5.1. 关于 ClusterAutoscaler

ClusterAutoscaler 会调整 OpenShift Container Platform 集群的大小,以满足其当前的部署需求。它使用 Kubernetes 样式的声明性参数来提供基础架构管理,而且这种管理不依赖于特定云提供商的对象。ClusterAutoscaler 会在集群范围内有效,不与特定的命名空间相关联。

当由于资源不足而无法在任何当前节点上调度 Pod 时,或者在需要另一个节点来满足部署需求时,ClusterAutoscaler 会增加集群的大小。ClusterAutoscaler 不会将集群资源增加到超过您指定的限制。

重要

确保您所创建的 ClusterAutoscaler 定义中的 maxNodesTotal 值足够大,足以满足计算集群中可能的机器总数。此值必须包含 control plane 机器的数量以及可扩展至的机器数量。

如果相当长的一段时间内都不需要某些节点,例如集群资源使用率较低并且所有重要 Pod 都可以安置在其他节点上时,ClusterAutoscaler 会减小集群的大小。

如果节点上存在以下类型的 Pod,ClusterAutoscaler 不会删除该节点:

  • 具有限制性 PodDisruptionBudget (PDB) 的 Pod。
  • 在默认情况下,Kube 系统 Pod 不在节点上运行。
  • 没有 PDB 或 PDB 限制性太强的 Kube 系统 Pod。
  • 不受控制器对象(如 Deployment、ReplicaSet 或 StatefulSet)支持的 Pod。
  • 具有本地存储的 Pod。
  • 因为缺乏资源、节点选择器或关联性不兼容或有匹配的反关联性等原因而无法移至其他位置的 Pod。
  • 具有 "cluster-autoscaler.kubernetes.io/safe-to-evict": "false" 注解的 Pod,除非同时也具有 "cluster-autoscaler.kubernetes.io/safe-to-evict": "true” 注解。

在配置 ClusterAutoscaler 时,还会有其他的使用限制:

  • 不要直接修改位于自动扩展节点组中的节点。同一节点组中的所有节点具有相同的容量和标签,并且运行相同的系统 Pod。
  • 指定适合您的 Pod 的请求。
  • 如果需要防止 Pod 被过快删除,请配置适当的 PDB。
  • 确认您的云提供商配额足够大,能够支持您配置的最大节点池。
  • 不要运行其他节点组自动扩展器,特别是云提供商提供的自动扩展器。

Horizontal Pod Autoscaler (HPA) 和 ClusterAutoscaler 以不同的方式修改集群资源。HPA 根据当前的 CPU 负载更改部署或 ReplicaSet 的副本数。如果负载增加,HPA 会创建新的副本,不论集群可用的资源量如何。如果没有足够的资源,ClusterAutoscaler 会添加资源,使 HPA 创建的 Pod 可以运行。如果负载减少,HPA 会停止一些副本。如果此操作导致某些节点利用率低下或完全为空,ClusterAutoscaler 会删除不必要的节点。

ClusterAutoscaler 会考虑 Pod 优先级。如果集群没有足够的资源,则“Pod 优先级和抢占”功能可根据优先级调度 Pod,但 ClusterAutoscaler 会确保集群具有运行所有 Pod 需要的资源。为满足这两个功能,ClusterAutoscaler 包含一个优先级截止函数。您可以使用此截止函数来调度“尽力而为”的 Pod,它们不会使 ClusterAutoscaler 增加资源,而是仅在有可用备用资源时运行。

优先级低于截止值的 Pod 不会导致集群扩展或阻止集群缩减。系统不会添加新节点来运行 Pod,并且可能会删除运行这些 Pod 的节点来释放资源。