现象:

k8s集群中某台计算节点上pod大量处于驱逐状态,通过describe node发现该node上有Taints: node.kubernetes.io/disk-pressure:NoSchedule 污点。

分析:

查阅文档提示磁盘不足,因为时间紧张,就快速通过df -h命令查看当前磁盘情况,并在可疑的主要目录执行du -d 1 -h |sort -hr查看文件夹大小并删除一部分无用文件。结果k8s node一直没有恢复,仔细分析才先该机器有两块磁盘,一个根分区, 一个是/var/lib/docker/.

kubelet日志

I0713 14:00:43.413075  184655 helpers.go:838] eviction manager: thresholds - grace periods satisified: threshold [signal=imagefs.available, quantity=566938204979] observed 544467224Ki

k8s提到
硬驱逐阈值的配置支持下列标记:

eviction-hard 描述了驱逐阈值的集合(例如 memory.available<1Gi),如果满足条件将触发 pod 驱逐。
kubelet 有如下所示的默认硬驱逐阈值:

memory.available<100Mi
nodefs.available<10%
nodefs.inodesFree<5%
imagefs.available<15%

其中
kubelet 只支持两种文件系统分区。

nodefs 文件系统,kubelet 将其用于卷和守护程序日志等。
imagefs 文件系统,容器运行时用于保存镜像和容器可写层。
imagefs可选。kubelet使用 cAdvisor 自动发现这些文件系统。kubelet不关心其它文件系统。当前不支持配置任何其它类型。例如,在专用文件系统中存储卷和日志是不可以的。

结果:

将/var/lib/docker 所在磁盘空间也清理到已使用空间小于85%, node污点自动消失。当然我们也可以配置kubelet启动参数,将其中阈值设置的更激进,比如images可用空间小于10%才报警之类的。

备注:

刚清理完磁盘空间,node不会立刻将disk-pressure污点去除,因为node刷新有固定频率的,不过可以自行更改kubelet的参数–node-status-update-frequency

–node-status-update-frequency - 指定 kubelet 向控制面组件发送状态的频率

引用:
https://kubernetes.io/zh/docs/tasks/administer-cluster/out-of-resource/
https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/
https://kubernetes.io/zh/docs/concepts/architecture/nodes/

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