记录一下:Kubernetes Pod 资源配额与自动扩缩容实践
引言
Kubernetes 通过 requests/limits 与 HPA(Horizontal Pod Autoscaler)实现应用的资源隔离与弹性伸缩。本文深入讲解资源管理的最佳实践与常见陷阱。
理解 Requests 与 Limits
Requests: 容器所需的资源下界
Scheduler 基于 requests 进行 Pod 调度决策
设置过低会导致 Pod 被过度压缩;设置过高会浪费资源
Limits: 容器能使用的资源上界
超过 limits 的 CPU 会被 cgroup 限流;超过内存 limits 会导致 OOMKilled
Requests 与 Limits 的比例
推荐设置:
CPU:
requests:limits = 1:2
或1:1.5
内存:
requests:limits = 1:1.5
或1:2
(不同应用有差异)
例如:
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
HPA 配置详解
基于 CPU 的自动扩缩容:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 30
- type: Pods
value: 2
periodSeconds: 60
selectPolicy: Max
关键字段:
minReplicas/maxReplicas
: Pod 数量的范围averageUtilization
: 触发扩缩的资源利用率阈值stabilizationWindowSeconds
: 防止频繁扩缩的稳定化窗口behavior.scaleDown/scaleUp
: 定义扩缩策略的具体行为
HPA 工作流程
1. Metrics Server 采集 Pod 的资源使用情况
↓
2. HPA Controller 读取指标数据
↓
3. 计算目标副本数: desired_replicas = ceil(current_metrics / target_metrics * current_replicas)
↓
4. 检查是否超过 minReplicas/maxReplicas 的限制
↓
5. 应用扩缩策略(防止频繁波动)
↓
6. 更新 Deployment 的 replicas 数量
常见问题与排查
1. HPA 不生效
检查 Metrics Server 是否正常运行:
kubectl get deployment metrics-server -n kube-system
查看 HPA 状态:
kubectl describe hpa app-hpa
若显示
unknown
指标,等待 1-2 分钟让 Pod 积累足够的性能数据
2. Pod 频繁扩缩(抖动)
原因:目标利用率设置过接近当前利用率
解决:提高
stabilizationWindowSeconds
,使用更激进的扩缩策略
3. 新增 Pod 仍然超载
检查单个 Pod 的最大容量是否达到瓶颈
考虑增加 Pod 的 requests/limits
优化应用本身的性能
监控与调试
查看 HPA 状态:
kubectl get hpa app-hpa
kubectl describe hpa app-hpa
# 查看 HPA 的伸缩历史事件
kubectl get events --sort-by=.metadata.creationTimestamp | grep HPA
获取实时指标:
# 查看 Pod 的实时资源使用
kubectl top pod <pod-name>
# 查看节点资源使用
kubectl top node