You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Kubernetes集群中Terminating状态超2分钟的Pod及测试方法?

获取Kubernetes中Terminating状态超过2分钟的Pod及测试方法

一、筛选Terminating状态超过2分钟的Pod

方法1:使用kubectl + jq(推荐)

通过kubectl输出JSON格式的Pod数据,结合jq过滤满足条件的Pod:

kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.phase == "Terminating") | select((now - (.metadata.deletionTimestamp | fromdateiso8601)) > 120) | {namespace: .metadata.namespace, name: .metadata.name, deletionTimestamp: .metadata.deletionTimestamp}'
  • --all-namespaces:遍历所有命名空间的Pod
  • jq逻辑:筛选状态为Terminating的Pod,计算当前时间与删除时间的差值(秒),仅保留差值大于120(2分钟)的Pod,并输出关键信息

方法2:使用kubectl自定义列 + awk(无jq环境时用)

如果环境没有jq,可以用awk处理时间差:

kubectl get pods --all-namespaces -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,STATUS:.status.phase,DELETION_TIMESTAMP:.metadata.deletionTimestamp' | grep Terminating | awk -v now=$(date +%s) '{
    split($4, dt, /[T:.Z]/);
    cmd = "date -d \""dt[1]" "dt[2]"\" +%s";
    cmd | getline ts;
    close(cmd);
    if (now - ts > 120) print $0
}'

注意:该命令依赖GNU date,若使用BSD系统(如macOS),需调整date -d为date -j -f "%Y-%m-%dT%H:%M:%S"格式

二、强制让Pod处于Terminating状态用于测试

方式1:利用preStop钩子阻止终止

创建带有preStop钩子的Pod,钩子执行长时间睡眠命令,删除Pod后会卡在Terminating状态:

apiVersion: v1
kind: Pod
metadata:
  name: test-terminating-pod
spec:
  containers:
  - name: nginx
    image: nginx:alpine
    lifecycle:
      preStop:
        exec:
          command: ["sleep", "300"] # 睡眠5分钟,期间Pod保持Terminating状态

创建Pod后执行删除命令:kubectl delete pod test-terminating-pod,Pod会保持Terminating状态直到sleep结束。

方式2:添加自定义Finalizer阻止删除

给Pod添加自定义Finalizer,Kubernetes会等待Finalizer被移除才会完成删除:

apiVersion: v1
kind: Pod
metadata:
  name: test-finalizer-pod
  finalizers:
  - "example.com/manual-cleanup" # 自定义Finalizer
spec:
  containers:
  - name: busybox
    image: busybox:latest
    command: ["sleep", "3600"]

删除Pod后,它会进入Terminating状态且无法自动完成删除,直到手动移除Finalizer:

kubectl patch pod test-finalizer-pod -p '{"metadata":{"finalizers":[]}}'

方式3:延长优雅终止时间并阻止容器退出

删除Pod时指定较长的优雅终止时间,同时在容器内运行一个无法自动退出的进程:

  1. 创建测试Pod:
apiVersion: v1
kind: Pod
metadata:
  name: test-grace-period-pod
spec:
  containers:
  - name: busybox
    image: busybox:latest
    command: ["sleep", "3600"]
  1. 进入容器并启动常驻进程:
kubectl exec -it test-grace-period-pod -- tail -f /dev/null
  1. 另开终端执行删除命令,指定优雅终止时间为5分钟:
kubectl delete pod test-grace-period-pod --grace-period=300

此时Pod会因容器无法正常退出,保持Terminating状态直到优雅期结束或被强制删除。


内容的提问来源于stack exchange,提问作者tony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:43:17