在了解了可以传递给Java 8虚拟机以使其具有容器意识的参数(即-XX:+ UnlockExperimentalVMOptions -XX:+ UseCGroupMemoryLimitForHeap)之后,我尝试将这些参数添加到我的Kubernetes部署中Spring Boot服务。
在部署YAML文件的容器部分中,我具有以下内容:
resources: requests: memory: "256Mi" cpu: "50m" limits:
memory: "512Mi" cpu: "200m" env: - name: JVM_OPTS value: "-Xms256M -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1"
在我的Dockerfile中,我有:
ENV JVM_OPTS="-Xmx256M" ENV JVM_ARGS="-Dspring.profiles.active=kubernetes" EXPOSE 8080 ENTRYPOINT [ "sh", "-c", "java $JVM_ARGS $JVM_OPTS -jar testservice.jar" ]
我似乎无法弄清楚为什么最大堆大小无法正确调整大小:
$ kubectl exec test-service-deployment-79c9d4bd54-trxgj -c test-service -- java -XshowSettings:vm -version' VM settings: Max. Heap Size (Estimated): 875.00M Ergonomics Machine Class: server Using VM: OpenJDK 64-Bit Server VM openjdk version "1.8.0_171" OpenJDK Runtime Environment (IcedTea 3.8.0) (Alpine 8.171.11-r0) OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)
我在这里做什么错了?
在本地Docker安装上,我可以看到正确设置了JVM最大堆:
$ docker run openjdk:8-jre-alpine java -Xms256M -Xmx512M -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm -version VM settings: Min. Heap Size: 256.00M Max. Heap Size: 512.00M Ergonomics Machine Class: server Using VM: OpenJDK 64-Bit Server VM openjdk version "1.8.0_171" OpenJDK Runtime Environment (IcedTea 3.8.0) (Alpine 8.171.11-r0) OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)
答案 0 :(得分:3)
在容器中运行java -XshowSettings:vm -version
时,JVM_OPTS
不包含在命令中。
尝试这个
kubectl exec test-service-deployment-79c9d4bd54-trxgj -c test-service \
-- sh -c 'java $JVM_OPTS -XshowSettings:vm -version'
答案 1 :(得分:0)
我唯一看到的是您缺少的是Kubernetes pod定义上命令行参数的实际最大值。您正在将其传递到docker run ...
命令行:
env:
- name: JVM_OPTS
value: "-Xms256M -Xmx512M -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1"
代替:
env:
- name: JVM_OPTS
value: "-Xms256M -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1"
答案 2 :(得分:0)
从docker文件构建docker映像时,将解析Java env变量并将其传递给enterypoint,然后使用解析后的值构建映像。您的dockerfile中有哪些:
JVM_OPTS="-Xmx256M"
JVM_ARGS="-Dspring.profiles.active=kubernetes"
如果要对Java参数使用kubernetes env变量,则将入口点指定为script.sh
,在script.sh
中使用env变量,而不是在kubernetes中运行映像时将解析该变量在构建时。