项目设计
需求:外部分析器工具连接到运行在 kubernetes 集群上 Java pod 的 JVM,通过 jprofiler 暴露其接口,可以直接连接至这个 java pod
问题解决
Jprofiler 如何在 kubernetes 集群中运行:
- 方法1:打包至业务Pod容器内
- 缺点:需要侵入业务Pod内,不方便
- 方法2:使用 Init Container 将 JProfiler 安装复制到 Init Container 和将在 Pod 中启动的其他容器之间共享的卷
- 方法3:使用 sidecar 方式 共享业务Pod与 sidecar 共享名称空间
- 缺点:涉及到容器共享进程空间,与 jprofiler-agent 机制问题,所以需要共享 /tmp 目录
JProfiler finds JVMs via the “Attach API” that is part of the JDK. Have a look at the
$TMP/hsperfdata_$USER
directory, which is created by the hot spot JVM. It should contain PID files for all running JVMs. If not, delete the directory and restart all JVMs.
使用 Init Container 实施步骤
先决条件
假设已存在 Java 应用程序 deployment,我们还需要一个 JProfiler 镜像。如果您没有 JProfiler 镜像,这里有一个可用于构建映像的Dockerfile示例
|
|
与业务Pod配置
更改应用程序的部署配置如下:
- 如果尚未定义,请在 “spec.template.spec” 下添加 “volumes” 部分并定义一个新卷:
|
|
如果尚未定义,请在“spec.template.spec” 下添加 “initContainers”(Kubernetes 1.6+),并使用 JProfiler 的镜像定义 Init Container 将 Init container 中的文件复制到共享目录
|
|
将 jprofiler-agent 添加到 JVM 启动参数。
|
|
完整的Deployment 示例
|
|