如何获取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:遍历所有命名空间的Podjq逻辑:筛选状态为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时指定较长的优雅终止时间,同时在容器内运行一个无法自动退出的进程:
- 创建测试Pod:
apiVersion: v1 kind: Pod metadata: name: test-grace-period-pod spec: containers: - name: busybox image: busybox:latest command: ["sleep", "3600"]
- 进入容器并启动常驻进程:
kubectl exec -it test-grace-period-pod -- tail -f /dev/null
- 另开终端执行删除命令,指定优雅终止时间为5分钟:
kubectl delete pod test-grace-period-pod --grace-period=300
此时Pod会因容器无法正常退出,保持Terminating状态直到优雅期结束或被强制删除。
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

