Java 带有 Kubernetes 内存控制器的 jib-maven-plugin
Java jib-maven-plugin with Kubernetes memory controll
实际上我正在使用 jib-maven-plugin 为我的应用程序创建 Docker 容器。然后我将把它部署到 Google 服务器,我们有 Kubernetes 环境。
实际上我们正在玩 java 环境。来自 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>
现在我们想将这些配置移动到我们的 deployment 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 文件中,它们就无法正常工作。容器在没有任何上述设置影响的情况下启动。
我们正在使用 open JDK11,这可能也很重要。
如何控制 Java 环境。部署文件中的选项?
非常感谢您的帮助,祝您愉快!
将您的 jvm 参数移动到配置映射,并通过将其作为环境变量读取来从中初始化您的 pod。这是一个如何实现它的例子
问题是您设置的是 JAVA_OPTS
而不是 JDK_JAVA_OPTIONS
。
JAVA_OPTS
被某些应用程序服务器使用,例如 Tomcat,但 the JDK itself uses 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"
只是在另一个答案中添加一点。
对于那些使用 Java 9+(与 OP 一样)的用户,JDK_JAVA_OPTIONS
和 JAVA_TOOL_OPTIONS
(注意它既不是 JAVA_TOOLS_OPTIONS
、JAVA_TOOL_OPTS
,也不是JAVA_OPTS
) 可能会在此用例中工作,以在运行时预先添加选项。
对于那些使用 Java 8 的用户,只有 JAVA_TOOL_OPTIONS
有效。
实际上我正在使用 jib-maven-plugin 为我的应用程序创建 Docker 容器。然后我将把它部署到 Google 服务器,我们有 Kubernetes 环境。
实际上我们正在玩 java 环境。来自 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>
现在我们想将这些配置移动到我们的 deployment 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 文件中,它们就无法正常工作。容器在没有任何上述设置影响的情况下启动。
我们正在使用 open JDK11,这可能也很重要。
如何控制 Java 环境。部署文件中的选项?
非常感谢您的帮助,祝您愉快!
将您的 jvm 参数移动到配置映射,并通过将其作为环境变量读取来从中初始化您的 pod。这是一个如何实现它的例子
问题是您设置的是 JAVA_OPTS
而不是 JDK_JAVA_OPTIONS
。
JAVA_OPTS
被某些应用程序服务器使用,例如 Tomcat,但 the JDK itself uses 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"
只是在另一个答案中添加一点。
对于那些使用 Java 9+(与 OP 一样)的用户,JDK_JAVA_OPTIONS
和 JAVA_TOOL_OPTIONS
(注意它既不是 JAVA_TOOLS_OPTIONS
、JAVA_TOOL_OPTS
,也不是JAVA_OPTS
) 可能会在此用例中工作,以在运行时预先添加选项。
对于那些使用 Java 8 的用户,只有 JAVA_TOOL_OPTIONS
有效。