Kubernetes 自动扩缩
HPA、VPA 和 Cluster Autoscaler 扩缩 pod 和节点。
容器高级
为什么
K8s 自动扩缩按需调整:HPA 按 CPU/内存/自定义指标扩缩 pod 副本,VPA 调资源请求,Cluster Autoscaler 增删节点。Docker is used by 59% of professional developers per the Stack Overflow 2024 survey,Kubernetes 在生产中运行 60% 的容器化工作负载(CNCF 2024 调查)。
容器编排通过声明式滚动发布将部署相关事故减少 35%。
何时使用
无状态 web 应用用 HPA,资源调优用 VPA,节点扩缩用 Cluster Autoscaler。简单静态站点跳过容器 — CDN + 静态导出更便宜更快。
10 人以下团队避免 Kubernetes;运维开销不合理。
如何做
1. HPA — HorizontalPodAutoscaler,扩缩副本
2. 指标 — CPU、内存或自定义(Prometheus)
3. VPA — VerticalPodAutoscaler,调请求
4. Cluster Autoscaler — pod pending 时加节点
5. KEDA — 事件驱动扩缩(SQS、Kafka)
6. 最小/最大 — 设边界安全
7. 冷却 — scaleDown stabilizationWindowSeconds
示例
# hpa.yaml — 按 CPU 扩缩
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata: { name: myapp }
spec:
scaleTargetRef: { kind: Deployment, name: myapp }
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource: { name: cpu, target: { type: Utilization, averageUtilization: 70 } }
behavior:
scaleDown:
stabilizationWindowSeconds: 300 # 缩前等 5 分钟
# 自定义指标(Prometheus 适配器)
metrics:
- type: Pods
pods:
metric: { name: http_requests_per_second }
target: { type: AverageValue, averageValue: 100 }
常见问题
- ⚠HPA 不扩缩 — 未装 metrics-server,CPU/内存必需
- ⚠抖动 — 扩缩太快,设 stabilizationWindowSeconds
- ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致
最佳实践
- ✓minReplicas > 0 — 避免缩到零,零缩用 KEDA
- ✓真实负载用自定义指标 — CPU 不反映队列深度或 RPS
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求