CentOS 上 Kubernetes 性能测试实操指南
一 目标与指标
- 性能测试应围绕三大目标:保障集群稳定性、提升资源利用率、验证服务响应能力。建议以明确的SLI/SLO约束测试边界,例如控制面 API 延迟、Pod 启动延迟、服务 P95/P99 延迟与错误率等。
- 建议重点采集与判定如下指标:
- 集群基础:节点 CPU/内存/磁盘/网络利用率与饱和度。
- 调度性能:Pod 启动延迟、调度成功率、调度吞吐。
- API 与 etcd:API 请求延迟/速率、etcd 健康与 Watch 延迟。
- 应用层:QPS、P95/P99 延迟、错误率。
- 扩展性:HPA 触发→新 Pod Ready时间、扩容过程请求丢弃率、缩容优雅终止成功率。
- 监控体系建议采用Prometheus + Grafana,覆盖cAdvisor/kube-state-metrics/Node Exporter等数据源,便于以PromQL做容量与异常判定与告警。
二 环境与工具链
- 监控与可视化:部署Prometheus Operator(kube-prometheus-stack)一键纳管Prometheus/Alertmanager/Grafana,并添加Node Exporter、kube-state-metrics抓取节点与编排层指标;Grafana 导入官方或自定义K8s 仪表盘用于观测。
- 负载与压测工具:
- HTTP/协议:k6、Locust、Fortio、Vegeta(覆盖基线、峰值、稳定性与延迟分布)。
- 集群规模/调度:Clusterloader2(官方可扩展性与性能测试框架,覆盖 Pod 密度、调度吞吐、启动延迟等)。
- 极限规模仿真:Kubemark(通过 hollow node 模拟大规模集群,评估控制面临界)。
- 混沌工程:在功能与性能基线稳定后引入Chaos Mesh/Litmus,注入网络延迟、Pod 杀掉、磁盘故障等,验证韧性与SLO 违背时的表现。
三 测试场景与步骤
- 基线健康检查
- 确认节点就绪:
kubectl get nodes;系统组件运行:kubectl get pods -n kube-system。
- 部署Nginx示例(3 副本)并暴露 Service(NodePort 或 LoadBalancer),访问验证;临时 Pod 做连通性测试:
kubectl run test-pod --image=busybox --rm -it --restart=Never -- wget -O- http://<nginx-pod-ip>。
- 应用层压力与峰值
- 以k6/Locust/Fortio/Vegeta对服务发起并发请求,记录P50/P95/P99、RPS、错误率;逐步提升并发与持续时间,观察水平扩展(HPA)是否按策略生效(如 CPU 平均利用率目标50%~70%)。
- 调度与密度
- 使用Clusterloader2执行Pod 密度与调度吞吐测试,观察在高密度(如节点资源使用率接近85%)时调度成功率、Pod 启动延迟、kubelet GC 频率与调度器 CPU占用。
- 控制面与 etcd 稳定性
- 在压测同时抓取API 请求延迟/速率与etcd相关指标,关注Mutating/Read-only API延迟是否超出阈值(例如社区常见阈值:Mutating < 1s、Read-only < 30s),并排查Watch 积压与鉴权/准入开销。
- 网络与存储专项
- 网络:在测试命名空间内使用iperf3/netperf验证带宽/延迟/抖动;如启用NetworkPolicy/CNI 策略,验证策略对吞吐与 P95的影响。
- 存储:对 PV/PVC 挂载点使用fio测试IOPS/吞吐量/延迟,对比本地盘/云盘/分布式存储差异。
- 弹性与韧性
- 在持续压测中触发HPA扩容与节点故障/网络延迟等混沌,验证扩容完成时间、请求丢弃率与优雅终止成功率,确保SLO满足要求。
四 监控 告警与结果分析
- 监控搭建
- 通过Helm安装kube-prometheus-stack,确认Node Exporter、kube-state-metrics、cAdvisor指标被抓取;Grafana 导入K8s 集群/节点/Pod仪表盘,建立单指标面板与业务关键路径视图。
- 关键告警示例(PromQL)
- CPU 过载:
sum(rate(container_cpu_usage_seconds_total{namespace="prod"}[5m])) by (pod) > 0.8
- Pod 重启率高:
rate(kube_pod_container_status_restarts_total[15m]) > 0.1
- 深度分析
- 使用perf/火焰图定位kube-apiserver/etcd热点函数;通过Jaeger/OTel采集分布式追踪,识别N+1 查询/慢依赖导致的P99长尾。
五 快速命令清单
- 部署与连通性
kubectl apply -f nginx-deployment.yaml && kubectl apply -f nginx-service.yaml
kubectl get svc nginx-service(获取 EXTERNAL-IP 或 NodePort)
kubectl run test-pod --image=busybox --rm -it --restart=Never -- wget -O- http://<nginx-pod-ip>
- 压测与扩缩容
- k6:
k6 run script.js(脚本内设定vus/rps/持续时间与阈值)
- HPA:
kubectl apply -f nginx-hpa.yaml && kubectl get hpa(观察CURRENT/DESIRED REPLICAS变化)
- 集群负载与规模
- Clusterloader2:
./clusterloader2 run --testconfig=density.yaml --provider=local --nodes=3 --report-dir=/results
- 监控与观测
- Grafana:登录 http://:3000,添加Prometheus数据源并导入K8s 仪表盘
- 事件与日志:
kubectl get events --sort-by=.metadata.creationTimestamp、kubectl logs <pod> -n <ns>
- 网络/存储专项
- iperf3:
kubectl run iperf3-server --image=networkstatic/iperf3 --rm -it --restart=Never -- -s
- iperf3 客户端:
kubectl run iperf3-client --image=networkstatic/iperf3 --rm -it --restart=Never -- -c <server-pod-ip> -t 30 -P 4
- fio:
kubectl run fio --image=alpine/fio --rm -it --restart=Never -- fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=4k --numjobs=4 --size=1G --runtime=60 --time_based
- 混沌注入(示例)
- Chaos Mesh:
kubectl apply -f network-delay.yaml(对匹配 app=payment-service 的 Pod 注入500ms 延迟)