问题
集群部署一段时间后,经常有pod被驱逐
platform dba-27995825-9cj6s 0/1 Evicted 0 29m
platform dba-27995825-bfm8l 0/1 Error 0 29m
platform dba-27995825-cfmdv 0/1 Evicted 0 29m
platform dba-27995825-fl57q 0/1 Evicted 0 29m
platform dba-27995825-hj5kz 0/1 Evicted 0 29m
platform dba-27995825-svlbj 0/1 Evicted 0 29m
查看pod信息发现是因为DiskPressure导致的。
Status: Failed
Reason: Evicted
Message: Pod The node had condition: [DiskPressure].
分析
通过研究主机中的可用磁盘,我发现在出现这个问题之前,较高的集群负载与containerd运行时存储的大量使用相吻合。在正常情况下,这些卷的使用空间为70%,但它们高达+90%,这可能是导致Pod被驱逐的原因。
[root@master1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 7.9G 0 7.9G 0% /dev
tmpfs 7.9G 0 7.9G 0% /dev/shm
tmpfs 7.9G 770M 7.1G 10% /run
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/mapper/euleros-root 268G 61G 194G 24% /
tmpfs 7.9G 4.0K 7.9G 1% /tmp
/dev/sda1 976M 98M 812M 11% /boot
/dev/mapper/euleros-home 9.8G 7.2G 2.1G 78% /home
overlay 9.8G 8.5G 784M 92% /run/containerd/io.containerd.runtime.v2.task/k8s.io/01b69640950f3e703ef77916c11a4c42b9d36af37a6f3ce958018b7a64175327/rootfs
overlay 9.8G 8.5G 784M 92% /run/containerd/io.containerd.runtime.v2.task/k8s.io/04eeec961b70629076f9e086b95a36bdfff389e027b83fa0d4926fa38fde6435/rootfs
overlay 9.8G 8.5G 784M 92% /run/containerd/io.containerd.runtime.v2.task/k8s.io/06bacf53308f5d0a4a14063730aa1f7b9922d051d35ea2a2e4bda0b551696296/rootfs
overlay 9.8G 8.5G 784M 92% /run/containerd/io.containerd.runtime.v2.task/k8s.io/07e605e73358485ba10f264b90cb64a508441575ba54194dd360e5a481c0ed74/rootfs
overlay 9.8G 8.5G 784M 92% /run/containerd/io.containerd.runtime.v2.task/k8s.io/0ab9cf02a29e5aa33c536a6eed81940c1b0de11ddf9c96c4313edd2aaa1223e2/rootfs
overlay 9.8G 8.5G 784M 92% /run/containerd/io.containerd.runtime.v2.task/k8s.io/0b868deca37ab6b9ef42679788fd2a70a32474814ed25f94d438dca7a97458ec/rootfs
overlay 9.8G 8.5G 784M 92% /run/containerd/io.containerd.runtime.v2.task/k8s.io/0f146142d09c283d1c3a3e7f4249325287b76d545d3ee564a6a66bf22a774a98/rootfs
...
从上面输出可以看出以下几点:
- 名字为overlay的文件系统有很多,除了挂载点不一样外,其他的容量信息都一样
- 名字为overlay的文件系统已经使用了92%,这应该是导致pod被驱逐的原因
- 巧合的是文件系统/dev/mapper/euleros-home的容量和信息与overlay一摸一样
经过一些研究,发现有几件事能帮助我解决这个问题:
我们的集群使用containerd作为容器运行时间。它自带了crictl–它提供了一些containerd的功能。下面的命令清理了存储在缓存中的未使用的image:
crictl rmi --prune
也可以改变kubernetess.service的参数,这样你就可以创建一个消耗空间的阈值来触发垃圾收集。你只需要在k3s服务器后面添加以下参数,例如:
--kubelet-arg=image-gc-high-threshold=85 --kubelet-arg=image-gc-low-threshold=80
增加/var的大小也是一种选择。在这方面,我们可以释放现有卷组中的空间,或者添加一个新的磁盘,并将其添加到/var的卷组中–更多内容请见此链接。