背景:
在k8s上跑es集群碰到的问题
- OS版本 红旗4.5(基于centos6.8 内核)
- Docker:1.17.02
现象:
本次出现的问题现象:es pod启动失败,一直报max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
我们知道这个问题就是容器中的ulimit不对,只获得默认的值:4096
现象搞清楚后,解决问题就很简单了,方法很多。后面细说。
总结:
一句话总结:当服务器重启后,Docker daemon随之系统启动而启动,当启动Container时,因未获取到主机设置的ulimit值而导致启动后一会儿就失败了,重启Docker Deamon后解决(ps:这不是解决问题的方法,这只是瞎猫撞到死耗子)。
解决方法
探讨centos7下的ulimit
1), centos7 采用systemd进行系统初始化,自动会调用systemd下的启动脚本docker.service,其申明默认值如下:
[Service]
ExecStart=/usr/bin/docker -d -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
2)centos6的话,docker daemon启动,并未设置默认值。参考:sysvinit-redhat
优雅解决
经过上面的讨论,相应把问题应该说清楚了,也解释清楚了。那么centos6下,除了上述的手动重启docker daemon方法解决外,还有其他方法吗?答案是肯定的,有很多方法,这里简要说一种吧,思路类似。
即:若使用sysV服务,则在/etc/init.d/functions最开头添加一行:ulimit -u 204800 -HSn 204800
原理为:docker服务启动脚本第一行会去执行它。
[guansheng@xx-xx-xx-yf-core ~]# ll /etc/rc.d/rc3.d/ |grep docker
<wbr> lrwxrwxrwx 1 guansheng root 16 Jul 3 19:25 S95docker -> ../init.d/docker