前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >运维救星!一键开启k8s微服务OOM heapdump自动化之旅

运维救星!一键开启k8s微服务OOM heapdump自动化之旅

作者头像
SRE运维手记
发布2024-12-19 19:35:31
发布2024-12-19 19:35:31
14600
代码可运行
举报
文章被收录于专栏:SRE运维手记
运行总次数:0
代码可运行

前段时间我分享了一篇文章《开源!Pod高负载自动打印JAVA线程堆栈》,介绍了在微服务CPU高负载时,使用Arthas自动捕捉线程信息并推送到Chat的方法。有热心的小伙伴希望增加OOM自动推送堆栈的功能。经过对Arthas的调研发现,在微服务内存使用分析场景中,Arthas同样是通过heapdump来获取堆栈信息,这与使用jmap或Java参数的方式没有本质区别。此外,Pod的内存使用率高并不一定意味着JVM会触发OOM。因此,我更倾向于使用后者,因为它能够准确地在微服务发生OOM时触发heapdump。

01、背景

在k8s场景中,我们通常的做法是给多个微服务的Pod共享挂载持久化存储,用于存储OOM heapdump,这将会带来一些痛点,例如,强依赖持久化存储,如果持久化存储出现故障,将影响多个微服务正常启动,此外,运维通常需要打包heapdump文件,拉取并发送给开发人员,这种工作不仅枯燥乏味,还容易让运维人员感到心累。因此,我们希望在 OOM 生成 heapdump 文件时,不再依赖持久化存储,并能够将 heapdump 文件的下载链接直接推送给开发人员。本文将详细介绍如何实现这一目标。

02、效果展示

当微服务触发 OOM 时,会自动将 heapdump 文件打印到临时存储,并通过脚本将其压缩后上传至 MinIO 对象存储。上传完成后,系统会生成一个下载链接,并以机器人的通知形式发送到指定的群组。开发人员可以自行下载 heapdump 文件,无需为 Pod 挂载持久化存储,也无需运维人员的手动操作。效果图如下:

03、操作步骤

1. 首先需要在微服务基础镜像,做这两件事:

  • 创建目录(可以自定义,后面的步骤会用到)
代码语言:javascript
代码运行次数:0
复制
/data/javaHeapDump
/data/gc  # 不关注可不创建
  • 将脚本保存为dump2minio.sh,并放置到微服务基础镜像/data/javaHeapDump路径下,完整脚本内容请看《OOM heapdump自动化脚本
代码语言:javascript
代码运行次数:0
复制
#!/bin/sh
minio_url="http://oom-test.yilingyi.com"
kind="非生产环境"
if [[ "$ENV_PROFILES_ACTIVE" =~ 'prod' ]]
then
  minio_url="http://oom-prod.yilingyi.com"
  kind="生产环境"
fi
gc_share_url="Null"
dump_share_url="Null"
dump_dir=/data/
mc_util_path_url=/data/javaHeapDump/mc
dump_file_name=dump.hprof
## 企业微信通知
qy_url=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx
...<省略>...
  • 将minio的二进制文件 mc 放置到微服务基础镜像/data/javaHeapDump路径下
  • 在minio创建bucket,命名为java-dump

2. 完成上述准备工作后,在微服务的java启动指令添加如下参数(同样,不关注gc的可以不加-Xloggc:/data/gc/gc-%t.log),示例如下

代码语言:javascript
代码运行次数:0
复制
-Xloggc:/data/gc/gc-%t.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=/data/javaHeapDump/dump2minio.sh
-XX:HeapDumpPath=/data/javaHeapDump/dump.hprof

3. 在微服务的yaml配置注入变量ENV_SERVICE_NAME和ENV_PROFILES_ACTIVE,dump2minio.sh脚本需要用到,分别用于文件命名和识别所在环境。

代码语言:javascript
代码运行次数:0
复制
spec:
  ... ...
  template:
    metadata:
      ... ...
    spec:
      containers:
        - name: yilingyi
          image: 'xxxxx'
          ... ...
          env:
            - name: ENV_SERVICE_NAME
              value: yilingyi
            - name: ENV_PROFILES_ACTIVE
              value: test

04、结 语

完成上述操作后,便能让OOM heapdump不再依赖持久化存储,运维人员也无需再执行重复且枯燥的操作,一起让复杂的东西简单化,重复的事情自动化,本期分享就到这里,谢谢!

  • dump2minio.sh完整脚本内容请点击

OOM heapdump自动化脚本

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SRE运维手记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档