HOOOS

HPA 调优秘籍:告别频繁伸缩,稳操资源分配主动权

0 82 老K KubernetesHPA自动伸缩
Apple

你好,我是老 K。在 Kubernetes (K8s) 的世界里,Horizontal Pod Autoscaler (HPA) 就像一位勤劳的管家,它能够根据你的应用负载情况,自动调整 Pod 的数量,从而确保你的应用既能应对流量高峰,又能避免资源浪费。然而,如果 HPA 配置不当,它可能会变得“神经质”,一会儿疯狂扩容,一会儿又急于缩容,导致频繁的 Pod 伸缩,不仅影响应用的稳定性和性能,还会造成不必要的资源消耗。

今天,老 K 就带你深入探讨 HPA 的冷却周期和稳定窗口这两个关键参数,并教你如何根据应用特性,精细调整这些参数,让你的 HPA 真正成为一位“靠谱”的管家。

一、HPA 简介:自动伸缩的核心机制

在深入 HPA 调优之前,我们先来简单回顾一下 HPA 的工作原理。HPA 通过监控 Pod 的资源使用情况(如 CPU 使用率、内存使用量等)或者自定义的指标,来决定是否需要调整 Pod 的数量。

HPA 的核心组件包括:

  • HPA 控制器 (HPA Controller): 负责监控指标,计算 Pod 副本数量,并更新 Deployment 或其他控制器,从而实现 Pod 的伸缩。
  • 指标提供者 (Metrics Server 或自定义指标): 提供 HPA 所需的指标数据。Metrics Server 是 Kubernetes 官方提供的指标聚合器,可以提供 CPU 和内存的使用情况。你也可以使用自定义指标,比如请求延迟、每秒请求数等,来更精准地控制 HPA。

HPA 的工作流程大致如下:

  1. 指标采集: HPA 控制器从指标提供者获取 Pod 的指标数据。
  2. 指标计算: HPA 控制器根据配置的指标和目标值,计算所需的 Pod 副本数量。
  3. 伸缩决策: HPA 控制器将计算结果与当前 Pod 数量进行比较,如果需要调整,则更新 Deployment 或其他控制器。
  4. Pod 伸缩: Deployment 或其他控制器根据 HPA 的指令,创建或删除 Pod。

二、冷却周期:平抑伸缩的“躁动”

冷却周期(Cool Down Period)是 HPA 调优中最关键的参数之一,它定义了 HPA 在伸缩 Pod 之后,需要等待多久才能再次进行伸缩操作。冷却周期的设置,直接影响着 HPA 的伸缩频率和稳定性。

2.1 什么是冷却周期?

冷却周期主要包括两个参数:

  • scaleUpDelay (或 scaleUpStabilizationWindowSeconds): 扩容延迟。定义了 HPA 在扩容 Pod 之后,需要等待多久才能再次进行扩容操作。这个参数可以避免 HPA 对短暂的负载高峰做出过度反应,从而减少频繁的扩容操作。
  • scaleDownDelay (或 scaleDownStabilizationWindowSeconds): 缩容延迟。定义了 HPA 在缩容 Pod 之后,需要等待多久才能再次进行缩容操作。这个参数可以避免 HPA 对短暂的负载下降做出过度反应,从而减少频繁的缩容操作。

注意: scaleUpDelayscaleDownDelay 这两个参数并非所有 Kubernetes 版本都直接支持。在较新的版本中,通常使用 scaleUpStabilizationWindowSecondsscaleDownStabilizationWindowSeconds 来替代。如果你的 Kubernetes 版本不支持这两个参数,可以通过修改 HPA 的配置来实现类似的效果。

2.2 冷却周期的作用

冷却周期的主要作用是平抑 HPA 的“躁动”,减少频繁伸缩。试想一下,如果你的应用负载波动频繁,HPA 可能会在几分钟内多次进行扩容和缩容操作。这种频繁的伸缩会带来以下问题:

  • 资源浪费: 每次 Pod 伸缩都需要一定的启动时间。频繁的伸缩会浪费大量的计算资源,导致 Pod 启动时间过长,影响应用的性能。
  • 应用不稳定: 频繁的 Pod 伸缩可能会导致应用连接中断、缓存失效等问题,从而影响应用的稳定性。
  • 监控困难: 频繁的伸缩会使监控数据变得混乱,难以判断应用的真实负载情况。

通过设置合适的冷却周期,可以避免 HPA 对短期的负载波动做出过度反应,从而减少频繁伸缩的发生,提高应用的稳定性和性能。

2.3 如何设置冷却周期?

