有时候你会发现 K8S 创建 Pod 失败,会给你提示下面这个错误:
1
2
3
|
OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:385:
applying cgroup configuration for process caused: mkdir /sys/fs/cgroup/memory/kubepods/burstable/podxxx/xxx:
cannot allocate memory: unknown"
|
同样的错误你可以在 docker 的日志里看到:
1
2
3
4
5
6
|
$ journalctl -u docker
Mar 20 00:04:33 k8sworker06-new dockerd[3176]: time="2023-03-20T00:04:33.461528517+08:00" level=error
msg="Handler for POST /v1.40/containers/bc91b4fd862386647df69cb636f779c05eb034d9e5db2ab527b51b90f128a5df/start
returned error: OCI runtime create failed: container_linux.go:380: starting container process caused:
process_linux.go:385: applying cgroup configuration for process caused:
mkdir /sys/fs/cgroup/memory/kubepods/burstable/podxxx/xxx: cannot allocate memory: unknown"
|
参考这篇文章提到:
- linux kernel 3.10.xxx 中对于 cgroup 的 kmem allocation 存在 bug 会有内存泄漏问题。
- 如果频繁创建销毁容器,内存泄漏到一定程度,就会出现上述情况。
其实这个问题你也可以这样重现:
1
2
|
$ mkdir /sys/fs/cgroup/memory/test
cannot allocate memory
|
删除这个目录到方法是 rmdir /sys/fs/cgroup/memory/test
所以解决方案是:
- CentOS 7.x 的内核都是 3.10.xxx 的,升级 CentOS 到 8.x 内核会变成 4.x 解决了这个问题
- 或者重启服务器(重启 docker 服务是没用的,因为问题出在 cgroup 上)
评论