现在云原生越来越流行,很多企业都上马了K8S,但是这里边也有很多的坑要填,这篇文章就聊一下K8S节点本地存储被撑爆的问题,也就是磁盘被占满的问题。
存储的内容
要解决存储使用过多的问题,就得先了解存储中都保存了些什么内容,否则解决不了问题,还可能带来更多的风险。
镜像
容器要在节点上运行,kubelet 首先要拉取容器镜像到节点本地,然后再根据镜像创建容器。随着Pod的调度和程序的升级,日积月累,节点本地就会保存大量的容器镜像,占用大量存储空间。
如果使用的是Docker容器运行时,这些文件保存在 /var/lib/docker/image/overlay2 目录下。
可写层
关于可写层,了解容器本质的同学应该比较熟悉,容器运行时使用的是一种联合文件系统技术,它把镜像中的多层合并起来,然后再增加一个可写层,容器中写操作的结果会保存在这一层,这一层存在于容器当前节点的本地存储中。虽然镜像中的层是容器实例共享的,但是可写层是每个容器一份。
假如我们有一个名为 mypod 的Pod实例,在其中创建一个文件:/hello.txt,并写入 hello k8s 的字符。
$ kubectl exec mypod -- sh -c 'echo "hello k8s" > /hello.txt' $ kubectl exec mypod -- cat /k8s/hello.txt hello k8s
如果使用的是Docker容器运行时,可以在Docker的相关目录中找到可写层以及刚刚创建的这个文件,它们在 /var/lib/docker/overlay2 这个目录下。
如果毫无节制的使用可写层,也会导致大量的本地磁盘空间被占用。