设置冷却周期需要根据你的应用特性和负载模式来综合考虑。以下是一些建议:

  • 观察负载模式: 仔细观察你的应用负载模式,了解负载波动的频率和幅度。如果你的应用负载波动较为平缓,可以适当延长冷却周期;如果负载波动较为剧烈,可以适当缩短冷却周期。
  • 考虑 Pod 启动时间: 考虑 Pod 的启动时间。如果你的 Pod 启动时间较长,应该适当延长冷却周期,避免 HPA 在 Pod 尚未完全启动时就进行伸缩操作。
  • 平衡伸缩速度和稳定性: 在伸缩速度和稳定性之间找到一个平衡点。如果过于追求伸缩速度,可能会导致频繁伸缩;如果过于追求稳定性,可能会导致 HPA 反应迟钝,无法及时应对负载变化。

以下是一个示例,展示了如何通过修改 HPA 的配置来设置冷却周期 (假设你的 Kubernetes 版本支持 scaleUpStabilizationWindowSecondsscaleDownStabilizationWindowSeconds):

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60 # 扩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 300 # 缩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15

在这个示例中,scaleUpStabilizationWindowSeconds 设置为 60 秒,表示 HPA 在扩容 Pod 之后,需要等待 60 秒才能再次进行扩容操作。scaleDownStabilizationWindowSeconds 设置为 300 秒,表示 HPA 在缩容 Pod 之后,需要等待 300 秒才能再次进行缩容操作。

注意: 在 Kubernetes 1.23 之前,可以通过修改 HPA 的配置来设置冷却周期,但需要使用 annotations,如下所示:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
  annotations:
    autoscaling.knative.dev/scale-up-delay: 60s
    autoscaling.knative.dev/scale-down-delay: 300s
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80

请根据你的 Kubernetes 版本选择合适的配置方式。

三、稳定窗口:细化伸缩策略

稳定窗口(Stabilization Window)是 HPA 调优中另一个重要的参数,它与冷却周期密切相关,用于进一步细化伸缩策略,避免 HPA 对短期的负载波动做出过度反应。

3.1 什么是稳定窗口?

稳定窗口是一个时间段,HPA 在这个时间段内会根据一定的策略来计算 Pod 副本的数量。稳定窗口通常与冷却周期一起使用,用于平滑伸缩过程,避免频繁伸缩。

稳定窗口的设置通常包括以下参数:

  • 稳定窗口时长: 决定了 HPA 考虑多长时间内的指标数据来计算 Pod 副本数量。
  • 稳定窗口策略: 决定了 HPA 如何根据稳定窗口内的指标数据来计算 Pod 副本数量。常见的策略包括:
    • 平均值: 计算稳定窗口内指标数据的平均值,并根据平均值来计算 Pod 副本数量。
    • 最大值: 计算稳定窗口内指标数据的最大值,并根据最大值来计算 Pod 副本数量。
    • 最小值: 计算稳定窗口内指标数据的最小值,并根据最小值来计算 Pod 副本数量。
    • 其他策略: 根据应用特性,你还可以自定义其他策略,比如加权平均、移动平均等。

3.2 稳定窗口的作用

稳定窗口的主要作用是平滑伸缩过程,避免 HPA 对短期的负载波动做出过度反应。通过考虑一段时间内的指标数据,而不是仅仅依赖于某个时刻的指标数据,可以减少 HPA 对短暂的负载高峰或低谷的误判。

稳定窗口可以带来以下好处:

  • 减少频繁伸缩: 通过考虑一段时间内的指标数据,可以减少 HPA 对短期负载波动的敏感度,从而减少频繁伸缩的发生。
  • 提高伸缩的准确性: 通过使用更稳定的指标数据,可以提高 HPA 伸缩的准确性,避免 HPA 对负载的错误判断。
  • 优化资源分配: 通过更准确地预测负载变化趋势,可以更有效地分配资源,避免资源浪费。

3.3 如何设置稳定窗口?

设置稳定窗口需要根据你的应用特性和负载模式来综合考虑。以下是一些建议:

  • 观察负载波动: 仔细观察你的应用负载波动,了解负载波动的频率和幅度。如果你的应用负载波动较为平缓,可以适当缩短稳定窗口时长;如果负载波动较为剧烈,可以适当延长稳定窗口时长。
  • 选择合适的稳定窗口策略: 选择合适的稳定窗口策略,根据你的应用特性和负载模式来决定使用平均值、最大值、最小值或其他策略。例如,如果你的应用对峰值负载比较敏感,可以选择最大值策略;如果你的应用对平均负载比较敏感,可以选择平均值策略。
  • 结合冷却周期: 将稳定窗口与冷却周期结合使用,可以进一步提高 HPA 的稳定性。冷却周期可以避免 HPA 对短期的负载波动做出过度反应,稳定窗口可以平滑伸缩过程,减少频繁伸缩。

