【问题标题】:Is there any way to get stacktrace of process inside pod?有什么方法可以获取 pod 内进程的堆栈跟踪吗?
【发布时间】:2020-04-11 00:19:23
【问题描述】:

我正在尝试获取在 k8s pod 内运行的进程的堆栈跟踪。为此,我在其中安装了 gstack 二进制文件,但它没有给我任何输出。

这里是示例演示:

sh-4.3# gstack
Usage: gstack <process-id>
sh-4.3# sleep 100 &
[2] 1594
sh-4.3# gstack 1594
sh-4.3# gstack 1594 > test
sh-4.3# cat test
sh-4.3#

有人可以帮我吗?

PS:如果您也有其他方法来收集堆栈跟踪(除了 gstack),那也没关系。

【问题讨论】:

  • 您要检查堆栈跟踪的进程是什么?
  • 任何进程,比如说 sleep 命令,sleep 100。

标签: docker kubernetes gdb suse


【解决方案1】:

您应该以 root 身份连接到 pod 以查看跟踪。

使用最新的opensuse/tumbleweed 例如 pod

#suse-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: suse
spec:
  containers:
  - name: suse
    image: opensuse/tumbleweed
    command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]

以常规方式连接到 pod 并启动进程

suse:/ # kubectl exec suse -ti -- bash
suse:/ # sleep 100000&
[1] 677


suse:/ # ps aux | grep sleep
root         677  0.0  0.0   2324   764 pts/3    S    14:16   0:00 sleep 100000

检查:

suse:/ # gstack 677 --&gt; empty

suse:/ # gdb
(gdb) attach 677
Attaching to process 677
ptrace: Operation not permitted.

ptrace:不允许操作。

你可以做什么:

1) 你可以(和我一样)安装 3rd party awesome kubectl-plugins 并使用 kubectl ssh -u root [pod] 访问 root 下的 pod。

git clone https://github.com/jordanwilson230/kubectl-plugins.git
cd kubectl-plugins
./install-plugins.sh
source ~/.bash_profile
kubectl ssh -u root suse

Connecting...
Pod: suse
Namespace: NONE
User: root
Container: NONE
Command: /bin/sh

If you don't see a command prompt, try pressing enter.
sh-5.0# gstack 677
#0  0x00007f8eeb2a7603 in nanosleep () from /lib64/libc.so.6
#1  0x000055fd4fc88677 in ?? ()
#2  0x000055fd4fc88450 in ?? ()
#3  0x000055fd4fc85500 in ?? ()
#4  0x00007f8eeb201e0b in __libc_start_main () from /lib64/libc.so.6
#5  0x000055fd4fc855da in ?? ()


sh-5.0# gdb       
GNU gdb (GDB; openSUSE Tumbleweed) 8.3.1
(gdb) attach 677
Attaching to process 677
Reading symbols from /usr/bin/sleep...
(No debugging symbols found in /usr/bin/sleep)
Reading symbols from /lib64/libc.so.6...
(No debugging symbols found in /lib64/libc.so.6)
Reading symbols from /lib64/ld-linux-x86-64.so.2...
(No debugging symbols found in /lib64/ld-linux-x86-64.so.2)
0x00007f8eeb2a7603 in nanosleep () from /lib64/libc.so.6
Missing separate debuginfos, use: zypper install coreutils-debuginfo-8.31-2.2.x86_64

2) 你可以关注@mac answer

-找出它在 kubectl get po -n [NAMESPACE] -o wide 上运行的节点

-ssh 节点

-找到 docker 容器 sudo docker ps | grep [命名空间]

-以root身份登录容器 sudo docker exec -it -u root [DOCKER ID] /bin/bash

希望对你有帮助

【讨论】:

  • 嗨@VKR,感谢您的努力,我也尝试过使用给定插件的root用户,但它仍然给我权限被拒绝错误,如果您有其他方法,请帮助我。
  • 描述你的具体配置,你用的是什么镜像?了解所有详细信息、已执行的步骤和日志会很容易
  • 我在 pod 中使用 debian:8.7 os,我无法访问在我们的环境中运行该 pod 的节点,我想像你对 sleep 命令一样获取堆栈跟踪。跨度>
  • 刚刚用 kubectl plugins + debian jessie 复制 - 结果对我来说是一样的。我可以附加到进程并查看所有痕迹。可能您必须提供有问题的所有步骤和输出。
  • 我不能给你整个dockerfile,但是你是怎么安装gdb的?我已经使用这个命令安装了它:“zypper install gdb”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2011-06-15
  • 1970-01-01
  • 2010-10-11
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多