1. 介绍

本文将介绍如何在 Kubernetes 中列出最近被删除的 Pod。首先,我们会回顾 Pod 的生命周期机制,然后介绍一些用于查询删除记录的命令,最后通过一个实际操作示例演示如何使用这些命令。

2. Kubernetes Pod 生命周期解析

要理解如何列出被删除的 Pod,首先需要了解 Pod 的生命周期。Pod 是 Kubernetes 中最小的部署单元,代表一个应用的单个实例。 它通常包含一个或多个容器、存储资源、唯一网络 IP 以及容器运行配置。

Pod 会经历多个状态阶段,每个阶段代表其当前运行状态:

阶段 描述
Pending Pod 刚创建,Kubernetes 正在为其分配节点并拉取镜像
Running Pod 已分配到节点,至少一个容器正在运行
Succeeded 所有容器成功执行完毕,且不会重启
Failed 所有容器终止,至少一个容器异常退出
Unknown 无法获取 Pod 状态,通常是节点通信问题

⚠️ 注意:Pod 一旦创建,其配置不可修改。若需更新,控制器会创建新的 Pod 替代旧的。Pod 也不会被迁移,即使在同一节点上重启,其 UID 也会发生变化。

3. 列出最近删除的 Pod

由于 Pod 删除后其对象即被清理,标准命令无法直接查询已删除的 Pod。但我们可以通过 Kubernetes 的事件系统来获取相关信息。

Kubernetes 会在 Pod 生命周期中生成事件记录,包括删除事件。这些事件默认保留 1 小时(TTL),因此只能查到最近 1 小时内的记录。

3.1. 仅列出 Pod 名称

$ kubectl get event -o custom-columns=NAME:.metadata.name | cut -d "." -f1

此命令提取事件中 Pod 的名称字段,并通过 cut 命令去除 .123456 这样的事件 ID 后缀。

3.2. 列出详细删除事件信息

$ kubectl get events --field-selector reason=Killing --sort-by='.metadata.creationTimestamp'

使用 --field-selector reason=Killing 过滤出与 Pod 删除相关的事件,并按时间排序。

⚠️ 限制说明:该方法仅适用于删除时间在 1 小时内的 Pod,超出 TTL 的事件将被自动清理,无法检索。

4. 示例操作

4.1. 创建 Pod

我们先创建一个测试 Pod:

$ kubectl run my-pod --image=nginx

此命令创建名为 my-pod 的 Pod,运行 Nginx 容器。这是命令式创建方式,适合快速测试。

如果需要更复杂的配置,推荐使用 YAML 文件进行声明式创建。

4.2. 查看 Pod 状态

确认 Pod 是否成功创建:

$ kubectl get pods
NAME     READY   STATUS    RESTARTS   AGE
my-pod   1/1     Running   0          13s
nginx    1/1     Running   0          10h

4.3. 删除 Pod

执行删除命令:

$ kubectl delete pod my-pod

再次查看 Pod 列表,确认已被删除:

$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          10h

4.4. 查询删除事件

列出所有被删除的 Pod 名称:

$ kubectl get event -o custom-columns=NAME:.metadata.name | cut -d "." -f1
NAME
my-pod
my-pod
my-pod
my-pod
my-pod
my-pod

可以看到,删除操作产生了多个事件记录。

查看详细事件信息:

$ kubectl get events --field-selector reason=Killing --sort-by='.metadata.creationTimestamp'
LAST SEEN   TYPE     REASON      OBJECT       MESSAGE
20m         Normal   Scheduled   pod/my-pod   Successfully assigned default/my-pod to kubernetes-n2
20m         Normal   Pulling     pod/my-pod   Pulling image "nginx"
19m         Normal   Pulled      pod/my-pod   Successfully pulled image "nginx" in 8.108s (8.108s including waiting)
19m         Normal   Created     pod/my-pod   Created container my-pod
19m         Normal   Started     pod/my-pod   Started container my-pod
17m         Normal   Killing     pod/my-pod   Stopping container my-pod

小结:这个输出展示了 Pod 从调度、拉取镜像、启动到被删除的完整生命周期事件。

5. 总结

在 Kubernetes 中,无法直接列出已删除的 Pod,但可以通过事件系统间接获取其删除记录。我们可以通过过滤 reason=Killing 来定位删除事件,并结合排序查看时间线。

⚠️ 踩坑提醒:事件默认只保留 1 小时,因此超过这个时间的删除记录将无法检索。如需长期保留,建议结合日志系统或事件归档方案。

通过本文介绍的方法,你可以快速定位和分析最近被删除的 Pod,为排查误操作、异常删除等问题提供依据。


原始标题:How to List Recently Deleted Pods in Kubernetes