前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于jenkins的运维白屏化 - jvm dump

基于jenkins的运维白屏化 - jvm dump

原创
作者头像
保持热爱奔赴山海
修改2021-02-20 11:09:17
4.5K0
修改2021-02-20 11:09:17
举报
文章被收录于专栏:饮水机管理员饮水机管理员

日常运维工作中,很多重复性操作虽说都可以通过脚本去处理。但是如果不在电脑边就。

解决方法无非是白屏化:

1、自己写后端接口,然后对外暴露些api,传些参数去执行对应的逻辑。例如我们目前在用的django+antd

2、找开源的轮子,例如腾讯开源的蓝鲸,社区的jenkins

我们这里选择的是jenkins,主要是看中它比较轻量。

下面是一个采集java的pod的jvm dump数据的task。具体如下:

配图1
配图1
参数化构建
参数化构建
shell脚本接收上面的2个参数
shell脚本接收上面的2个参数

另外,需要注意的是,我这的pod的/log/ 路径是通过hostpath方式直接继承宿主机的。如果您的环境不是这样的话,可能需要修改脚本里面的dump存储路径。

generate.sh 内容如下(需要根据自己情况修改即可):

代码语言:javascript
复制
#!/bin/bash
# 获取k8s pod jvm dump数据(只抓取live),并上传到oss 

# 格式: sh xxxxx.sh ns1 microsvc-app-ccb479565-b5t8g

if [ $# -ne 2 ]; then
  echo -e "\n参数不对.用法: sh xxxxx.sh ns1 microsvc-app-ccb479565-b5t8g \n" && exit 10
fi

function check_ret() {
  if [ $? -ne 0 ] ; then
    exit 10
  fi 
}

# 用时间戳当版本号
ts=$(date +%s)

# 通过 prod-kubectl-01 去执行dump数据操作
echo "- name: dump出jvm数据
  gather_facts: False
  hosts: prod-kubectl-01
  user: root
  tasks:
   - name: dump数据
     shell: kubectl exec -ti -n ${NAMESPACE} ${POD_NAME} -- jmap -dump:live,format=b,file=/log/heap.hprof-${ts} 1" > dump.yml

ansible-playbook -i prod-kubectl-01, dump.yml
check_ret

# 获取对应pod的宿主机的ip全称
ip_mini=$(ssh root@prod-kubectl-01 "kubectl get pods -n ${NAMESPACE} ${POD_NAME} -o wide | tail -1 | awk '{print $7}' | egrep '[0-9]{5}' -o")
check_ret

NODE_IP=10.10.${ip_mini:2-7:2}.${ip_mini:0-3:3}
echo ${NODE_IP}


# ansible将机器的dump文件fetch到本地
tmp_var=${POD_NAME%-*}
program_dir=${tmp_var%-*}

echo "- name: fetch获取远程机器上的hprof文件
  gather_facts: False
  hosts: all
  user: root
  tasks:
   - name: 将压缩文件回传到ansible机器
     fetch: src=/data/logs/${program_dir}/heap.hprof-${ts} dest=/tmp/fetched" > fetch_dump.yaml

ansible-playbook -i ${NODE_IP}, ./fetch_dump.yaml 
check_ret

# 压缩下文件,将文件上传到oss并给出下载链接
cd /tmp/fetched/${NODE_IP}/data/logs/${program_dir}
tar czf /tmp/heap.hprof-${ts}.tar.gz  heap.hprof-${ts}
bash /home/ansible-playbook/ossutil64/upload.sh /tmp/heap.hprof-${ts}.tar.gz

注意:

这里我用到了一个开源小软件ossutil64,用于将dump的数据传到oss上,便于给研发通过公网去下载。

这个upload.sh脚本很简单,大致如下:

代码语言:javascript
复制
#!/bin/bash

# 功能: 覆盖上传dump文件到中oss
# 写法:sh upload.sh /path1/file1.tar.gz

if [ $# -ne 1 ]; then
  echo -e "\n参数不对.用法: sh upload.sh /path1/file1.tar.gz\n" && exit 10
fi

filename=$1

cd /home/ansible-playbook/ossutil64/

chmod +x ossutil64

# 语法:  ./ossutil64 --update cp 本地文件 -r oss://oss-bucket名称
./ossutil64 --update cp $1 -r oss://你的bucketname >/dev/null

# 输出公网下载地址
pub_oss_prefix='https://你的bucketname.oss-cn-xxxx.aliyuncs.com/'

echo -e "\n公网下载地址(wget或者任意下载工具):" 
echo ${pub_oss_prefix}$(basename ${filename})
echo 

oss建议设置一个过期时间,这个临时dump文件,只需要存个7天以内就够了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
专用宿主机
专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档