服务器环境
系统版本:CentOS Linux release 7.4.1708 (Core)
系统内核:3.10.0-1127.el7.x86_64
kubernetes版本:v1.10.7
docker版本: 17.09.1-ce
k8s创建pod在某台节点上无法创建并报错:
unable to ensure pod container exists: faild to create container for /kubepods/burstable/podf1242523-2135abf-200cfcce08 : mkdir /sys/fs/cgroup/memory/kubepods/burstable/podf1242523-2135abf-200cfcce08: no space left on device
在节点上创建容器失败
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:279: applying cgroup configuration for process caused \"mkdir /sys/fs/cgroup/memory/docker/f88b5f802a5ddb0fc0b072f01e481911c3fd736092565f6b9047d3c1d0d08e26: cannot allocate memory\"": unknown.
腾讯容器云解决方案地址:https://tencentcloudcontainerteam.github.io/2018/12/29/cgroup-leaking/
网上复现文章地址:http://www.linuxfly.org/kubernetes-19-conflict-with-centos7/?from=groupmessage
docker社区:https://github.com/moby/moby/issues/29638
kubernetes社区:https://github.com/kubernetes/kubernetes/issues/70324
因为这个K8S集群本身是作为PASS平台的底层集群,如果升级集群可能会导致和PASS平台兼容出现问题,所以采取清理出现问题的节点把pod飘移出去尽量小的影响业务,然后重启服务器来释放。
规避方案
之后创建的容器都默认开启了 kmem accounting,后来社区也注意到这个问题,并做了比较灵活的修复,
cd $GO_PATH/src/github.com/opencontainers/runc/ make BUILDTAGS="seccomp nokmem"
docker-ce v18.09.1 之后的 runc 默认关闭了 kmem accounting,所以也可以直接升级 docker 到这个版本之后。
kubelet
如果是 1.14 版本及其以上,可以在编译的时候通过 build tag 来关闭 kmem accounting:
KUBE_GIT_VERSION=v1.14.1 ./build/run.sh make kubelet GOFLAGS="-tags=nokmem"
pkg/kubelet/cm/cgroup_manager_linux.go
的 Create
方法中,会调用 Manager.Apply
方法,最终调用 vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/memory.go
中的 MemoryGroup.Apply
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