当前位置: 首页 > 知识库问答 >
问题:

库伯内特斯部署中未解决环境变量Java

轩辕庆
2023-03-14

在了解了可以传递给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 max heap设置正确:

$ 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个答案

东门清夷
2023-03-14

这里具体情况的答案是在启动命令或启动脚本中缺少JVM_OPTS。不过,有关如何使用这些新选项的更多详细信息,请参见本问答。

蒋招
2023-03-14

在从docker文件构建docker映像时,会解析java env变量并将其传递给enterypoint,然后使用解析后的值构建映像。您的dockerfile中有:

JVM_OPTS=“-Xmx256M”

JVM_ARGS=“-Dspring.profiles.active=kubernetes”

如果您想对java参数使用kubernetes env变量,那么将entrypoint作为一些脚本。sh,并在脚本中。sh使用env变量,这些变量将在kubernetes中运行映像时解析,而不是在构建时解析。

罗伟兆
2023-03-14

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

试试这个

kubectl exec test-service-deployment-79c9d4bd54-trxgj -c test-service \
          -- sh -c 'java $JVM_OPTS -XshowSettings:vm -version'
 类似资料:
  • 我application.properties这样的列表: 现在我需要一个Kubernetes环境变量用于生产/dev/demo等。我的其他变量声明如下: 但是我该如何使用列表呢? 当然,拥有这样的用户不是好的做法,而是暂时的,只是一个概念验证应用程序。

  • 我正在尝试在Kubernetes集群(Azure AKS)中部署Flink作业。作业群集在启动后立即中止,但任务管理器运行正常。 docker镜像创建成功,没有任何异常。我可以运行docker镜像,也可以SSHdocker镜像。 我已经按照以下链接中提到的步骤: https://github.com/apache/flink/tree/release-1.9/flink-container/kub

  • 我有以下代码: 我创建了一个包含上述Python代码的映像的部署。 当我使用my Python代码不会创建sig文件指示,也不会打印“完成”消息。 点击此链接:https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace我看到k8s发送SIG

  • 我确实部署了单吊舱,自定义docker映像如下: 在开发过程中,我希望推送新的最新版本并更新部署。如果不明确定义标记/版本并为每个构建增加它,就找不到如何做到这一点,并且

  • 我只是在本地mac上使用mini kube设置kubernetes。 创建了一个类型为NodePort的服务,并且能够使用url

  • 我假设没有愚蠢的问题,所以这里有一个我找不到直接答案的问题。 现在的情况 我目前有一个运行1.15的Kubernetes集群。AKS上的x,通过Terraform部署和管理。AKS最近宣布Azure将在AKS上停用Kubernetes的1.15版本,我需要将集群升级到1.16或更高版本。现在,据我所知,直接在Azure中升级集群不会对集群的内容产生任何影响,即节点、豆荚、秘密和当前在那里的所有其他