获取 Azure Kubernetes 的线程转储/堆转储 pods

Taking Thread dump/ Heap dump of Azure Kubernetes pods

我们正在 运行 在 Azure kubernetes 上使用 java 编写我们的 kafka 流应用程序。我们是 kubernetes 的新手。要调试问题,我们需要获取 运行ning pod 的线程转储。

以下是我们进行转储所遵循的步骤。

  1. 使用以下 docker 文件构建我们的应用程序。

    FROM mcr.microsoft.com/java/jdk:11-zulu-alpine
    RUN apk update && apk add --no-cache gcompat
    RUN addgroup -S user1 && adduser -S user1 -G user1
    USER user1
    WORKDIR .
    COPY target/my-application-1.0.0.0.jar .
    
  2. 正在提交带有以下部署 yaml 文件的图像

api版本:apps/v1 种类:部署 元数据: 名称:我的应用程序-v1.0.0.0 规格: 复制品:1 选择器: 匹配标签: 名称:我的应用程序吊舱 应用程序:我的应用程序应用程序 模板: 元数据: 名称:我的应用程序吊舱 标签: 名称:我的应用程序吊舱 应用程序:我的应用程序应用程序 规格: 节点选择器: 代理池:代理池1 容器: - 名称:my-application-0 图片:myregistry.azurecr.io/my-application:v1.0.0.0 imagePullPolicy:始终 命令:[[java","-jar","my-application-1.0.0.0.jar","input1","$(connection_string)"] 环境: - 姓名:connection_string 值来自: 配置映射键参考: 名称:我的应用程序配置图 键:连接字符串 资源: 限制: cpu: "4" 要求: cpu: "0.5"

  1. 要将 shell 放入 运行 容器,您可以 运行 以下命令:

    kubectl exec -it -- sh

  2. 获取线程转储 运行ning 下面的命令

    jstack PID > threadDump.tdump

但是获取权限被拒绝错误

有人可以建议如何解决这个问题或采取 thread/heap 转储的步骤。 提前致谢

由于您可能需要本地线程转储,因此您可以绕过在 pod 中创建文件,直接将其流式传输到本地计算机上的文件:

kubectl exec -i POD_NAME -- jstack 1 > threadDump.tdump

如果您的线程转储很大,您可能需要考虑先通过管道传输到 pv 以获得漂亮的进度条。