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

时间:2018-10-03 15:55:38

标签: java kubernetes

在了解了可以传递给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)

3 个答案:

答案 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中运行映像时将解析该变量在构建时。