背景
在我们公司的Kubernetes集群中,最近经常遇到一些Pod频繁Evicted的问题。这个问题困扰了我们好一段时间,直到我发现问题的根源是因为Node节点的磁盘空间不足。
排查思路
我首先使用kubectl describe pod 命令来查看Pod Evicted的详细信息,发现Pod被Evicted的原因是Node节点磁盘空间不足。这导致Pod的容器无法启动,并最终被Evicted掉
解决方式
我们开始尝试解决这个问题。首先,通过以上的kubectl describe pod命令可以看到该pod是被ip为89的节点驱逐的。
然后我通过kubectl get po -A -o wide| grep Evicted 所有的evicted都发生在89 这台node.
登录到89这个node后可以看到磁盘空间的确很紧张
接着,我找到了这个占用大量空间的pod日志
这是pod运行时日志输出的地方,它会挂载到node节点的某个路径上.可以通过kubectl describe pod 查看目录挂载位置.很自然的 我回到master上通过pod名称去找这个pod. 但是确没有发现.联想到之前发生过pod一致处于terminating状态 最后强制删除的情况.可能是这种操作删除了pod信息但是没有删除对应的卷(Volume).
果断删除这个pod日志并找到其他没有对应pod但是有pod日志的文件夹清理后. 没有在出现Evicted的情况.
问题拓展
在Kubernetes中,Pod是最小的工作单元,它是由一个或多个容器组成的。Pod在节点上运行,且有一个生命周期。当Pod中某个容器出现故障或超出其资源限制时,该Pod可以被终止并重新创建。这种重新创建Pod的过程称为Eviction。
describe命令
在Kubernetes中,当一个Pod被evicted时,可以通过以下命令查看它的状态描述:
kubectl describe pod <pod-name>
该命令将显示Pod的详细信息,包括状态描述。例如,如果Pod因资源不足而被Evicted,则输出的状态可能类似于以下内容:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulled 10m kubelet, node-1 Container image "nginx:latest" already present on machine
Normal Created 10m kubelet, node-1 Created container nginx
Normal Started 10m kubelet, node-1 Started container nginx
Warning Evicted 5m kubelet, node-1 The node was low on resource: memory. Container nginx was using 600Mi, which exceeds its request of 256Mi.
注意,Warning Evicted 行表示Pod已被Evicted,而 The node was low on resource 表示Pod的Eviction是由于节点资源不足而引起的。在这个例子中,Pod中的 nginx 容器的内存使用量为 600Mi,而其只申请了最少的256Mi ,因此被Evicted。
如果您的Pod频繁被Evicted,则可能存在以下问题:
- 内存或CPU不足:
Pod所需的资源超出了节点的可用资源。这可能是因为Pod中的容器使用了大量的资源,或者您的应用程序需要更多的资源。
- 存储问题:
如果Pod使用的存储资源不足,也可能会出现频繁的Eviction问题。这可能是因为存储已满或存储资源不足,以及存储崩溃或故障等。
- 节点问题:
您的节点可能存在问题,如硬件故障、网络分区、节点宕机等。
解决方案:
如果您的Pod频繁被Evicted,您可以尝试以下解决方案:
- 调整Pod所需的资源量:您可以检查Pod所需的资源(CPU、内存)是否适合节点,并根据需要调整Pod的资源量。您可以通过使用Kubernetes的资源限制和请求来控制Pod使用的资源。
- 检查存储:您可以通过检查存储配置文件,确保Pod有足够的存储空间。
- 检查节点:您可以检查节点是否存在故障,并尝试重新启动节点或迁移Pod。
总之,Pod频繁被Evicted可能意味着您的应用程序存在某些问题或资源配置不足,您需要仔细检查和调整它们,以确保Pod能够正常运行并保持稳定