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

2021-02-20 11:09:17 浏览数 (1)

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

解决方法无非是白屏化:

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.gzn" && 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天以内就够了。

0 人点赞