环境变量在 Kubernetes Java 部署中未解析



在了解了可以传递给Java 8虚拟机以使其具有容器感知能力的参数(即-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap(之后,我正在尝试将这些参数添加到Spring Boot服务的Kubernetes部署中。

在我的部署 YAML 文件的容器部分中,我有以下内容:

资源: 请求: 内存:"256英里" 中央处理器:"50M" 限制:
内存:"512Mi" 中央处理器:"200M" 环境: - 名称:JVM_OPTS 值: "-Xms256M -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1">

在我的 Dockerfile 中,我有:

ENV JVM_OPTS="-Xmx256M" ENV JVM_ARGS="-Dspring.profiles.active=kubernetes" 暴露 8080 入口点 [ "sh", "-c", "java $JVM_ARGS $JVM_OPTS -jar testservice.jar" ]

我似乎无法弄清楚为什么最大堆大小没有正确调整:

$ kubectl exec test-service-deployment-79c9d4bd54-trxgj -c test-service -- java -XshowSettings:vm -version' 虚拟机设置: 最大堆大小(估计(:875.00M 人体工程学 机器类别:服务器 使用 VM:OpenJDK 64 位服务器 VM OpenJDK 版本 "1.8.0_171" OpenJDK 运行时环境 (IcedTea 3.8.0( (Alpine 8.171.11-r0( OpenJDK 64 位服务器 VM(内部版本 25.171-b11,混合模式(

我在这里做错了什么?

在本地 Docker 安装中,我可以看到正确设置了 JVM 最大堆:

$ docker run openjdk:8-jre-alpine java -Xms256M -Xmx512M -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm -version 虚拟机设置: 最小堆大小: 256.00M 最大堆大小:512.00M 人体工程学 机器类别:服务器 使用 VM:OpenJDK 64 位服务器 VM OpenJDK 版本 "1.8.0_171" OpenJDK 运行时环境 (IcedTea 3.8.0( (Alpine 8.171.11-r0( OpenJDK 64 位服务器 VM(内部版本 25.171-b11,混合模式(

在容器中运行java -XshowSettings:vm -version时,命令中不包含JVM_OPTS

试试这个

kubectl exec test-service-deployment-79c9d4bd54-trxgj -c test-service 
-- sh -c 'java $JVM_OPTS -XshowSettings:vm -version'

在从 docker 文件构建 docker 镜像时,java env 变量被解析并传递给 enterypoint,然后使用解析的值构建镜像。您的 dockerfile 中的哪些是:

JVM_OPTS="-Xmx256M"

JVM_ARGS="-Dspring.profiles.active=kubernetes"

如果你想将 kubernetes env 变量用于 java 参数,那么将入口点作为一些script.sh,并且在script.sh中使用 env 变量,这些变量将在 kubernetes 中运行映像时解析,而不是在构建时解析。

此处特定情况的答案是缺少启动命令或启动脚本中的JVM_OPTS。但是,有关如何使用这些新选项的更多详细信息,请参阅此问题/答案。

最新更新