如何在Kubernetes中为容器设置ulimit?(特别是ulimit-u)
您目前似乎无法设置ulimit,但这是一个悬而未决的问题:https://github.com/kubernetes/kubernetes/issues/3595
如果您能够ssh到kubernetes集群中,则可以修改docker.service
文件。
-
对于amazon EKS集群,文件位于CCD_ 2。
-
在文件中附加属性
LimitMEMLOCK=Infinity
,然后重新启动docker服务。sudo service docker restart
这将使docker容器具有无限的memlock值。可能与docker-cli等效的命令是:
docker run --ulimit memlock=-1:-1 <docker image>
在Kubernetes集群(AWS EKS)中,您可以通过修改容器运行节点中的/etc/docker/daemon.json来更改docker容器的ulimit。
在/etc/docker/daemon.json 中添加以下行
"默认ulimits":{"nofile":{"名称":"nofile","硬":128000,"软":12.8万}}
最后通过执行以下命令重新启动该节点上的docker服务。
服务docker重新启动
最重要的是对我不起作用。
我做了以下(它在ubuntu上工作:18.04和centos/7):
sudo nano /usr/lib/systemd/system/docker.service
增加
--default-ulimit memlock=-1:-1
至线路
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
这行必须看起来像:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit memlock=-1:-1
然后你必须正确地重新加载:首先运行命令
sudo systemctl daemon-reload
然后运行命令
sudo systemctl restart docker.service
要检查是否工作,请运行命令
docker run busybox:1.28 cat /proc/1/limits
你必须看到无限的最大锁定内存像这样:
...
Max locked memory unlimited unlimited bytes
...
弹性搜索开始工作了!!!!
如果你使用Kubernetes,你永远不需要memlock!!!!
如果您在Kubernetes中使用ElasticSearch,则使用以下环境变量进行配置:
bootstrap.memory_lock=false
假的!!!
您不需要在Kubernetes中设置memlock,因为Kubernete不使用交换文件运行。
如果操作系统提供给某些应用程序的RAM被刷新到磁盘的交换文件中,则某些应用程序(例如ElasticSearch)无法正常工作。因此,这些应用程序要求您阻止将内存刷新到磁盘。
如果交换文件在操作系统中被禁用,那么这些应用程序将永远不会遇到这个问题。这正是Kubernetes的情况,因为它需要在安装时禁用交换文件。
如果您使用的是Kubernetes,那么您不需要阻止内存刷新到磁盘,因为这永远不会发生。