Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么OpenJDK Docker容器忽略Kubernetes中的内存限制?_Docker_Kubernetes_Wildfly_Openjdk 11 - Fatal编程技术网

为什么OpenJDK Docker容器忽略Kubernetes中的内存限制?

为什么OpenJDK Docker容器忽略Kubernetes中的内存限制?,docker,kubernetes,wildfly,openjdk-11,Docker,Kubernetes,Wildfly,Openjdk 11,我正在Kubernetes 1.19.3上运行几个带有Docker映像的Java应用程序。Wildfly服务器在OpenJDK 11中运行,因此jvm支持容器内存限制(cGroup) 如果我设置了内存限制,那么在Kubernetes中运行时,容器将完全忽略该限制。但当我在plain Docker中运行它时,它在同一台机器上受到尊重: 1。在内存限制为300M的Docker中运行Wildfly: $ docker run -it --rm --name java-wildfly-test -p 8

我正在Kubernetes 1.19.3上运行几个带有Docker映像的Java应用程序。Wildfly服务器在OpenJDK 11中运行,因此jvm支持容器内存限制(cGroup)

如果我设置了内存限制,那么在Kubernetes中运行时,容器将完全忽略该限制。但当我在plain Docker中运行它时,它在同一台机器上受到尊重:

1。在内存限制为300M的Docker中运行Wildfly:

$ docker run -it --rm --name java-wildfly-test -p 8080:8080 -e JAVA_OPTS='-XX:MaxRAMPercentage=75.0' -m=300M jboss/wildfly:20.0.1.Final
验证内存使用情况:

$ docker stats
CONTAINER ID        NAME                 CPU %        MEM USAGE / LIMIT     MEM %       NET I/O       BLOCK I/O     PIDS
515e549bc01f        java-wildfly-test    0.14%        219MiB / 300MiB       73.00%      906B / 0B     0B / 0B       43
$ kubectl top pod java-wildfly-test
NAME                CPU(cores)   MEMORY(bytes)   
java-wildfly-test   1089m        441Mi 
正如预期的那样,容器不会超过300M的内存限制

2。以300M的内存限制在Kubernetes中运行Wildfly:

$ docker run -it --rm --name java-wildfly-test -p 8080:8080 -e JAVA_OPTS='-XX:MaxRAMPercentage=75.0' -m=300M jboss/wildfly:20.0.1.Final
现在我在kubernetes中启动相同的容器

$ kubectl run java-wildfly-test --image=jboss/wildfly:20.0.1.Final --limits='memory=300M' --env="JAVA_OPTS='-XX:MaxRAMPercentage=75.0'" 
验证内存使用情况:

$ docker stats
CONTAINER ID        NAME                 CPU %        MEM USAGE / LIMIT     MEM %       NET I/O       BLOCK I/O     PIDS
515e549bc01f        java-wildfly-test    0.14%        219MiB / 300MiB       73.00%      906B / 0B     0B / 0B       43
$ kubectl top pod java-wildfly-test
NAME                CPU(cores)   MEMORY(bytes)   
java-wildfly-test   1089m        441Mi 
300米的内存限制被完全忽略并立即超过

为什么会发生这种情况?这两个测试可以在同一台机器上执行

回答


高值的原因是从Project接收到的度量数据输出不正确。卸载kube项目并安装后,使用kubctl top正确显示所有数据。它现在显示与docker stats相同的值。我不知道为什么库伯·普罗米修斯计算了错误的数据。事实上,它为所有内存数据提供了双重值。

我把这个答案作为社区wiki,因为它可能对社区有帮助。Kubectl top显示的数据不正确。OP解决了卸载kube prometheus堆栈和安装metric服务器的问题

高值的原因是度量的输出不正确 从kube prometheus项目收到的数据。在卸载 kube projemet并安装公制服务器,所有数据均为 使用kubectl top正确显示。它现在显示的值与 docker统计数据。我不知道库伯·普罗米修斯为什么计算错了 数据。事实上,它为所有内存数据提供了双重值


我怀疑Docker和Kubelet使用不同的cgroup驱动程序运行。我如何检查这个?您运行的kubernetes的发行版是什么?我在Debian Buster上运行的自托管节点上安装了kubernetes。您使用的是哪个docker版本?我添加了自己的答案。原因是库贝·普罗米修斯的错误输出。使用kubernetes metric server解决了这个问题。