Kubernetes HPA(Horizontal Pod Autoscaler,横向Pod自动伸缩)是容器编排环境里应对流量波动的标准手段。它按指标自动调整Pod副本数,流量上来先扩容,流量下去再回收,避免人工盯监控改副本数。本文覆盖HPA的原理、配置、自定义指标扩展与参数调优,适合正在搭建弹性伸缩体系的网站运维团队。
HPA的工作原理与扩缩容计算
HPA控制循环默认每15秒读取一次指标,计算期望副本数后调整Deployment。计算方式:期望副本数 = 当前副本数 × 当前指标值 / 目标指标值,结果向上取整。指标来源包括metrics-server(CPU/内存)与自定义指标API(QPS、队列长度、延迟)。
部署metrics-server采集基础指标
metrics-server采集节点与Pod的CPU/内存使用率,是HPA运行的前提。安装后验证可用性:kubectl top nodes有输出即正常。集群部署在云厂商环境时,优先用托管metrics组件,减少自建维护成本。
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl top nodes
kubectl top pods -n prod
基于CPU的HPA配置示例
面向Web服务按CPU扩容是基础用法。下面配置让Deployment的CPU使用率维持在60%,副本数在2-10之间浮动。targetAverageUtilization按Pod的requests计算百分比,因此Pod的resources.requests.cpu必须与真实用量匹配,否则缩放基准失真。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
namespace: prod
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
自定义指标与KEDA:按业务水位伸缩
CPU指标存在滞后性,处理队列类负载更适合用业务指标。KEDA把消息队列长度、积压量等业务指标接入HPA,消息积压自动扩容,消费完自动回收。Kafka触发器示例:lag超过100时副本数往上涨,上限20。
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: consumer-scaler
spec:
scaleTargetRef:
name: consumer
minReplicaCount: 1
maxReplicaCount: 20
triggers:
- type: kafka
metadata:
topic: order-events
bootstrapServers: kafka-broker:9092
lagThreshold: "100"
参数调优:稳定窗口与扩缩步长
默认行为容易造成副本数频繁抖动。两个关键参数:缩容稳定窗口(stabilizationWindowSeconds)让副本保留一段时间再回收,避免流量波动导致抖动;扩缩步长通过behavior段限制单次变化幅度,扩容可以激进、缩容必须保守。
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 60
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 2
periodSeconds: 60
实践中的注意事项
Pod的requests必须与真实用量匹配;扩容依赖指标延迟,建议同步配置Prometheus Adapter采集业务指标;无状态服务才适合HPA,有状态数据库、消息队列不要直接按流量缩容。HPA只是弹性层的一环,配合节点自动扩缩容才能形成完整闭环。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kuberneteshpa-tan-xing-shen-suo-shi-zhan-cong-zhi-biao-cai/