【Kubernetes】K8S内Java应用如何开启远程JMX端口

要开启jmx远程调用,需要为应用设置以下启动参数,可以通过环境变量的方式,注入到应用的启动命令中,主要包含:

-Djava.rmi.server.hostname=$(_POD_IP_ADDRESS)
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6666
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false 

-Djava.rmi.server.hostname需要获取Pod的真实IP,也可以通过环境变量的方式添加

env:
  - name: _POD_IP_ADDRESS
    valueFrom:
      fieldRef:
        apiVersion: v1
        fieldPath: status.podIP

获取真实IP是根据k8s集群内的运行时状态得到的,不同的k8s集群配置,可能获取方式不一样。

修改Deployment描述文件:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: message-api
  namespace: message
spec:
  replicas: 1
  selector:
    matchLabels:
      name: message-api
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: message-api
        name: message-api
        version: dev
    spec:
      containers:
        - name: message-api
          image: harbor-xadd.test.xdf.cn/message/message-api:77
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          env:
            - name: TZ
              value: Asia/Shanghai
            - name: _POD_IP_ADDRESS
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
            - name: JMX_OPTS
              value: >-
                -Djava.rmi.server.hostname=$(_POD_IP_ADDRESS)
                -Dcom.sun.management.jmxremote
                -Dcom.sun.management.jmxremote.port=6666
                -Dcom.sun.management.jmxremote.ssl=false
                -Dcom.sun.management.jmxremote.authenticate=false 
          resources:
            limits:
              cpu: '2'
              memory: 6Gi
            requests:
              cpu: 100m
              memory: 1Gi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 20
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 3
  progressDeadlineSeconds: 60

修改Dockerfile,读取对应的环境变量

# 基础镜像使用java
FROM openjdk:8u332-jdk
# 作者
MAINTAINER zhurunhua 
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD target/message-api-1.0.0-Alpha-SNAPSHOT.jar app.jar
# JVM参数:k8s中pod的limit为6G,Xmx限制为limit的2/3,留一部分作为metaspace
ENV JAVA_OPTS="${JAVA_OPTS} -server -Xmx4096m -Xms4096m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"
ENV JAVA_OPTS="${JAVA_OPTS} -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC"
ENV JAVA_OPTS="${JAVA_OPTS} -XX:HeapDumpPath=/logs -Xloggc:/logs/gc.log"
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT exec java ${JAVA_OPTS} ${JMX_OPTS} -jar /app.jar

重新build镜像,并更新至Deployment中,在本地就可以进行可视化调试了。

【Kubernetes】K8S内Java应用如何开启远程JMX端口_第1张图片

你可能感兴趣的:(Kubernetes,Java,kubernetes,java,docker,jmx,jvisualvm)