引言:从“手动挡”到“自动驾驶”
想象我们驾驶一辆汽车,手动调节油门和换挡不仅费力,还难以应对突发状况。我们的应用服务也一样,在面对突然的流量增长,内存使用暴涨该如何应对。HPA(Horizontal Pod Autoscaler) 为我们提供了解决方案,它像更高级的“自动驾驶”,根据实时负载自动扩缩容。接下来我们一块学习如何应用HPA进行配置资源请求、限制与自动伸缩策略。
一、为什么需要资源管理?
1.1 资源争抢的灾难场景
- 案例:某个Pod疯狂占用CPU,导致同节点其他应用瘫痪。
- 后果:服务响应延迟、OOM(内存溢出)错误、节点崩溃。
资源管理的核心目标:
- 稳定性:为每个容器预留必要资源,避免争抢。
- 利用率:合理分配资源,防止浪费。
二、资源请求与限制:为容器戴上“紧箍咒”
2.1 核心概念
- requests(请求):容器启动所需的最低资源保障(如“至少需要1核CPU”)。
- limits(限制):容器能使用的资源上限(如“最多使用2核CPU”)。
2.2 配置示例
在Pod或Deployment中定义资源约束:
# deployment-with-resources.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: web-app
spec:replicas: 2template:spec:containers:- name: nginximage: nginx:latestresources:requests: # 资源请求cpu: "100m" # 0.1核CPUmemory: "128Mi" # 128MB内存limits: # 资源限制cpu: "500m" # 0.5核CPUmemory: "512Mi" # 512MB内存
2.3 资源单位详解
- CPU:
1
= 1核CPU,100m
= 0.1核(毫核)。- 可超卖:多个Pod的CPU请求总和可超过节点实际CPU。
- 内存:
- 单位:
Mi
(兆字节)、Gi
(千兆字节)。 - 不可超卖:节点内存耗尽时,会触发OOM Killer终止进程。
- 单位:
2.4 验证资源分配
查看Pod资源详情
kubectl describe pod <pod-name>
输出示例:
Containers:nginx:Limits:cpu: 500mmemory: 512MiRequests:cpu: 100mmemory: 128Mi
监控节点资源使用
kubectl top nodes
kubectl top pods
三、HPA:水平自动扩缩容
3.1 HPA的工作原理
- 监控指标:CPU利用率、内存使用率或自定义指标(如QPS)。
- 扩缩逻辑:当指标超过阈值时,自动增加/减少Pod副本数。
(图:HPA根据指标变化调整Deployment的副本数)
3.2 配置HPA(CPU为例)
步骤1:部署Metrics Server
HPA依赖资源指标数据,需先安装Metrics Server:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证安装
kubectl get deployment metrics-server -n kube-system
步骤2:创建HPA策略
# 当CPU使用率超过50%时扩容,最少1个Pod,最多5个
kubectl autoscale deployment web-app --cpu-percent=50 --min=1 --max=5
或通过YAML定义:
# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: web-app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: web-appminReplicas: 1maxReplicas: 5metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50
步骤3:触发压力测试
# 进入Pod生成CPU负载
kubectl exec -it <pod-name> -- sh
dd if=/dev/zero of=/dev/null & # 模拟CPU满载
exit# 观察HPA状态
kubectl get hpa -w
输出示例:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS
web-app-hpa Deployment/web-app 150%/50% 1 5 3
3.3 高级配置:内存与自定义指标
基于内存的HPA
metrics:
- type: Resourceresource:name: memorytarget:type: UtilizationaverageUtilization: 80 # 内存使用率阈值80%
自定义指标(需Prometheus适配器)
metrics:
- type: Podspods:metric:name: http_requests_per_secondtarget:type: AverageValueaverageValue: 100 # 每秒请求数超过100时扩容
四、最佳实践与陷阱避坑
4.1 资源参数优化建议
- CPU请求:根据应用基线负载设定(如Java应用初始值可设
500m
)。 - 内存限制:留出至少20%缓冲,避免OOM。
4.2 常见陷阱
- 未设置limits:导致“资源吸血鬼”耗尽节点资源。
- HPA振荡:阈值过小或指标波动大,导致副本数频繁变化。
- 解决:适当增大扩缩容冷却时间(
--horizontal-pod-autoscaler-downscale-stabilization
)。
- 解决:适当增大扩缩容冷却时间(
五、常见问题与解决
-
HPA不触发扩容
- 检查Metrics Server是否正常运行:
kubectl top pods
。 - 确认Deployment的
resources.requests
已设置(HPA依赖requests计算利用率)。
- 检查Metrics Server是否正常运行:
-
Pod因OOM被终止
- 增大
memory.limits
或优化应用内存使用。 - 检查是否有内存泄漏。
- 增大
-
节点资源不足导致Pod无法调度
- 清理闲置Pod或扩容集群节点。
- 检查
kubectl describe node
的资源分配情况。
动手实验
-
模拟流量高峰
使用压测工具(如hey
或wrk
)对服务发起请求,观察HPA如何扩容:hey -z 5m -c 100 http://<service-ip>:<port>
-
动态调整HPA阈值
修改HPA的targetAverageUtilization
,观察副本数变化:kubectl edit hpa web-app-hpa
资源推荐
- Kubernetes HPA官方文档
- Metrics Server GitHub仓库
- Kubernetes资源配额管理
现在,我们的应用无论是突发流量还是资源挤占,Kubernetes的自动化机制都能让系统稳如磐石。