一、从一场运维事故说起
去年接手某电商平台的K8s集群时,我发现集群的月均云账单高达15万美元,但业务高峰期的节点CPU利用率仅23%。这就像开着10辆卡车运快递,却有8辆长期空跑——云计算资源浪费的残酷真相往往藏在资源请求(request)和实际使用(usage)的鸿沟中。
(应用场景:中大型企业的K8s集群常存在资源配置过饱和、僵尸工作负载残留、存储卷孤立等问题)
二、资源利用率分析的武器
(技术栈:kubectl+Prometheus)
1. 基础工具
kubectl describe node <node-name> | grep -A 10 "Allocated"
# 实时获取Pod实际用量(需安装metrics-server)
kubectl top pod --all-namespaces --containers
# 统计命名空间资源占比
kubectl resource-quota --all-namespaces
这三个命令构成了资源分析的"心电图",能快速定位资源分配失衡点。比如某Java应用Pod配置了4核8G的request,但实际使用长期维持在0.5核/1.2G。
2. Prometheus深度扫描
# 计算过去7天CPU请求/用量比率
sum(rate(container_cpu_usage_seconds_total{container!="POD"}[7d])) by (namespace,pod)
/
sum(kube_pod_container_resource_requests{resource="cpu"}) by (namespace,pod)
# 找出连续3天未被访问的Ingress
sum(nginx_ingress_controller_requests{status!~"5.*"}) by (host) < 10
当配置Grafana仪表盘后,我们曾发现某测试环境的Elasticsearch集群竟保持着生产级别的资源配置,仅此一项每月浪费$3200。
三、闲置资源清理
(技术栈:kubectl+shell)
1. 僵尸Deployment大扫除
# 查找过去30天无流量的Service
kubectl get svc -A -o json | jq '.items[] | select(.metadata.annotations["last-access-time"] < "'$(date -d "-30 days" +%s)'")'
# 批量删除低使用率Deployment(慎用!)
kubectl get deploy -n test-env --no-headers | awk '$4==0 {print $1}' | xargs -I{} kubectl delete deploy {} -n test-env
特别注意:务必通过--dry-run=client
参数预验证删除操作,某金融公司曾误删仍承载定时任务的cronjob。
2. 存储资源黑洞治理
# 查找未被PVC引用的PV
kubectl get pv | grep -v bound
# 清理已完成Job残留的PVC
kubectl get pvc -n batch-processing | grep "job-" | awk '{print $1}' | xargs -I{} kubectl delete pvc {}
四、核心技术方案对比分析
1. 垂直扩缩容(VPA)
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: payment-service
updatePolicy:
updateMode: "Auto"
优点:自动调节request值
缺点:需谨慎处理内核参数,某社交App曾因JVM堆内存自动扩容导致频繁Full GC
2. 集群自动扩缩容(CA)
# GKE集群配置示例
gcloud container clusters update my-cluster \
--enable-autoscaling \
--min-nodes 3 \
--max-nodes 20 \
--zone us-central1-a
优势:应对突发流量游刃有余
隐患:预配节点类型不匹配时可能产生"节点碎片"
五、关键注意事项(血的教训)
- 版本兼容性:使用VPA时务必确认k8s版本≥1.23
- 灰度策略:资源调整应先从canary环境开始
- 监控断点:优化期间必须强化apiserver监控,某次大规模删除操作曾导致控制平面过载
- 存储生命周期:StatefulSet关联的PVC需特殊处理策略
六、综合实战案例
某视频平台优化实录:
- 通过
kube-state-metrics
发现40%的ConfigMap已过期 - 使用
kube-cost
生成成本报告,明确各命名空间开销 - 对CDN边缘服务实施HPA+CA混合扩缩
- 最终效果:
- 节点数量从58→32
- 月度云成本下降42%
- 95分位资源利用率提升至68%
七、技术方案选择矩阵
场景 | 推荐方案 | 见效周期 | 风险等级 |
---|---|---|---|
稳态业务 | VPA+资源修订 | 2周 | ★★☆☆☆ |
突发流量 | HPA+CA | 即时 | ★★★☆☆ |
长期闲置环境 | 定时清理脚本 | 1天 | ★★★★★ |
存储资源回收 | PVC生命周期策略 | 3天 | ★☆☆☆☆ |
八、终极优化之道
真正的K8s成本优化不是单纯删资源,而是要像精算师一样建立资源模型:
- 建立资源档案库,记录每个微服务的SLO指标
- 实施资源预算制度,为每个团队划分"资源配额"
- 将成本数据接入企业IM机器人,实现实时预警
- 周期性进行成本演练,模拟资源紧缺场景