kubectl get pods 显示 Evicted 状态怎么清理并恢复

文章导读
看到 Evicted 状态不用慌,这代表 Pod 已经被 kubelet 终止且不会自动重启,直接删除该 Pod 即可清理;如果它属于 Deployment 等控制器管理,新 Pod 会自动创建,否则需要检查节点资源后手动重建。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

看到 Evicted 状态不用慌,这代表 Pod 已经被 kubelet 终止且不会自动重启,直接删除该 Pod 即可清理;如果它属于 Deployment 等控制器管理,新 Pod 会自动创建,否则需要检查节点资源后手动重建。

先说结论:Evicted 是终态,不会自动恢复,必须手动删除旧 Pod 触发重建

  • 先确认:检查 Pod 是否由 Deployment 或 StatefulSet 控制器管理
  • 先处理:使用 kubectl delete 清理处于 Evicted 状态的 Pod
  • 再验证:观察新 Pod 是否成功启动且不再被驱逐

命令速用版

# 查看所有处于 Evicted 状态的 Pod
kubectl get pods `--field-selector` status.phase=Failed

# 删除指定的 Evicted Pod
kubectl delete pod <pod-name> -n <namespace>

# 批量清理所有 Evicted Pod(谨慎使用)
kubectl get pods `--field-selector` status.phase=Failed -o jsonpath='{.items[*].metadata.name}' | xargs kubectl delete pod

为什么会这样

Pod 显示 Evicted 并不是简单的“错误”,而是 kubelet 主动终止了它。常见原因包括节点资源压力(如磁盘空间不足、内存超限)或节点本身出现故障。一旦进入这个状态,Pod 生命周期就结束了,控制器如果不介入,它不会自己变回 Running。

kubectl get pods 显示 Evicted 状态怎么清理并恢复

分步处理

1. 确认 Pod 归属
先查看 Pod 详情,确认它是否有控制器管理。如果是 Deployment 创建的,删除后会自动补新;如果是裸 Pod 或 Static Pod,删除后需要手动重新应用配置。

kubectl get pods 显示 Evicted 状态怎么清理并恢复
kubectl get pod <pod-name> -o yaml | grep ownerReferences

2. 清理 Evicted Pod
确认无误后直接删除。如果 Pod 卡在 Terminating,可能需要强制删除。

kubectl delete pod <pod-name> `--grace-period`=0 `--force`

3. 排查根因
清理只是止血,必须检查节点资源。查看节点磁盘和内存使用情况,避免新 Pod 起来后再次被驱逐。

kubectl get pods 显示 Evicted 状态怎么清理并恢复
kubectl describe node <node-name>
df -h  # 在节点上执行

怎么验证是否生效

执行删除后,再次运行 get 命令,确认旧 Pod 消失。如果有控制器,会看到一个新的 Pod 创建出来。观察新 Pod 的 STATUS 列是否为 Running,且 RESTARTS 计数正常。

kubectl get pods -w

常见坑

  • 忽略资源压力:如果不清理节点磁盘日志或缓存,新 Pod 很快会再次 Evicted。
  • 静态 Pod 误删:kube-system 下有些 Pod 是静态 Pod,删除后虽然会恢复,但频繁驱逐可能意味着控制平面节点有问题。
  • 强制删除风险:使用 `--force` 跳过优雅终止可能导致应用数据丢失,仅在卡死时使用。

参考来源

  • Kubernetes Official Docs - Pod Lifecycle: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
  • Kubernetes Official Docs - Eviction Policy: https://kubernetes.io/docs/concepts/scheduling-eviction/eviction-policy/