以下是一个示例,展示了如何通过修改 HPA 的配置来设置稳定窗口 (假设你的 Kubernetes 版本支持 behavior):

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60 # 扩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 300 # 缩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15

在这个示例中,我们设置了扩容的稳定窗口为 60 秒,缩容的稳定窗口为 300 秒。HPA 会在 60 秒内,或者 300 秒内考虑指标数据来决定是否进行扩容或缩容操作。

注意: 在 Kubernetes 1.23 之前,你可能需要使用 annotations 来设置稳定窗口。例如:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
  annotations:
    autoscaling.knative.dev/scale-up-window: 60s
    autoscaling.knative.dev/scale-down-window: 300s
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80

请根据你的 Kubernetes 版本选择合适的配置方式。

四、指标选择:精准感知负载变化

除了冷却周期和稳定窗口之外,选择合适的指标也是 HPA 调优的关键。合适的指标能够更精准地反映应用负载的变化,从而使 HPA 做出更准确的伸缩决策。

4.1 常见的 HPA 指标

Kubernetes HPA 支持多种指标类型,常见的包括:

  • 资源指标 (Resource Metrics): 基于 Pod 的 CPU 使用率、内存使用量等资源指标。这是最常用的指标类型,也是 Metrics Server 默认提供的指标。
  • 自定义指标 (Custom Metrics): 基于你自己的应用指标,比如每秒请求数 (RPS)、请求延迟 (Latency)、错误率等。自定义指标可以更精准地反映你的应用负载情况,从而使 HPA 做出更合理的伸缩决策。
  • 对象指标 (Object Metrics): 基于其他 Kubernetes 对象的指标,比如 Service 的流量。这种指标类型可以让你根据 Service 的负载情况来自动伸缩 Pod。
  • 外部指标 (External Metrics): 基于外部服务的指标,比如消息队列的长度、数据库的连接数等。这种指标类型可以让你根据外部服务的负载情况来自动伸缩 Pod。

4.2 如何选择指标?

选择指标需要根据你的应用特性和负载模式来综合考虑。以下是一些建议:

  • 了解应用瓶颈: 了解你的应用瓶颈在哪里。如果你的应用瓶颈是 CPU,那么 CPU 使用率是一个合适的指标;如果你的应用瓶颈是内存,那么内存使用量是一个合适的指标;如果你的应用瓶颈是 I/O,那么磁盘 I/O 吞吐量可能是一个合适的指标。
  • 选择与用户体验相关的指标: 选择与用户体验相关的指标。比如,如果你的应用对请求延迟比较敏感,那么请求延迟是一个合适的指标;如果你的应用对错误率比较敏感,那么错误率是一个合适的指标。
  • 考虑指标的稳定性和可靠性: 考虑指标的稳定性和可靠性。选择那些能够稳定、可靠地反映应用负载情况的指标。避免使用那些容易受到外界因素干扰的指标。
  • 结合多个指标: 根据需要,可以结合多个指标来综合判断应用负载情况。例如,可以同时使用 CPU 使用率和内存使用量来监控 Pod 的资源使用情况。

4.3 自定义指标的实践

自定义指标可以让你更精准地控制 HPA,特别是在你的应用有特殊需求或者需要更精细的伸缩策略时。以下是一个简单的自定义指标实践示例:

  1. 部署 Metrics Server (如果尚未部署): Metrics Server 是 Kubernetes 官方提供的指标聚合器,可以提供 CPU 和内存的使用情况。如果你的 Kubernetes 集群尚未部署 Metrics Server,你需要先部署它。

  2. 部署 Prometheus 和 Grafana (可选): Prometheus 是一个流行的监控系统,可以收集和存储各种指标数据。Grafana 是一个流行的可视化工具,可以用来展示 Prometheus 收集的指标数据。部署 Prometheus 和 Grafana 可以让你更好地监控你的应用和 HPA 的运行情况。

  3. 编写指标采集程序: 编写一个指标采集程序,从你的应用中收集自定义指标数据。例如,你可以编写一个程序来统计每秒请求数 (RPS) 或者请求延迟 (Latency)。

  4. 将指标数据暴露给 Prometheus: 将你的指标数据暴露给 Prometheus,让 Prometheus 可以收集你的指标数据。你可以使用 Prometheus 的各种 Exporter 来将指标数据暴露给 Prometheus,比如 Spring Boot Actuator, Python 的 Prometheus client 等。

  5. 配置 HPA 使用自定义指标: 配置 HPA 使用你的自定义指标。在 HPA 的配置文件中,你需要指定你的自定义指标的名称、指标提供者(通常是 Prometheus)和目标值。

