Kubernetes 扩缩容
扩缩容层次
| 层次 | 控制对象 | 典型组件 | 作用 |
|---|---|---|---|
| 水平 Pod 扩缩 | 副本数 | HPA | 增减同类 Pod |
| 垂直 Pod 调整 | requests/limits | VPA(附加组件) | 调整单 Pod 资源规格 |
| 节点扩缩 | 节点/节点池 | Cluster Autoscaler、Karpenter 或云方案 | 为不可调度 Pod增加容量 |
| 事件驱动扩缩 | 副本数/Job | KEDA 等附加组件 | 根据队列、事件源扩缩 |
只有 HPA 是 Kubernetes 核心 API/控制器;VPA、节点扩容器和 KEDA 的版本、能力与安装方式由具体项目/平台决定。
HPA 前提
- Metrics Server 提供 CPU/内存资源指标;自定义/外部指标需要指标适配器。
- 容器设置合理的 CPU/内存 requests,否则利用率目标可能无法计算。
- 工作负载能水平扩展,启动时间和依赖容量已知。
- 扩容后的 Pod 能被调度,配额、IP、镜像和下游连接池充足。
bash
kubectl top pods -n demo
kubectl get apiservice v1beta1.metrics.k8s.io
kubectl get --raw '/apis/metrics.k8s.io/v1beta1/namespaces/demo/pods'HPA v2 示例
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web
namespace: demo
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 3
maxReplicas: 30
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 60
- type: Pods
value: 4
periodSeconds: 60
selectPolicy: Max
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 25
periodSeconds: 60
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 65基本计算近似为:
text
期望副本数 = ceil(当前副本数 × 当前指标 / 目标指标)控制器还有容差、缺失指标、未就绪 Pod 和稳定窗口等保护,最终行为以 HPA 官方文档为准。
bash
kubectl -n demo get hpa
kubectl -n demo describe hpa web
kubectl -n demo get hpa web --watch指标选择
| 指标 | 优点 | 风险 |
|---|---|---|
| CPU 利用率 | 通用、链路简单 | 与业务负载不总相关,受 requests 影响 |
| 内存 | 适合可释放/随流量变化的缓存型服务 | 内存通常不随缩容立即下降,易只扩不缩 |
| 每 Pod QPS | 直接对应服务能力 | 需可靠自定义指标和正确聚合 |
| 队列长度/消费延迟 | 适合异步消费者 | 需考虑到达率、处理时长和分区上限 |
| 延迟 | 对 SLO 直接 | 已接近过载时才触发,噪声和反馈滞后大 |
避免把高基数标签作为外部指标维度。指标链断开时 HPA 可能不扩容;必须监控 HPA Conditions 和指标新鲜度。
HPA 与手工副本数
HPA 拥有目标的 scale 子资源。启用后:
- 不要让 GitOps 持续把
spec.replicas改回固定值。 - 不要同时运行多个控制器写同一 scale target。
- 手工
kubectl scale只是短期,会被 HPA 下一次协调覆盖。 - 发布系统更新 PodTemplate,不应顺便重置副本数。
VPA
VPA 根据历史/实时用量推荐或应用 requests:
Off:只生成建议,适合评估。Initial:仅创建 Pod 时应用建议。Recreate/Auto:可能驱逐/重建 Pod;确切模式取决于已安装 VPA 版本。- 支持原地调整的能力也受 Kubernetes/运行时/策略约束。
HPA 按 CPU/内存利用率扩缩时,与 VPA 同时修改 requests 会形成反馈冲突。常见做法是 HPA 使用自定义业务指标,VPA 负责资源建议;上线前按平台版本验证。
节点自动扩缩
节点扩容器通常观察因资源/约束不可调度的 Pod,并增加满足条件的节点;缩容前尝试 Evict 可迁移 Pod。
无法通过加节点解决的情况:
- PVC 绑定到不兼容故障域。
- 硬亲和/污点没有任何节点池匹配。
- 云配额、IP 地址或节点池最大值耗尽。
- Pod 请求超过任何实例类型容量。
- PDB、Local Storage 或系统 Pod阻塞缩容。
节点创建可能耗时数分钟。突发服务需保留缓冲容量、快速启动镜像或预测扩容,不能只依赖“流量来了再加节点”。
防止震荡与雪崩
minReplicas至少覆盖故障域和最小可用容量。- Scale Up 足够快,但不能瞬间压垮数据库、队列或第三方 API。
- Scale Down 使用稳定窗口,应用优雅排空连接。
- 启动探针与 readiness 准确,避免未暖机实例进入流量。
- 每 Pod 并发、连接池和线程数与副本扩展模型匹配。
- 为 HPA 上限、集群容量、配额、IP 和下游容量同时告警。
- 压测包括冷启动、指标延迟、节点扩容和依赖退化。
扩缩容排障
bash
kubectl -n demo describe hpa web
kubectl -n demo get hpa web -o yaml
kubectl -n demo get deployment web
kubectl -n demo get pods -l app=web -o wide
kubectl -n demo get events --sort-by=.lastTimestamp
kubectl get nodes| 症状 | 常见原因 |
|---|---|
<unknown> 指标 | Metrics API/适配器故障、无 request、标签不匹配 |
| 达到 max 仍过载 | 上限太低、单 Pod能力下降、下游瓶颈 |
| 期望副本增加但 Pod Pending | 节点/配额/IP/PV/亲和性不足 |
| 频繁上下波动 | 指标噪声、窗口太短、启动慢、目标不合适 |
| 不缩容 | 稳定窗口、指标仍高、缺失指标保护、最小副本 |
| 节点不缩 | PDB、本地存储、不可驱逐 Pod、利用率阈值 |
扩缩容是闭环控制系统。每次调参都记录负载模型、指标、目标、时间常数和验证结果,不凭单张监控截图修改。
继续阅读
- 命令
- 故障排查
- 故障排查