要在 Kubernetes (k8s) 中使用 VisualVM 连接到运行在 Docker 容器中的 Java 程序,可以按照以下步骤进行操作:

启用 JMX

首先,需要在 Docker 容器中的 Java 应用中启用 JMX。可以通过在启动命令中添加以下 JVM 参数来实现:

1
2
3
4
5
6
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8999
-Dcom.sun.management.jmxremote.rmi.port=8999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=localhost

这些参数启用了 JMX 远程管理,并指定了端口和主机名。请注意,authenticate 和 ssl 参数被设置为 false,以便于调试。在生产环境中,建议启用认证和 SSL 加密。

修改 Kubernetes Deployment 配置

在 Kubernetes 的 Deployment 配置文件中,需要添加一个容器端口,以便将 JMX 端口暴露给集群外部。修改 Deployment.yaml 文件,添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-java-app
spec:
replicas: 3
selector:
matchLabels:
app: my-java-app
template:
metadata:
labels:
app: my-java-app
spec:
containers:
- name: my-java-app
image: my-java-app:latest
ports:
- containerPort: 8999
name: tcp-jmx

使用 kubectl 端口转发

由于 Kubernetes 集群中的 Pod IP 地址通常是动态分配的,直接从本地访问 Pod 的 JMX 端口可能会有困难。可以使用 kubectl port-forward 命令将 Pod 的 JMX 端口转发到本地主机:

1
kubectl -n <namespace> port-forward <pod-name> 8999:8999

连接 VisualVM

在本地启动 VisualVM,并创建一个 JMX 连接,连接到 localhost:8999。VisualVM 将通过端口转发连接到运行在 Kubernetes 中的 Java 应用,并提供性能监控和分析功能。

相关文章

【性能监控 APM 一】JMX && jstatd