以下是一个示例,展示了如何使用自定义指标 (每秒请求数 RPS) 来配置 HPA:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metric:
        name: http_requests_total # Prometheus 指标名称
        selector:
          matchLabels:
            app: my-app # 你的应用标签
      target:
        type: AverageValue
        averageValue: 100 # 目标 RPS
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60 # 扩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 300 # 缩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15

在这个示例中,我们使用 External 类型的指标,metric.name 指定了 Prometheus 指标的名称 http_requests_totalselector 指定了应用的标签 app: my-apptarget.averageValue 指定了目标 RPS 为 100。当每秒请求数超过 100 时,HPA 会自动扩容 Pod;当每秒请求数低于 100 时,HPA 会自动缩容 Pod。

五、MinReplicas 和 MaxReplicas:限制伸缩范围

除了冷却周期、稳定窗口和指标选择之外,MinReplicasMaxReplicas 这两个参数也是 HPA 调优中需要关注的参数。它们定义了 HPA 允许伸缩的 Pod 副本数量的范围。

5.1 MinReplicas 的作用

MinReplicas 指定了 HPA 允许的最小 Pod 副本数量。设置 MinReplicas 的主要目的是确保应用始终保持一定的可用性,避免 Pod 数量过少导致服务中断

设置 MinReplicas 需要考虑以下因素:

  • 应用的可用性需求: 你的应用需要多少个 Pod 才能满足可用性要求?如果你的应用需要高可用性,那么应该设置一个较大的 MinReplicas 值。
  • Pod 的启动时间: 如果你的 Pod 启动时间较长,那么应该设置一个较大的 MinReplicas 值,以确保在 Pod 启动期间,应用仍然能够正常运行。
  • 资源消耗: 设置一个较大的 MinReplicas 值会增加资源消耗。你需要根据你的资源预算和应用负载情况来平衡可用性和资源消耗。

5.2 MaxReplicas 的作用

MaxReplicas 指定了 HPA 允许的最大 Pod 副本数量。设置 MaxReplicas 的主要目的是限制 HPA 伸缩的范围,避免 Pod 数量过多导致资源浪费

设置 MaxReplicas 需要考虑以下因素:

  • 应用的负载上限: 你的应用能够承受的最大负载是多少?MaxReplicas 应该设置为能够满足应用负载上限的值。
  • 集群的资源限制: 你的 Kubernetes 集群有多少资源?MaxReplicas 应该设置为不超过集群资源限制的值。
  • 资源消耗: 设置一个较大的 MaxReplicas 值会增加资源消耗。你需要根据你的资源预算和应用负载情况来平衡伸缩能力和资源消耗。

5.3 如何设置 MinReplicas 和 MaxReplicas?

设置 MinReplicasMaxReplicas 需要根据你的应用特性、负载模式和资源限制来综合考虑。以下是一些建议:

  • 评估应用的负载能力: 评估你的应用能够承受的最大负载和最小负载。MaxReplicas 应该设置为能够满足应用负载上限的值,MinReplicas 应该设置为能够满足应用最小负载的值。
  • 考虑集群的资源限制: 考虑你的 Kubernetes 集群的资源限制。确保 MaxReplicas 不超过集群的资源限制。
  • 监控资源使用情况: 监控你的 Pod 的资源使用情况,根据资源使用情况来调整 MinReplicasMaxReplicas。如果 Pod 的资源使用率过高,可以适当增加 MaxReplicas;如果 Pod 的资源使用率过低,可以适当减少 MaxReplicas
  • 根据实际情况调整: 根据实际情况来调整 MinReplicasMaxReplicas。HPA 的配置并非一成不变,你需要根据应用的负载变化和资源使用情况来不断调整 HPA 的配置,以达到最佳的伸缩效果。

六、HPA 调优实战案例

为了更好地理解 HPA 的调优方法,我们来看一个实战案例。假设你有一个电商网站的后端服务,该服务主要处理用户请求,提供商品信息、订单管理等功能。该服务的负载模式如下:

  • 高峰期: 每天 10:00-22:00,流量较高,CPU 使用率通常在 70%-90% 之间。
  • 低峰期: 每天 0:00-8:00,流量较低,CPU 使用率通常在 10%-30% 之间。

