实际上,我正在使用jib-maven插件为我的应用程序创建Docker容器。然后我将把它部署到谷歌服务器上,在那里我们有一个Kubernetes环境。
实际上,我们在玩java环境。jib-maven插件的配置(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插件的配置文件中删除这些配置,并将它们移到yml文件中,它们似乎根本不起作用。容器启动时不会受到上述设置的任何影响。
我们使用的是开放式JDK 11,这可能也很重要。
如何控制Java环境。部署文件中的选项?
非常感谢你的帮助,祝你今天愉快!
问题是您设置的是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"
只是在另一个答案上添加一点。
对于那些使用Java 9+(与OP一样(的用户,JDK_JAVA_OPTIONS
和JAVA_TOOL_OPTIONS
(注意它既不是JAVA_TOOLS_OPTIONS
、JAVA_TOOL_OPTS
,也不是JAVA_OPTS
(在本用例中都可能在运行时准备选项。
对于那些使用Java 8的用户,只有JAVA_TOOL_OPTIONS
可以工作。
将jvm参数移动到配置映射,并通过将其作为env变量读取来从中初始化pod。下面是一个如何实现的例子
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#define-使用配置映射数据的容器环境变量