Skip to content

TKE:记一次由于看不到的 Pod 导致 PVC 无法删除的调查

🏷️ TKE

删除测试环境的一个 PVC( pvc-mmdz-webfont )时,状态一直显示为 “ 已于 2023-05-05 15:48:38 标记删除,待绑定的 Pod 删除后删除。 ” 。但奇怪的是使用这个 PVC 的 Pod 早就关掉了,在 TKE 的门户页面上对应的 Deployment 下也已经没有任何 Pod 了。

最后通过 kubectl 工具才找到这个 PVC 关联的 Pod [1]

bash
kubectl get pods --all-namespaces -o=json | jq -c '.items[] | {name: .metadata.name, namespace: .metadata.namespace, claimName:.spec.volumes[] | select( has ("persistentVolumeClaim") ).persistentVolumeClaim.claimName }'

上面脚本的功能是查看所有命名空间中关联了 PVC 的 Pod。

这个脚本需要服务器安装解析 JSON 的 jq 工具[2]:

bash
yum -y install jq

执行结果中看到了如下一条记录:

json
{"name":"mmdz-ui-webfont-api-deploy-cf4c7944d-6dzn2","namespace":"mmdz-test","claimName":"pvc-mmdz-webfont"}

在 TKE 门户页面上找不到这个名为 mmdz-ui-webfont-api-deploy-cf4c7944d-6dzn2 的 Pod,还是要靠 kubectl 工具。

bash
kubectl get pods -n mmdz-test
  • -n 用来指定命名空间(下同)。

结果中看到如下一条记录:

bash
NAME                                                   READY   STATUS        RESTARTS   AGE
mmdz-ui-webfont-api-deploy-cf4c7944d-6dzn2             0/1     Terminating   3          177d

这是一个 177 天前创建的 Pod,一直处于 Terminating 状态。而且这个 Pod 的 Age 比对应的 Deployment 的 Age 还要大,也就是说这个 Pod 应该是之前已经删除了的同名 Deployment 关联的 Pod。

如有需要可以通过 kubectl describe 指令查看这个 Pod 的详细信息:

bash
kubectl describe po mmdz-ui-webfont-api-deploy-cf4c7944d-6dzn2 -n mmdz-test

使用 kubectl delete 命令删除这个 Pod:

bash
kubectl delete po mmdz-ui-webfont-api-deploy-cf4c7944d-6dzn2 -n mmdz-test

如果删不掉可以添加 --force 参数强制删除:

bash
kubectl delete po mmdz-ui-webfont-api-deploy-cf4c7944d-6dzn2 -n mmdz-test --force

删除这个 Pod 后,文章刚开始删除的 PVC 就会自动被移除了。


  1. kubernetes 查看哪些 pod 正在使用 pvc ↩︎

  2. Linux 下处理 JSON 的命令行工具:jq---安装 ↩︎