一、CPU瓶颈:当你的集群开始"喘不过气"

想象一下,你的Kubernetes集群就像个忙碌的餐厅后厨。当订单(Pod)突然暴增时,厨师(CPU)可能会忙得满头大汗。CPU瓶颈通常表现为:

  • Pod状态频繁出现CPUThrottled
  • kubectl top pods显示某些Pod持续占用90%以上的CPU
  • 节点监控中CPU load average持续高位

示例场景(技术栈:Golang应用)
假设我们有个Go语言开发的图像处理服务:

// 这个图像处理函数会疯狂消耗CPU
func processImage(imgData []byte) {
    for i := 0; i < 100; i++ {  // 故意设计的低效循环
        // 模拟复杂的图像处理算法
        _ = sha256.Sum256(imgData) 
    }
}

诊断方法

# 查看Pod的CPU限制是否合理
kubectl describe pod/my-image-processor | grep -i cpu

# 使用火焰图定位热点(需安装go pprof)
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile

二、内存瓶颈:容器界的"内存泄漏噩梦"

内存问题就像厨房里堆积如山的脏盘子。常见症状包括:

  • Pod频繁被OOMKilled
  • kubectl top显示内存使用率持续接近limit值
  • 节点监控中memory cache异常增高

示例场景(技术栈:Java SpringBoot应用)
下面这个Spring Controller存在典型的内存泄漏:

@RestController
public class LeakyController {
    private static List<byte[]> memoryLeak = new ArrayList<>();  // 静态集合永远不会释放
    
    @GetMapping("/leak")
    public String leakMemory() {
        memoryLeak.add(new byte[1024 * 1024]);  // 每次调用泄漏1MB
        return "内存悄悄溜走了...";
    }
}

解决方案

# 查看JVM内存状态
kubectl exec my-java-pod -- jstat -gcutil 1

# 调整Pod的memory limit(values.yaml示例)
resources:
  limits:
    memory: "2Gi"
  requests:
    memory: "1Gi"

三、网络瓶颈:集群的"交通堵塞"问题

网络瓶颈就像节假日的高速公路,常见表现有:

  • 服务间调用延迟显著增加
  • kubectl get endpoints显示Endpoint不稳定
  • 节点监控中network throughput接近网卡上限

示例场景(技术栈:Node.js微服务)
一个过度活跃的HTTP客户端会导致网络饱和:

// 糟糕的实践:不控制请求并发量
async function fetchAllData() {
  const urls = [...Array(1000)].map(() => 'http://internal-service/api');
  return Promise.all(urls.map(url => axios.get(url))); // 瞬间爆发1000个请求
}

优化方案

# 使用Istio进行流量整形(示例配置)
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: rate-limited
spec:
  host: internal-service
  trafficPolicy:
    connectionPool:
      tcp: 
        maxConnections: 100
      http:
        http2MaxRequests: 50

四、存储瓶颈:当磁盘变成"龟速快递"

存储性能问题就像用自行车送快递,典型症状包括:

  • PVC挂载耗时超过30秒
  • kubectl get pv显示卷状态为Pending
  • 节点监控中disk latency超过50ms

示例场景(技术栈:Python数据分析应用)
不当的文件操作会导致存储IOPS爆表:

def process_data():
    with open('/data/large.csv', 'r+') as f:  # 使用根目录而不是PVC
        for line in f:
            # 每行都执行全文件写入(灾难性设计)
            f.seek(0, 2)
            f.write(processed_line + "\n")

最佳实践

# 查看存储性能指标
kubectl get --raw /apis/metrics.k8s.io/v1beta1/pods | jq '.items[].containers[].volumeMetrics'

# 使用Local PV替代网络存储(适用于高性能场景)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 500Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/ssd

五、综合调优:给集群做"全身按摩"

经过上述分析后,我们需要:

  1. 合理设置资源限制:就像给餐厅厨师排班表
  2. 实施水平扩展:HPA就像随时待命的兼职厨师
  3. 选择合适存储类:SSD相当于电动送餐车
  4. 服务网格优化:类似餐厅的传菜路线规划

终极检查清单

# 一键获取集群健康报告(需要安装kube-state-metrics)
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes \
  | jq '[.items[] | {node: .metadata.name, cpu: .usage.cpu, memory: .usage.memory}]'

记住,没有放之四海而皆准的解决方案。就像米其林餐厅和快餐店的厨房配置不同,你的集群调优也需要根据实际业务场景量体裁衣。下次当你的集群开始"抱怨"时,不妨用这套方法给它做个全面体检!