控制节点Kube-API Server CPU占用过高原因排查及Grafana资源展示方法问询
控制节点Kube-API Server CPU占用过高原因排查及Grafana资源展示方法问询
老哥,咱们把问题拆成两部分来解决:一是排查第一个控制节点上kube-apiserver CPU占用过高的原因,二是在Grafana里展示节点、Pod、容器的资源消耗情况。
一、排查Kube-API Server CPU占用过高的可能原因
1. 先确认负载均衡的请求分布是否真的均匀
你用了Nginx的least_conn算法,但实际流量可能没按预期分发:
- 登录Nginx LB查看连接统计,确认三个控制节点的活跃连接数是否差距很大;
- 用
kubectl get endpoints kubernetes检查三个kube-apiserver的端点状态,有没有节点处于NotReady状态导致LB只往正常节点发流量; - 检查Nginx的会话保持配置,如果开启了会话粘性,可能导致某部分请求一直打在第一个节点。
2. 分析kube-apiserver的日志与请求特征
- 登录第一个控制节点,用
journalctl -u kube-apiserver -f(如果是systemd部署)实时查看日志,有没有频繁的错误请求、慢查询或者重复的List/Watch操作; - 如果开启了审计日志,检查审计日志里的请求来源,看有没有某个客户端(比如自定义控制器、监控工具或者错误的Pod)在高频调用API。
3. 对比三个节点的kube-apiserver配置
- 检查第一个节点的kube-apiserver启动参数,比如
--max-requests-inflight、--max-mutating-requests-inflight、审计日志级别、认证插件等,是否和另外两个节点不一致; - 比如如果第一个节点开启了更详细的审计日志(比如
--audit-log-level=request),会额外消耗大量CPU。
4. 监控API Server的性能指标
- 用
kubectl top pod -n kube-system对比三个节点上kube-apiserver Pod的CPU占用,确认是Pod层面的高消耗; - 直接访问API Server的metrics端点(比如
curl https://<节点IP>:6443/metrics --cert /etc/kubernetes/pki/apiserver.crt --key /etc/kubernetes/pki/apiserver.key),查看以下关键指标:apiserver_request_total:统计不同类型请求(GET/POST/PUT等)的数量,看是否有某类请求量异常高;apiserver_request_duration_seconds_bucket:查看请求延迟分布,慢请求会导致API Server长时间占用CPU;apiserver_current_inflight_requests:查看当前并发请求数,是否超过了节点的处理能力。
5. 检查节点本身的资源竞争
- 用
top或htop查看第一个控制节点上的其他进程,比如etcd(如果和API Server同节点部署)、kube-scheduler、kube-controller-manager等,是否也占用了大量CPU,导致API Server资源不足; - 如果etcd在第一个节点,检查etcd的性能(比如
etcdctl endpoint health、etcdctl watch / --prefix看是否有大量写入),etcd性能瓶颈会拖慢API Server,导致CPU飙升。
6. 排查集群内异常客户端行为
- 用
kubectl get events -A查看集群内的异常事件,有没有循环重启的Pod、错误的CRD控制器; - 检查是否有用户或工具在高频执行
kubectl命令,比如定时任务里的kubectl get pods --all-namespaces循环调用。
二、在Grafana中展示节点、Pod、容器的资源消耗
首先确保你已经部署了Prometheus,并且配置了node-exporter(采集节点指标)、kube-state-metrics(采集Kubernetes对象指标)、kubelet的metrics端点,把这些数据源接入Grafana。
1. 导入现成的Kubernetes监控Dashboard
Grafana社区有很多成熟的Kubernetes监控Dashboard,直接导入即可:
- 比如ID为13105的「Kubernetes Cluster Monitoring」,可以展示节点、Pod、容器的CPU/内存使用率,以及kube-apiserver的核心指标;
- 或者ID为8588的「Kubernetes API Server」,专门针对API Server的性能监控,能直观对比多个控制节点的API Server状态。
2. 自定义资源消耗图表
如果需要更个性化的展示,可以自己创建面板:
- 节点层面CPU使用率:使用PromQL查询
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100),按节点分组展示CPU使用率; - Pod层面CPU消耗:使用
kube_pod_container_resource_usage_cpu_cores{namespace="kube-system", pod=~"kube-apiserver.*"},筛选kube-system下的kube-apiserver Pod,对比三个节点的CPU占用; - 容器级别的资源监控:在上述Pod查询的基础上,加上
container标签,即可查看每个容器的CPU/内存使用情况。
3. 添加告警规则
可以在Grafana中配置告警,当某个kube-apiserver的CPU使用率超过阈值(比如80%持续5分钟)时触发告警,及时发现异常。
备注:内容来源于stack exchange,提问作者PeterWegner90
相关产品推荐
相关产品推荐