你的目标是:

  1. 确保服务在高峰期能够稳定运行,避免服务过载。
  2. 在低峰期能够节省资源,避免资源浪费。
  3. 避免频繁的 Pod 伸缩。

6.1 初始配置

首先,我们创建一个 Deployment,部署你的后端服务。然后,创建一个 HPA,初始配置如下:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-ecommerce-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-ecommerce-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80

在这个初始配置中,我们设置了 MinReplicas 为 2,MaxReplicas 为 10,目标 CPU 使用率为 80%。这意味着,当 Pod 的平均 CPU 使用率超过 80% 时,HPA 会自动扩容 Pod,直到达到 10 个;当 Pod 的平均 CPU 使用率低于 80% 时,HPA 会自动缩容 Pod,直到达到 2 个。

6.2 观察和分析

部署 HPA 后,你需要观察和分析 HPA 的运行情况。你可以使用 Kubernetes 的监控工具(如 Prometheus 和 Grafana)来监控 Pod 的 CPU 使用率、Pod 数量、伸缩事件等。通过观察,你可能会发现以下问题:

  • 频繁伸缩: 由于负载波动较为频繁,HPA 可能会在短时间内多次进行扩容和缩容操作,导致 Pod 频繁重启,影响服务的稳定性。
  • 扩容滞后: 在高峰期,HPA 可能会因为指标的滞后性,导致扩容速度跟不上负载的增长,从而导致服务过载。

6.3 调优方案

根据观察和分析,我们可以进行以下调优:

  1. 设置冷却周期: 由于负载波动较为频繁,我们需要设置冷却周期来减少频繁伸缩。考虑到高峰期负载较高,我们设置较短的扩容冷却周期,例如 60 秒。考虑到低峰期负载较低,我们设置较长的缩容冷却周期,例如 300 秒。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-ecommerce-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-ecommerce-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60 # 扩容冷却周期,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 300 # 缩容冷却周期,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
  1. 设置稳定窗口: 为了平滑伸缩过程,避免 HPA 对短期的负载波动做出过度反应,我们可以设置稳定窗口。稳定窗口的时间可以根据实际情况调整,例如 60 秒。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-ecommerce-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-ecommerce-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60 # 扩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 300 # 缩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
  1. 调整 MinReplicas 和 MaxReplicas: 根据实际负载情况,调整 MinReplicasMaxReplicas。如果服务在低峰期负载很低,可以适当减少 MinReplicas,例如设置为 1。如果服务在高峰期负载很高,可以适当增加 MaxReplicas,例如设置为 15。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-ecommerce-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-ecommerce-deployment
  minReplicas: 1 # 调整 MinReplicas
  maxReplicas: 15 # 调整 MaxReplicas
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60 # 扩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 300 # 缩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
  1. 选择合适的指标: 如果 CPU 使用率不能很好地反映应用的负载情况,可以考虑使用自定义指标。例如,可以使用每秒请求数 (RPS) 作为指标。通过使用自定义指标,可以更精准地控制 HPA。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-ecommerce-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-ecommerce-deployment
  minReplicas: 1
  maxReplicas: 15
  metrics:
  - type: External
    external:
      metric:
        name: http_requests_total # Prometheus 指标名称
        selector:
          matchLabels:
            app: my-ecommerce-backend # 你的应用标签
      target:
        type: AverageValue
        averageValue: 1000 # 目标 RPS
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60 # 扩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 300 # 缩容稳定窗口,单位:秒
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15

6.4 持续优化

完成上述调优后,你需要持续观察和分析 HPA 的运行情况。根据实际负载变化和资源使用情况,不断调整 HPA 的配置,以达到最佳的伸缩效果。HPA 的调优是一个持续优化的过程,需要根据实际情况进行调整,才能让它真正成为你应用的“好管家”。

七、总结:让 HPA 成为你的得力助手

HPA 是 Kubernetes 中一个非常重要的功能,它可以帮助你自动伸缩 Pod,从而确保你的应用既能应对流量高峰,又能避免资源浪费。通过深入了解 HPA 的冷却周期、稳定窗口、指标选择、MinReplicasMaxReplicas 等关键参数,并根据应用特性进行精细调整,你可以让你的 HPA 更加智能,更加稳定,从而提升应用的性能和稳定性。

记住,HPA 的调优是一个持续优化的过程。你需要不断观察、分析和调整,才能让 HPA 真正成为你的得力助手。希望这篇文章能够帮助你更好地理解 HPA,并成功地调优你的应用。

如果你在 HPA 调优过程中遇到任何问题,欢迎随时提出,老 K 会尽力帮助你解决。

加油!

点评评价

captcha
健康