K8S配置HPA(Horizontal Pod Autoscaler)

这篇文章讲解了如何在 Kubernetes 中配置 HPA(Horizontal Pod Autoscaler),让集群可以根据 CPU 或内存利用率自动扩缩容,提高资源利用率和应用稳定性。

HPA 的作用

HPA(Horizontal Pod Autoscaler)是 Kubernetes 提供的一种自动伸缩机制,可以根据 Pod 的 CPU、内存使用率或自定义指标动态调整副本数。

主要功能:

  1. 自动扩容(Scale Out):当应用负载增加,资源使用率超过设定的阈值时,HPA 会自动增加 Pod 数量。
  2. 自动缩容(Scale In):当应用负载下降,资源使用率低于设定的阈值时,HPA 会自动减少 Pod 数量。
  3. 支持自定义指标:除了 CPU 和内存,HPA 还能基于 Prometheus 等监控系统提供的自定义指标进行伸缩。

HPA 是如何工作的

Kubernetes 的 HPA(水平 Pod 自动扩缩)是一种间歇运行的控制回路,而不是一个持续的过程。它的运行间隔由 kube-controller-manager 组件中的 --horizontal-pod-autoscaler-sync-period 参数控制,默认间隔为 15 秒

在每个时间周期内,控制器管理器会检查 HorizontalPodAutoscaler(HPA)资源中定义的目标指标,然后执行以下操作:

  1. 获取目标资源和对应 Pod

    • 控制器通过 scaleTargetRef 找到目标资源(例如 Deployment 或 StatefulSet)。
    • 通过 .spec.selector 选择该资源管理的所有 Pod。
  2. 获取指标数据

    • CPU 或内存资源指标

      • 通过 资源指标 API 获取每个 Pod 的资源使用情况。
      • 如果 HPA 设定了“目标使用率”,控制器会计算每个 Pod 的资源使用率。
      • 如果 HPA 直接设定了“目标数值”,则使用原始数据。
      • 计算平均资源使用率或原始值后,确定是否需要扩缩 Pod 数量。
    • 自定义指标

      • 机制与资源指标类似,不同的是 HPA 仅使用原始值 进行计算。
    • 对象或外部指标(例如队列长度、请求速率):

      • 直接比较当前指标值和设定的目标值。
      • autoscaling/v2 版本 API 中,HPA 可以将指标值按 Pod 数量均摊后计算。
  3. 计算扩缩比例,调整副本数

    • 如果指标显示需要增加 Pod 数量,HPA 会调整 scale 子资源,将目标副本数更新到合适的值。
    • 需要注意,如果某些 Pod 里的容器 不支持资源监控,则控制器不会使用这些 Pod 的 CPU 使用率数据。

HPA 依赖的指标 API

HPA 主要从 Metrics API 获取监控数据,包括:

  • metrics.k8s.io(通常由 Metrics Server 提供)
  • custom.metrics.k8s.io(用于自定义指标)
  • external.metrics.k8s.io(用于外部指标,例如消息队列长度)

要使用 HPA,必须确保 Metrics Server 已正确部署并运行。想了解 Metrics Server 的详细信息,可以参考官方文档。

HPA 如何与 Kubernetes 资源交互

HPA 控制器会访问支持扩缩的工作负载资源,例如 DeploymentStatefulSet。这些资源都有一个 scale 子资源,它允许 HPA 动态调整副本数量,并获取当前的副本状态。

如果你想深入了解 Kubernetes API 的子资源机制,可以参考 Kubernetes 的官方 API 概念文档。

以上就是 HPA 的基本工作流程。简单来说,HPA 就像一个定期检查系统健康状况的智能助手,它会根据实际的负载情况,自动增加或减少 Pod 数量,确保你的应用既能承受高流量,又不会浪费资源。🚀

HPA 配置示例

1. 基于 CPU 使用率的 HPA 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app # 需要自动伸缩的 Deployment 名称
minReplicas: 2 # 最小副本数
maxReplicas: 10 # 最大副本数
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization # 利用率
averageUtilization: 50 # 目标 CPU 使用率 50%

解释

  • scaleTargetRef:指定 HPA 作用的 Deployment。
  • minReplicas:最小副本数,避免 Pod 被缩容到 0。
  • maxReplicas:最大副本数,防止过度扩容。
  • metrics:指定监控的指标,这里基于 CPU 使用率,目标值为 50%。

2. 基于内存使用率的 HPA 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 70 # 目标内存使用率 70%

注意:如果你的应用是 CPU 密集型(如 Web 服务器),通常建议基于 CPU 进行伸缩;如果是内存密集型(如缓存服务),可以基于内存进行伸缩。

3. 基于自定义指标的 HPA 配置

如果你希望基于自定义指标(如 QPS、延迟等)进行伸缩,可以结合 Prometheus + Kubernetes Metrics Server 进行配置。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: External
external:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 100 # 目标 QPS 为 100

这里 http_requests_per_second 需要 Prometheus Adapter 提供相应的监控数据。

如何启用 HPA?

  1. 安装 Metrics Server(用于采集 CPU 和内存指标)
    1
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  2. 查看 HPA 状态
    1
    kubectl get hpa
  3. 手动触发 HPA 伸缩(模拟高负载)
    1
    kubectl run --generator=run-pod/v1 -it --rm --image=busybox stress -- --cpu 2

HPA 使用建议

适用场景

  • 访问量波动较大的 Web 应用。
  • 计算密集型任务,如视频处理、AI 推理。
  • 事件驱动的微服务架构(如 Kafka 消费者)。

注意事项

  • 避免设置过低的 minReplicas:可能导致缩容到 1 个 Pod,影响高可用性。
  • maxReplicas 不宜过大:防止因误判导致集群资源耗尽。
  • 结合冷启动优化:如果应用启动较慢,HPA 可能在扩容后还未完成启动就继续扩容。

总结

监控指标 适用场景 可能问题
CPU Web 服务、计算密集型任务 负载突增时可能扩容不及时
内存 缓存服务、数据处理 内存波动大时可能频繁伸缩
自定义指标 QPS、消息队列消费速率 需要额外的监控系统支持

HPA 是 Kubernetes 中重要的自动化运维手段,结合合理的指标监控和资源管理,可以有效提升应用的可扩展性和稳定性! 🚀