完整錯誤信息:
ERROR: for log Cannot start service log: OCI runtime create failed: container_linux.go:346: starting container process caused “process_linux.go:319: getting the final child’s pid from pipe caused “EOF””: unknown
K8s集羣突然啓不了新服務了,通過日誌發現 docker 報上面的錯誤信息。谷歌搜了一圈大多數都是內核版本低導致安裝 Docker 後出現的問題。和我這裏的情況明顯不同。
通過 journactl -xe
發現內核報錯:
kernel: Unable to create nf_conn slab cache
通過上面的錯誤信息找到了更有用的一些資料:
- Kubernetes 容器啓動失敗:unable to create nf_conn slab cache
- Github issues #37722 和 #31037
- 阿里雲容器啓動失敗: failed to unshare namespaces, running exec setns process for init, Unable to create nf_co
- Linux的緩存機制及不同類型緩存的操作方法
根本原因是 linux 3.10 內核的 BUG,產生的原因是因爲內存碎片過多,無法分配大塊內存。
重啓服務器能直接解決,如果不能重啓可以參考最後一篇中的如下命令:
# 清理頁面緩存
echo 1 > /proc/sys/vm/drop_caches
# or
sysctl -w vm.drop_caches=1
我在使用上面命令後,服務就能啓動了,但是碎片仍然很嚴重,仍然存在很大的風險。