在 Kubernetes 中,Horizontal Pod Autoscaler(HPA)是一种资源,用于根据 CPU 利用率或自定义的指标自动扩缩 Pod 的副本数。
它的主要特征是:
- 根据 CPU 利用率扩缩 Pod:当 Pod 的 CPU 利用率超过或低于指定值时,自动增加或减少副本数。
- 支持自定义指标:可以根据集群内的任意指标进行扩缩,只需要该指标可以由 Metrics API 收集。
- 支持多个指标:可以同时根据多个指标进行扩缩。
- 稳定期:在连续多次检查都需要调整后才会真正执行调整,避免过于频繁的调整导致不稳定。
HPA 的定义包含以下主要字段:
- spec.scaleTargetRef:缩放目标,表示要扩缩的部署或副本集。
- spec.minReplicas:最小副本数。
- spec.maxReplicas:最大副本数。
- spec.metrics:度量指标列表,每种指标又包含:
- type:指标类型,支持 ResourceMetrics(CPU/内存)、
Pods
、ObjectMetrics
(自定义)。 - resource:具体资源,如 cpu、
memory
等。 - targetAverageValue:目标平均值,当实际使用率超过或低于该值时触发扩缩。
- status.currentReplicas:当前副本数。
- status.desiredReplicas:期望副本数。
HPA 的工作流程是:
- HPA 控制器定期从 Metrics API 检索 Pod 的利用率指标。
- 比较实际指标与 spec.metrics.targetAverageValue 目标值的差异。
- 如果差异超过稳定期(默认为1分钟),开始执行扩缩操作。
如果实际值高于目标值,增加副本数;低于目标值减少副本数。 - 最终副本数在 spec.minReplicas 与 spec.maxReplicas 范围内。
- HPA 会更新 status.desiredReplicas 与目标值相符的期望副本数。
- 扩缩操作由 HPA 控制器通过调用 API 更新 Deployment 或 ReplicaSet 实现。
例如,这个 HPA 根据 CPU 利用率对部署扩缩:
yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx # 缩放目标
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu # 指标类型为 CPU 利用率
targetAverageUtilization: 50 # 目标平均值50%
这个 HPA 会保证 nginx Deployment 的 Pod CPU 利用率维持在约50%:
- 当利用率超过50%时,增加副本数,最高10个。
- 当利用率低于50%时,减少副本数,最低2个。
- 扩缩操作由 HPA 调用 API 更新 Deployment 实现。
所以总结来说,HPA 主要用于自动扩缩 Pod 的副本数,其主要特征是:
- 根据 CPU 利用率或自定义指标扩缩。
- 支持多指标。
- 有稳定期避免过于频繁扩缩。
- 定义最小、最大副本数。
它的定义包含:
- 缩放目标:要扩缩的 Deployment/ReplicaSet 等。
- 最小、最大副本数。
- 指标列表:类型、资源和目标值。
- 状态:当前与期望副本数。