所以我在kubernetes里有一个elasticsearch集群。
它运行的机器有30 gb ram和8个内核。
现在根据经验法则,50%的内存是我们设定的 ES_JAVA_OPTS
剩余的用于文件缓存。这里是15GB
此外,在掌舵图中,我们还列出了如下所述的所需资源:
resources:
limits:
cpu: 8
memory: 15Gi
requests:
cpu: 8
memory: 15Gi
我的问题是50%的ram是主机的内存(30gb)还是helmchart中指定的15gb限制
有人能解释一下Kubernetes是怎么利用公羊的吗
因为如果主机和文件缓存不被认为是部署应用程序的利用,我们就可以了。但如果它在资源限制内,我需要增加到30gb。
编辑:
这里的问题是,如果一个elasticsearch节点使用50%的ram作为堆,50%作为文件缓存,我提到的堆是30gb机器中15gb(50%的ram)。因此,我应该提到部署模板中的资源限制是15gb左右,堆需要30gb(比如28gb),而elasticsearch需要能够缓存文件。
这就像pod在任何给定的时刻超过模板上提到的限制一样,kubernetes重新启动pod。
所以换句话说,我想知道ram文件缓存在pod的总体内存使用情况中是否起作用。
注意:我使用示例存储作为es数据的主存储,因为这与ebs相比非常快。
结论:
将堆的一半保留在系统中的ram中,并在资源限制中提及(如果有的话)
2条答案
按热度按时间5ssjco0h1#
我不是k8s和docker方面的Maven,但我的理解是,docker容器使用主机资源,使用资源限制您可以对它可以消耗的资源有一个硬限制。
如果将资源限制设为15gb,则docker容器将消耗15gb的主机ram。现在,它是否与主机共享文件系统缓存取决于您如何配置docker卷。
因为docker容器可以选择使用绑定卷与主机共享文件系统,或者拥有自己的数据卷(这是暂时的,不适合作为有状态应用程序的es)。在第一个选项中,它应该与主机共享文件系统缓存,您不应该进一步增加资源限制(建议您使用有状态的es),在第二个选项中,由于它将使用自己的文件系统,您必须为其文件系统缓存分配ram,并且必须将ram增加到30 gb,但是您也必须为主机操作系统提供一些空间。
eanckbw92#
容器将始终看到节点的内存,而不是容器的内存。在kubernertes中,即使为容器设置了内存限制,容器本身也不知道这个限制。
这会影响应用程序查找系统上可用的内存,并使用该信息决定要保留的内存。
这就是为什么要设置jvm堆大小。如果不指定这个值,jvm将根据主机/节点的总内存设置最大堆大小,而不是根据容器的可用内存(您已经声明为limit)。
看看这篇关于k8s中极限是如何工作的文章。