问题发现
接收到反馈,正常运行的 jenkins 服务在打镜像的时候出现了多个镜像构建失败的情况。通过排查发现问题是
The node was low on resource: ephemeral-storage.
即 目标节点的临时存储空间不足
排查解决过程
- 首先搞清楚,kubernetes 中“临时存储空间”的概念
- 临时存储空间通常是指Pod使用的ephemeral-storage资源。这是一种临时的存储空间,通常用于存储容器日志、临时文件等。ephemeral-storage是Pod的一种资源,可以在Pod的yaml文件中设置请求和限制,以确保Pod不会占用过多的磁盘空间。
- Kubernetes会为每个Pod分配一个独立的临时存储空间,通常是节点上的本地磁盘。当Pod被删除或终止时,Kubernetes会自动清理这个临时存储空间,以释放磁盘空间。
- 要注意的是,如果您的应用程序需要大量的临时存储空间,那么您应该考虑增加节点的磁盘容量,或者使用其他方式来管理和清理临时数据,以避免占用过多的磁盘空间。否则,当节点上的磁盘空间不足时,就会出现“node was low on resource: ephemeral-storage”错误
- 这里发现了这个错误,那么首先去查看目标节点上的磁盘空间使用情况
- 这里如何查看?
- 一般查看一个节点的临时存储空间情况使用 命令
df -h /tmp
- 通常情况下 /tmp 目录是 Linux系统上的一个临时文件夹,用于存储临时文件和临时数据
- 在Kubernetes中,节点上的临时存储空间(ephemeral-storage)通常就是通过/tmp目录实现的
- 这里我使用
df -h /tmp
命令发现输出如下
文件系统 容量 已用 可用 已用% 挂载点
/dev/vda1 79G 12G 64G 16% /
- 很显然空间是够用的,不过发现了一个奇怪的地方,查看 /tmp 目录的磁盘使用情况,这里却显示了
/
目录下的磁盘使用情况 - 这说明了
/tmp
目录 被挂载到了/
目录上
- 然后接着需要查看整体磁盘使用情况,这里使用
df -h
- 我这里并没有发现 磁盘不够使用的情况
- 那么接下来如何排查?
- 一个关键点是,既然使用了
ephemeral-storage
那么是不是可以对ephemeral-storage
进行配置。 - 通过查看 jenkins 的脚本发现并没有该配置项
- 查看describe pod查看pod运行时的信息也发现
ephemeral-storage
并没有配置 - 这个时候获取了一个关键的信息:不同的
kubernetes
版本关于ephemeral-storage
的默认配置有着不同的差别
- 即在有的版本,不配置就没有办法使用
ephemeral-storage
不然就会报错
- 配置
ephemeral-storage
,参考如下配置,配置完成之后重试,成功解决问题
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
resources:
requests:
ephemeral-storage: "1Gi"
limits:
ephemeral-storage: "2Gi"