要开启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 <zhurunhua@xdf.cn>
# 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中,在本地就可以进行可视化调试了。