温馨提示×

centos k8s如何进行性能测试

小樊
31
2025-12-31 11:33:46
栏目: 智能运维

CentOS 上 Kubernetes 性能测试实操指南

一 目标与指标

  • 性能测试应围绕三大目标:保障集群稳定性、提升资源利用率、验证服务响应能力。建议以明确的SLI/SLO约束测试边界,例如控制面 API 延迟、Pod 启动延迟、服务 P95/P99 延迟与错误率等。
  • 建议重点采集与判定如下指标:
    • 集群基础:节点 CPU/内存/磁盘/网络利用率与饱和度。
    • 调度性能:Pod 启动延迟调度成功率、调度吞吐。
    • API 与 etcd:API 请求延迟/速率、etcd 健康与 Watch 延迟。
    • 应用层:QPSP95/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-IPNodePort
    • 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.creationTimestampkubectl 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 延迟

0