Docker 引擎 ulimits 設定

起因


最先看到這個問題現象是由於在 Docker EE UCP 叢集環境內,下達執行 kubectl 任何子命令操作都卡住,幾乎沒有相應動作。之前這個 UCP 叢集已經運維了好一陣子,都沒有什麼問題,情況來得很突然。

然而,在此容器叢集中,已經既有運行的容器以及服務狀態依然是好的。

過程

容器平台上原先狀態都是好的。後來從當時出問題的節點的 Docker engine 先開始著手調查, 以 CentOS / RHEL 來說,Docker engine 的日誌預設是輸出在作業系統 /var/log/message 這個文件,打開這個文件可以看到類似如下的內容:

 29926 Oct  9 08:04:13 docker2 dockerd: time="2019-10-09T08:04:13.139170059+08:00" level=warning msg="failed to retrieve runc version: pipe2: too many open files"

 29927 Oct  9 08:04:13 docker2 dockerd: time="2019-10-09T08:04:13.139732508+08:00" level=warning msg="failed to retrieve docker-init version: pipe2: too many open files"

 30208 Oct  9 08:06:01 docker2 dockerd: time="2019-10-09T08:06:01.294335790+08:00" level=error msg="Failed to create an ipvs handle for sosbox ingress (ingress,/var/run/       docker/netns/ingress_sosbox) for lb removal: too many open files"

 30209 Oct  9 08:06:02 docker2 dockerd: http: Accept error: accept unix /var/run/docker.sock: accept4: too many open files; retrying in 1s

有很多的 "too many open files" 出現在日誌文件中。

因此試著修改 ulimit 的設定值。

在 CentOS / RHEL 環境下,可修改
/etc/systemd/system/docker.service.d/docker.service
下的配置文件裡的參數,修改保存好後,以 systemd restart 重新啟動 daemon ,
但是沒有起到效果,如此進行反而造成該 UCP 節點無法加入叢集,整個節點陷入更嚴重的癱瘓。這部分設定僅僅影響到作業系統的層級。

要讓 Docker 引擎確實吃到 ulimit 設定,還需要再配置文件 /etc/docker/daemon.json 加入參數,下面設定數值是一範例:

"default-ulimits": {
  "nofile": {
    "Name": "nofile",
    "Hard": 800000,
    "Soft": 800000
  }
}

經過設定之後,所有功能恢復正常, kubectl 命令操作OK。

結論

Docker 引擎的 ulimit 設定,除了系統層級的 systemd 配置修改之外,還需要修改 Docker daemon 的配置文件內容。

留言

這個網誌中的熱門文章

Docker 環境下的 Proxy 配置