首页 > 解决方案 > 带有 Kubernetes 内存控制的 Java jib-maven-plugin

问题描述

实际上,我正在使用jib-maven-plugin为我的应用程序创建 Docker 容器。然后我将把它部署到我们拥有Kubernetes环境的 Google 服务器上。

实际上,我们正在使用 java env。来自jib-maven-plugin的配置(pom.xml )的变量:

<jvmFlags>
  <jvmFlag>-XX:MinRAMPercentage=60.0</jvmFlag>
  <jvmFlag>-XX:MaxRAMPercentage=80.0</jvmFlag>
  <jvmFlag>-XX:+HeapDumpOnOutOfMemoryError</jvmFlag>
  <jvmFlag>-Djdk.tls.client.protocols="TLSv1,TLSv1.1,TLSv1.2"</jvmFlag>
</jvmFlags>

现在我们想将这些配置移动到我们的部署 yml文件中,我们发现如下内容:

env:
- name: JAVA_OPTS
  value: "-XX:MinRAMPercentage=60.0 -XX:MaxRAMPercentage=90.0 -XX:+HeapDumpOnOutOfMemoryError"
...
resources: 
    limits:
        memory: 512Mi
    requests:
        memory: 256Mi

但似乎如果我们从 jib-maven-plugin 的配置文件中删除这些配置并将它们移动到 yml 文件中,它们根本就不起作用。容器在没有上述设置的任何影响的情况下启动。

我们使用的是开放的 JDK 11,这可能也很重要。

如何控制 Java 环境。部署文件中的选项?

非常感谢您的帮助,祝您有美好的一天!

标签: kubernetesgoogle-kubernetes-enginejava-11jib

解决方案


问题是您正在设置JAVA_OPTS而不是JDK_JAVA_OPTIONS. JAVA_OPTS由一些应用服务器(如 Tomcat)使用,但JDK 本身使用 JDK_JAVA_OPTIONS

因此,一个工作的 Kubernetes yaml 将类似于:

apiVersion: apps/v1
kind: Deployment
metadata:
    ...
spec:
  template:
    metadata:
        ...
    spec:
      containers:
        - name: ...
          image: ...
          env:
            - name: JDK_JAVA_OPTIONS
              value: -XX:MinRAMPercentage=60 -XX:MaxRAMPercentage=80 -XX:+HeapDumpOnOutOfMemoryError -Djdk.tls.client.protocols="TLSv1,TLSv1.1,TLSv1.2"

推荐阅读