为什么OpenJDK Docker容器忽略Kubernetes中的内存限制?
我正在Kubernetes 1.19.3上运行几个带有Docker映像的Java应用程序。Wildfly服务器在OpenJDK 11中运行,因此jvm支持容器内存限制(cGroup) 如果我设置了内存限制,那么在Kubernetes中运行时,容器将完全忽略该限制。但当我在plain Docker中运行它时,它在同一台机器上受到尊重: 1。在内存限制为300M的Docker中运行Wildfly:为什么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
$ 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解决了这个问题。