• K8S java应用jvm内存诊断解决方案:java应用诊断和在线debug利器bistoury介绍及在K8S环境中的使用


    Bistoury介绍

    Bistoury 是去哪儿网开源的一个对应用透明,无侵入的java应用诊断工具,用于提升开发人员的诊断效率和能力,可以让开发人员无需登录机器或修改系统,就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面对应用进行诊断,提升开发人员诊断问题的效率和能力。

    Bistoury 集成了Alibaba开源的arthas和唯品会开源的vjtools,因此arthas和vjtools相关功能都可以在Bistoury中使用。
    Arthas和vjtools通过命令行或类似的方式使用,Bistoury在保留命令行界面的基础上,还对很多命令提供了图形化界面,方面用户使用。

    Bistoury 英文解释是外科手术刀,含义也就不言而喻了。

    Screenshots

    通过命令行界面查看日志,使用arthas和vjtools的各项功能
    console

    在线debug,在线应用调试神器
    debug

    线程级cpu监控,帮助你掌握线程级cpu使用率
    jstack_dump

    在web界面查看JVM运行信息,以及各种其它信息
    jvm

    动态给方法添加监控
    monitor

    线程dump
    thread_dump

    Bistoury架构分析

    Bistoury核心组件包含agent,proxy,ui:

    • agent : 与需要诊断的应用部署到一起,负责具体的诊断命令执行,通过域名连接proxy
    • proxy:agent的代理,agent启动时会通过ws和proxy连接注册,proxy可以部署多个,推荐使用域名负载
    • ui:ui提供图形化和命令行界面,接收从用户传来的命令,传递命令给proxy,接收从proxy传来的结果并展示给用户。

    img

    一次命令执行的数据流向为 ui -> proxy -> agent -> proxy -> ui

    具体分析一下:

    • proxy 先启动,将自己地址注册到zk
    • agent通过域名访问proxy,随机分配到一个proxy,在proxy注册自己
    • UI 访问一个具体的应用时,通过zk拿到所有的proxy,然后依次检查app对应的agent是否在该proxy,如果在,web网页连接这个proxy
    • web上输入一个命令:web->proxy->agent->proxy->ui

    具体参见 https://github.com/qunarcorp/bistoury/blob/master/docs/cn/design/design.md

    bistoury原理分析: https://www.jianshu.com/p/f7202e490156

    总结下就是使用类似skywalking那样的agent技术,来监测和协助运行在JVM上的程序。

    Bistoury快速开始

    官方有一个快速开始文档: https://github.com/qunarcorp/bistoury/blob/master/docs/cn/quick_start.md

    可以下载release包快速启动,就可以体验了。

    首先我们将快速启动包 bistoury-quick-start.tar.gz 拷贝到想要安装的位置。

    然后解压启动包:

    tar -zxvf bistoury-quick-start.tar.gz
    cd bistoury
    
    • 1
    • 2

    最后是启动 Bistoury,因为 Bistoury 会用到 jstack 等操作,为了保证所有功能可用,需要使用和待诊断 JAVA 应用相同的用户启动。

    假设应用进程 id 为 1024

    • 如果应用以本人用户启动,可以直接运行
    Copy./quick_start.sh -p 1024 start
    
    • 1
    • 如果应用以其它帐号启动,比如 tomcat,需要指定一下用户然后运行
    sudo -u tomcat ./quick_start.sh -p 1024 start
    
    • 1
    • 停止运行
    ./quick_start.sh stop
    
    • 1

    Bistoury 在docker运行

    官方的git仓库里,有一个docker分支,翻阅后找到相关文档。

    官方的快速启动命令:

    #!/bin/bash
    #创建网络
    echo "start create network"
    docker network create --subnet=172.19.0.0/16 bistoury
    #mysql 镜像
    echo "start run mysql image"
    docker run --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d -i --net bistoury --ip 172.19.0.7  registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-db
    #zk 镜像
    echo "start run zk image"
    docker run -d -p 2181:2181 -it --net bistoury --ip 172.19.0.2 registry.cn-hangzhou.aliyuncs.com/bistoury/zk:latest
    sleep 30
    #proxy 镜像
    echo "start run proxy module"
    docker run -d -p 9880:9880 -p 9881:9881 -p 9090:9090 -i --net bistoury --ip 172.19.0.3 registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-proxy --real-ip $1 --zk-address 172.19.0.2:2181 --proxy-jdbc-url jdbc:mysql://172.19.0.7:3306/bistoury
    #ui 镜像
    echo "start run ui module"
    docker run -p 9091:9091  -it -d --net bistoury --ip 172.19.0.4 registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-ui --zk-address 172.19.0.2:2181 --ui-jdbc-url jdbc:mysql://172.19.0.7:3306/bistoury
    #boot 镜像
    echo "start run demo application"
    docker  run -it -d  -p 8686:8686 -i --net bistoury --ip 172.19.0.5 registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-demo --proxy-host $1:9090
    docker  run -it -d  -p 8687:8686 -i --net bistoury --ip 172.19.0.6 registry.cn-hangzhou.aliyuncs.com/bistoury/bistoury-demo --proxy-host $1:9090
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    上面的命令不能直接运行,$1是需要替换成当前服务器IP,然后再运行就OK了。

    Bistoury 在生产环境运行

    官方推荐部署方式:

    • ui 独立部署,推荐部署在多台机器,并提供独立的域名
    • proxy 独立部署,推荐部署在多台机器,并提供独立的域名
    • agent 需要和应用部署在同一台机器上。推荐在测试环境全环境自动部署,线上环境提供单机一键部署,以及应用下所有机器一键部署
    • 独立的应用中心,管理所有功能内部应用和机器信息,这是一个和 Bistoury 相独立的系统,Bistoury 从中拿到不断更新的应用和机器信息

    这里有个关键的点,应用中心,Bistoury内置了一个简单的应用中心,Bistoury里代码对应bistoury-application,ui和proxy都通过这个工程获取应用信息,官方默认实现了一个mysql版本的:

    application

    使用mysql的缺点是,你需要ui界面里手动维护应用以及应用的服务器,做个demo还OK,生产环境肯定不行。更优雅的方式是,用户系统应该在启动时自动注册到注册中心上,汇报自己的应用、机器信息(ip、域名等)、端口等信息。当然这个对大部分微服务架构来说,注册中心是标配的,因此实现一套bistoury-application-api接口即可。

    bistoury-application-k8s(Bistoury on K8S)

    我们项目组所有的应用都部署在K8S环境,因此要实现一个bistoury-application-k8s

    拷贝bistoury-application-mysql项目,建立bistoury-application-k8s

    简单对应下:

    • 一个应用对应一个deployment,对应一个application
    • 一个deployment里有n个pod,对应applicationServer

    所以,我们只需要调用调用K8S API 获取deployment和pod即可。

    首先引入相关jar包:

    <dependency>
        <groupId>io.kubernetesgroupId>
        <artifactId>client-javaartifactId>
        <version>8.0.0version>
        <scope>compilescope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    初始化ApiClient

    ApiClient defaultClient = Configuration.getDefaultApiClient();
    defaultClient.setBasePath(k8sApiServer);
    ApiKeyAuth BearerToken = (ApiKeyAuth) defaultClient.getAuthentication("BearerToken");
    BearerToken.setApiKey(k8sToken);
    BearerToken.setApiKeyPrefix("Bearer");
    defaultClient.setVerifyingSsl(false);
    <
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    你绝对不知道的接口加密解决方案:Python的各种加密实现
    【Vue】Axios取消请求
    flutter 消息并发时处理,递归查询
    MySQL基本操作之记录增删改查
    获取spring容器中的bean实例
    企业微信hook接口协议,ipad协议http,发送大视频文件
    2022-08-18 JDBC
    2024年6月2日 (周日) 叶子游戏新闻
    Java的基础语法(三)
    我绘制文章插图的三个神级工具
  • 原文地址:https://blog.csdn.net/a772304419/article/details/126639288