docker 中ulimit設定理解
背景:
在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