一、从一场运维事故说起

去年接手某电商平台的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

优势:应对突发流量游刃有余
隐患:预配节点类型不匹配时可能产生"节点碎片"


五、关键注意事项(血的教训)

  1. 版本兼容性:使用VPA时务必确认k8s版本≥1.23
  2. 灰度策略:资源调整应先从canary环境开始
  3. 监控断点:优化期间必须强化apiserver监控,某次大规模删除操作曾导致控制平面过载
  4. 存储生命周期:StatefulSet关联的PVC需特殊处理策略

六、综合实战案例

某视频平台优化实录:

  1. 通过kube-state-metrics发现40%的ConfigMap已过期
  2. 使用kube-cost生成成本报告,明确各命名空间开销
  3. 对CDN边缘服务实施HPA+CA混合扩缩
  4. 最终效果:
    • 节点数量从58→32
    • 月度云成本下降42%
    • 95分位资源利用率提升至68%

七、技术方案选择矩阵

场景 推荐方案 见效周期 风险等级
稳态业务 VPA+资源修订 2周 ★★☆☆☆
突发流量 HPA+CA 即时 ★★★☆☆
长期闲置环境 定时清理脚本 1天 ★★★★★
存储资源回收 PVC生命周期策略 3天 ★☆☆☆☆

八、终极优化之道

真正的K8s成本优化不是单纯删资源,而是要像精算师一样建立资源模型:

  1. 建立资源档案库,记录每个微服务的SLO指标
  2. 实施资源预算制度,为每个团队划分"资源配额"
  3. 将成本数据接入企业IM机器人,实现实时预警
  4. 周期性进行成本演练,模拟资源紧缺场景