以下是 Arthas 排查 Kubernetes 中应用频繁挂掉重启异常的完整攻略。
确认场景
首先,需要确认场景。用户反馈应用经常挂掉重启,需要排查问题。该应用运行在 Kubernetes 集群中。需要确定:是所有的节点都有相同的问题,还是只有某个节点有问题。同时,需要定位是否是应用级别的问题。
安装 Arthas
因为需要使用到 Arthas 工具,所以需要先安装 Arthas。可以在 Arthas 官网 找到安装方式。这里介绍一种在 Kubernetes 集群中安装 Arthas 的方式。
在需要排查异常的机器上,创建一个需要被 debug 的容器,并且在启动该容器时打开 Arthas。
下面是一个例子:
apiVersion: v1
kind: Pod
metadata:
name: debug-container
spec:
containers:
- name: debug-container
image: your/image
command: ["/bin/sh", "-c", "java -jar /app.jar"]
ports:
- containerPort: 8080
volumeMounts:
- name: arthas
mountPath: /arthas
volumes:
- name: arthas
emptyDir: {}
在运行该配置文件启动容器之后,可以通过 kubectl exec 命令进入到 debug-container 容器中,并执行以下命令来启动 Arthas:
# 挂载 arthas.sh
$ curl -O https://alibaba.github.io/arthas/arthas-boot.jar
$ chmod +x arthas-boot.jar
# 启动 Arthas
$ java -jar arthas-boot.jar
确认问题
确认好场景并安装好 Arthas 后,就可以开始排查问题了。
对于容器中的应用,可以使用 Arthas 提供的命令来对应用进行 Debug。下面是一些常用的命令:
jvm
该命令可以查看容器中运行的 JVM 信息,例如版本、启动参数等。
$ jvm
sc
该命令可以查看容器中所有的类,包括类的描述、加载器以及路径等。
$ sc -d com.example.demo.service.UserServiceImpl
jad
该命令可以将一个类反编译成 Java 代码。
$ jad com.example.demo.service.UserServiceImpl
watch
该命令可以对某个类中的方法进行监控,当该方法被调用时可以打印日志。
$ watch com.example.demo.service.UserServiceImpl getUserById
trace
该命令可以对某个方法进行追踪,查看方法的调用过程。
$ trace com.example.demo.service.UserServiceImpl getUserById
示例
以下是两个使用 Arthas 排查 Kubernetes 中应用频繁挂掉重启异常的示例。
示例一:确认场景
我们的场景是:用户反馈应用经常挂掉重启,需要排查问题。该应用运行在 Kubernetes 集群中。需要确定:是所有的节点都有相同的问题,还是只有某个节点有问题。同时,需要定位是否是应用级别的问题。
我们先登录到 Kubernetes 集群所在的机器上,执行以下操作,启动 debug-container 容器:
apiVersion: v1
kind: Pod
metadata:
name: debug-container
spec:
containers:
- name: debug-container
image: your/image
command: ["/bin/sh", "-c", "java -jar /app.jar"]
ports:
- containerPort: 8080
volumeMounts:
- name: arthas
mountPath: /arthas
volumes:
- name: arthas
emptyDir: {}
然后,我们进入到该容器中,执行以下命令启动 Arthas:
$ curl -O https://alibaba.github.io/arthas/arthas-boot.jar
$ chmod +x arthas-boot.jar
$ java -jar arthas-boot.jar
进入到 Arthas 后,可以使用 jvm 命令查看 JVM 信息,例如版本、启动参数等。对于应用挂掉的问题,最常见的原因就是内存不足,导致 OOM 错误,因为这里是应用级别的问题,所以我们需要确认容器的内存使用情况。我们使用 top 命令可以查看容器的内存、CPU 使用情况。
$ top
如果确认是内存不足导致的异常,我们可以使用 Arthas 的 memory 命令进行内存分析,查看哪些对象占用了大量内存。以下是 memory 命令的使用方法:
$ memory
示例二:排查问题
假设我们已经确认是应用级别的问题导致挂掉,我们需要排查具体是哪个方法/代码导致的问题。
我们先登录到 Kubernetes 集群所在的机器上,执行以下操作,启动 debug-container 容器:
apiVersion: v1
kind: Pod
metadata:
name: debug-container
spec:
containers:
- name: debug-container
image: your/image
command: ["/bin/sh", "-c", "java -jar /app.jar"]
ports:
- containerPort: 8080
volumeMounts:
- name: arthas
mountPath: /arthas
volumes:
- name: arthas
emptyDir: {}
然后,我们进入到该容器中,执行以下命令启动 Arthas:
$ curl -O https://alibaba.github.io/arthas/arthas-boot.jar
$ chmod +x arthas-boot.jar
$ java -jar arthas-boot.jar
假设我们已经定位到问题所在的类和方法,例如:com.example.demo.service.UserServiceImpl.getUserById(),我们可以使用 watch 命令对该方法进行监控,打印日志帮助我们找出问题。
$ watch com.example.demo.service.UserServiceImpl getUserById
如果我们需要知道当前方法的调用过程,我们可以使用 trace 命令:
$ trace com.example.demo.service.UserServiceImpl getUserById
这样重复进行 1 到 2 即可找到具体问题的根本原因,最终确定具体解决方案。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Arthas排查Kubernetes中应用频繁挂掉重启异常 - Python技术站