项目设计
需求:外部分析器工具连接到运行在 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 示例
|
|
一个完整的 deployment 详情
|
|
如何动态映射 Pod
需要连接 jprofiler-agent,在启动时作为进程启动,然后映射 jprofiler-agent 的 8849 端口
采用工具,pod-proixer,使用 haproxy 映射 Pod,并且提供 HTTP API,可以控制映射,与映射生效时间。
--jprofiler-port-name
,将会使用业务 Pod 配置的 Port name 来选择映射,而无需经过 ingress/gateway
下面是服务的部署清单
|
|