监控容器内的JVM

一,不使用k8s,仅仅使用docker

目前测试可行办法是HOST为宿主机ip,network_mode为"host"
如下:
entrypoint.sh HOST为宿主机ip


```bash
#!/usr/bin/env bash
set -x

JMX_PORT=9010
HOST="172.31.32.13"

java \
  -Dsun.management.jmxremote.level=FINEST \
  -Dsun.management.jmxremote.handlers=java.util.logging.ConsoleHandler \
  -Djava.util.logging.ConsoleHandler.level=FINEST \
  -Dcom.sun.management.jmxremote.local.only=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.port=$JMX_PORT \
  -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT \
  -Dcom.sun.management.jmxremote.host=$HOST \
  -Djava.rmi.server.hostname=$HOST \
  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \
  -jar /opt/app/app.jar

并配合docker-compose.yml  networks:host

```bash
version: "2"
services:
  loop:
    build: .
    ports:
      - "9010:9010"
      - "5005:5005"
    network_mode: "host"

可以使用jvisaulvm远程连接
备注:当不使用network_mode:“host”
HOST:改为172.31.32.13,127.0.0.1 0.0.0.0 皆不通

二,监控k8s环境下的pod中的jvm

Step1 修改Deployment.yaml,添加以下System Properties

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=1100
-Dcom.sun.management.jmxremote.rmi.port=1100
-Djava.rmi.server.hostname=localhost

注意,-Djava.rmi.server.hostname一定要设置成localhost

Step2 修改Deployment.yaml,添加Container Port

containers:
- name: ...
  image: ...
  ports:
  - containerPort: 1100
    name: tcp-jmx

Step3 部署Deployment

Step4 利用kubectl转发端口

kubectl -n <namespace> port-forward <pod-name> 1100

Step5 启动VisualVm,创建JMX连接localhost:1100

或启动jconsole jconsole localhost:1100

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