Pod异常问题排查 阶段四:Pod运行问题 OOM 当集群中的容器使用超过其限制的内存,容器可能会被终止,触发OOM(Out Of Memory)事件,导致容器异常退出。 OOM可能原因 说明 推荐的解决方案 系统内存不足 查看Pod所在节点的内核日志/var/log/messages,日志中存在Killed Process,但不存在kubepods相关日志;且主机内存使用量较高,表明是主机操作系统内存不足。 可能是系统全局内存不足、内存碎片化严重、内存泄露等。可提单排查。 Pod内存不足 查看Pod所在节点的内核日志/var/log/messages,日志中存在类似Task in /kubepods.slice/xxxxx killed as a result of limit of /kubepods.slice/xxxx的报错信息,且主机内存使用量不高或Pod的资源Limit值设置得较小,表明OOM为cgroup级别。 根据业务实际运行需要,适当增大Pod的内存Limit。 Terminating 可能原因 说明 推荐的解决方案 节点存在异常,处于NotReady状态。 节点存在异常,处于NotReady状态。 处于NotReady状态的节点恢复正常后会被自动删除。 Pod配置了Finalizers。 如果Pod配置了Finalizers,Kubernetes会在删除Pod之前执行Finalizers指定的清理操作。如果相关的清理操作没有正常响应,Pod将保持在Terminating状态。 通过kubectl get pod n o yaml查看Pod是否配置了Finalizers,进一步排查异常原因。 Pod的preStop配置异常。 如果Pod配置了preStop,Kubernetes会在c。Pod正处于终止流程的preStop阶段时,Pod将处于Terminating状态。 通过kubectl get pod n o yaml查看Pod的preStop配置,进一步排查异常原因。 Pod配置了优雅退出时间。 如果Pod配置了优雅退出时间(terminationGracePeriodSeconds),Pod收到终止命令后(例如kubectl delete pod 命令)会进入Terminating状态。等待terminationGracePeriodSeconds设定的时间后,或容器提前退出后,Kubernetes才认为Pod已经成功关闭。 等待容器优雅退出后,Kubernetes将自动删除Pod。 容器无响应。 发起停止或删除Pod的请求后,Kubernetes会向Pod内的容器发送SIGTERM信号。如果容器在终止过程中没有正确响应SIGTERM信号,Pod可能会停留在Terminating状态。 使用kubectl delete pod graceperiod0 force强制删除,释放Pod资源。 检查Pod所在节点的containerd或Docker日志,进一步进行排查。 Evicted 可能原因 说明 推荐的解决方案 节点存在资源压力,包括内存不足、磁盘空间不足等,引发kubelet主动驱逐节点上的一个或者多个Pod,以回收节点资源。 可能存在内存压力、磁盘压力、Pid压力等。可以通过kubectl describe node grep Taints命令查询。 内存压力:带有污点node.kubernetes.io/memorypressure。 磁盘压力:带有污点node.kubernetes.io/diskpressure。 Pid压力:带有污点node.kubernetes.io/pidpressure。 内存压力: 根据自身业务情况,调整Pod的资源配置。 磁盘压力: 定时清理节点上的业务Pod日志,防止磁盘空间被耗尽。 为节点进行磁盘扩容。 Pid压力:根据自身业务情况,调整Pod的资源配置。 发生了非预期的驱逐行为。 待运行Pod的节点被手动打上了NoExecute的污点,导致出现非预期的驱逐行为。 通过kubectl describe node grep Taints命令检查节点是否被打上了NoExecute污点。如是,请删除。 未按照预期流程执行驱逐。 podevictiontimeout:当节点宕机时间超过设置时间后,开始驱逐宕机节点上的Pod,默认为5min。 nodeevictionrate:每秒从节点上驱逐的Pod数量。默认为0.1,即每10s至多从一个节点上驱逐Pod。 secondarynodeevictionrate:第二档的节点驱逐速率。当集群中宕机节点过多时,节点驱逐速率会降低至第二档,默认值为0.01。 unhealthyzonethreshold:可用区的不健康阈值,默认为0.55,即当宕机的节点数量超过总节点数的55%时,该可用区被判定为不健康。 largeclustersizethreshold:集群的大规模阈值,默认为50,即当集群节点数量超过50时判定集群为大规模集群。 在小规格的集群(集群节点数小于等于50个节点)中,如果故障的节点大于总节点数的55%,实例的驱逐会被停止。 在大规模集群中(集群节点数大于50),如果集群中不健康的节点数量占总节点数的比例超过了预设的阈值unhealthyzonethreshold(默认为0.55),驱逐速率由secondarynodeevictionrate控制(代表每分钟驱逐节点上Pod的最大比例),默认值为0.01。 容器被驱逐后仍然频繁调度到原节点。 节点驱逐容器时会根据节点的资源使用率进行判断,而容器的调度规则是根据节点上的“资源分配量”进行判断,被驱逐的Pod有可能被再次调度到这个节点,从而出现频繁调度到原节点的现象。 根据集群节点的可分配资源检查Pod的资源Request请求配置是否合理。 Completed Completed状态下,Pod中容器的启动命令已执行完毕,容器中的所有进程均已成功退出。Completed状态通常适用于Job、Init容器等,该状态是正常状态。