- https://kubernetes.io/docs/tasks/debug-application-cluster/debug-running-pod/#ephemeral-container
测试版本信息
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", BuildDate:"2021-07-15T21:04:39Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:53:14Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}
start k8s
minikube start --feature-gates=EphemeralContainers=true
start a simple java pod:
kubectl run arthas-demo --image=hengyunabc/atest:0.0.3
Dockerfile:
FROM openjdk:8-jdk
RUN wget https://arthas.aliyun.com/math-game.jar
ENTRYPOINT ["/bin/sh", "-c", "java -jar math-game.jar"]
Check pods status:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
arthas-demo 1/1 Running 0 5m58s
Debug ephemeral containers
kubectl debug -it arthas-demo --image=openjdk:8-jdk --target=arthas-demo
ps 可以看到进程,但是jps看不到,并且jstack -l失败
root@arthas-demo:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2392 744 ? Ss 10:00 0:00 /bin/sh -c java -jar math-game.jar
root 8 0.1 0.7 4054728 62724 ? Sl 10:00 0:10 java -jar math-game.jar
root 18 0.0 0.0 5756 3600 pts/0 Ss+ 10:00 0:00 bash
root 115 1.0 0.0 5756 3552 pts/0 Ss 11:50 0:00 bash
root 121 0.0 0.0 9396 3012 pts/0 R+ 11:50 0:00 ps aux
root@arthas-demo:/# jps
122 Jps
root@arthas-demo:/# jstack -l 8
8: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
尝试
尝试把应用容器里的 /tmp/hsperfdata_root/
目录复制到临时容器里,仍然失败:
root@arthas-demo:/# cp -r /proc/8/root/tmp/hsperfdata_root/ /tmp
root@arthas-demo:/# jps
148 Jps
8 jar
root@arthas-demo:/# jstack -l 8
8: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
5条答案
按热度按时间z0qdvdin1#
测试 jdk17
启动应用容器
doockerfile
用临时容器debug
临时容器的dockerfile
执行命令
然后在容器里直接执行jps是没有结果的,复制进程1的
/proc/1/root/tmp/hsperfdata_root/
到临时容器的/tmp
目录,才可以jps/jstack 成功。再在临时容器里测试 arthas:
结果attach时出错
Agent JAR not found or no Agent-Class attribute
:原因是arthas-boot把arthas文件下载到临时容器的
~/.arthas
目录里,但是这个在应用容器里是看不到的。要解决这个问题,要把arthas的文件放到应用容器能读取到的目录下。
比如放到
/proc/1/root
下。然后就可以attach成功了。
所以总结下来,本质上要解决两个问题:
最简便的办法是 临时容器能和应用容器共享
/tmp
目录。但kubectl命令好像无法指定,可能要用api的方式。z8dt9xmd2#
您好。按照您的思路,我在k8s中进行了尝试。希望通过边车模式,主容器与副容器共享/tmp目录,然后在主容器中运行Java程序,副容器运行arthas对主容器中应用进行监控。
yaml文件如下,是拉取了您前文中的镜像:
pod成功启动后,进入到副容器的/tmp目录下,下载arthas-boot.jar并运行,然后
cp -r /root/.arthas/ /tmp/
,得到如下界面,能够看到主容器中的java进程(进程号为6)但当输入数字1之后,仍然出现了跟您上面一样的报错信息
但是我已将两个容器共享了/tmp目录,并将安装arthas的副容器的
/root/.arthas/
文件移动到了/tmp目录下。请您赐教还可能是哪些方面的问题呢?谢谢
sy5wg1nm3#
@yjustdo 和 arthas查找 jar 目录有关。 要cd到 arthas目录下面执行启动。 出错的信息来看,还是应用进程加载不到 副容器里的文件的问题。 试下启动前增加
export ARTHAS_LIB_DIR=/tmp
,把arthas 下载lib目录配置到/tmp
下面。jk9hmnmh4#
谢谢。
cd arthas
后再执行java -jar arthas-boot.jar
,可以attach到进程上了bvuwiixz5#
用最新版本的 jattach 可以加载 agent,不过这个每个平台的二进制文件都不同,会增大复杂度和文件体积。
https://github.com/apangin/jattach/releases/tag/v2.0
另外,使用 jattach 仍然要把文件复制到 /proc/$pid/root/ 目录下。