k8s 集群中 Golang pprof 工具的使用

大家好啊,我是码财同行。

1. pprof 工具

熟悉 Golang 的同学都知道,这门语言做的比较好的一点就是工程化能力,周边工具支持的还算不错。Golang 中的 pprof 就是一个非常重要且实用的定位问题的好工具。

当我们在浏览器中访问 pprof 监听的 http 地址时,会有很多 Go 程序对应的信息展示出来,包括cpu、内存分配及占用、协程等,如下图的样子:

通过pprof 提供的信息,我们还能利用工具分析更详细的信息,比如火焰图:

这么强大的工具,自然我们也希望在各种环境中都能很方便的使用。

那么问题来了

最近查问题,需要访问我们部署在 k8s 集群上的服务器进程,查看进程上 pprof 提供的数据。

2. k8s 集群中的 pprof

有用过 k8s 的同学应该清楚,k8s 集群中服务器提供的服务都是属于内部的,包括我们要用的 pprof,是不能直接对外的。

如果要访问 k8s 内部提供的服务,可以有两种方式:

  1. NodePort 做端口映射,将内部的端口映射到外部可以访问的端口。
  2. Ingress 类似 Ngix 的代理。

这两种方式都需要提前配置好,然后由 k8s 暴露出来。

然而,我们集群中的 pprof 只是监听了一个地址,没有特殊的做 NodePort 或者 Ingress 配置,如果再去增加配置,然后重新部署,会比较麻烦。

一开始我的想法是 login 到 k8s 的pod 内部,在容器里 download 一个 Go,然后 go tool pprof 本地端口,直接本地调试,但是不如 web 页面直观。

后来通过 AI 及搜索,发现原来可以通过 kubectl 提供的 port-forward 做端口转发,直接在外部做代理。

用图来表示这个过程,就是和 k8s 集群的 API server 通信,来转发请求:

具体来讲,其实是由 kubectl 命令行工具通过 https 协议和 k8s 集群的 API server 通信,API server 将消息转发到特定 Pod 所在机器上的 Kubelet 进程,再由 kubelet 转发给 pod 内的容器进程。

比如我在 k8s 集群外的一台 IP 为 a.b.c.d 的机器上做一个转发代理,就可以这样

sql 复制代码
$ kubectl port-forward --address 0.0.0.0 game-miscserver-0 :65334
Forwarding from 0.0.0.0:40565 -> 65334

命令行中 65334 是目标进程(game-miscserver-0)监听的 pprof 端口,而 kubectl 会随机分配一个本地端口(也可以指定)来代理 pprof 的访问。

这样就可以在浏览器上访问机器 a.b.c.d 上的 40565 端口了:

bash 复制代码
http://a.b.c.d:40565/debug/pprof

这个地址的输出就是 pprof 的输出,非常方便快捷。

不得不说 k8s 集群的 API server 设计得还是蛮不错的,很多能想到的功能它都支持。

3. 扩展

除了实时访问 pprof,有的开源项目可以支持类似 metrics 一样定时收集 pprof 数据存入时序数据库如 clickhouse 等,这样我们就能收集服务器进程的历史 pprof 数据并在之后查看了。

大概流程如下:

这个想法我觉得挺好,目前还没在项目中实施,有机会会尝试一下。

相关推荐
啦啦右一1 小时前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien1 小时前
Spring Boot常用注解
java·spring boot·后端
盛派网络小助手3 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
∝请叫*我简单先生3 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
zquwei4 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
dessler5 小时前
Docker-run命令详细讲解
linux·运维·后端·docker
Q_19284999065 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
aherhuo5 小时前
kubevirt网络
linux·云原生·容器·kubernetes
ZSYP-S6 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring