记录一下:Kubernetes Pod 资源配额与自动扩缩容实践

发表于
1

引言

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:21:1.5

  • 内存: requests:limits = 1:1.51: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


上一篇 记录一下:K8s部署SkyWalking链路追踪
下一篇 记录一下:Redis Sentinel 哨兵机制详解与故障转移实践