MicroK8s集群Pod处于Terminating状态但无法定位的排查求助
问题:Terminating状态Pod无法删除且提示NotFound
在MicroK8s集群中,有一个Pod一直处于Terminating状态,但尝试强制删除或移除终结器时,系统返回Pod不存在的错误。
命令执行情况:
$ kubectl get pods NAME READY STATUS RESTARTS AGE net-exporter 1/1 Terminating 0 109m $ kubectl describe pod net-exporter Error from server (NotFound): pods "net-exporter" not found
尝试执行kubectl describe net_exporter同样无法正常执行。
已尝试的操作
- 删除Pod所在的命名空间,但该资源状态异常,API服务器不允许此操作。
- 通过MicroK8s的
ctr container ls命令查看运行中的容器,未找到相关容器。 - 尝试用
kubectl的各种方式访问该Pod,均返回NotFound错误。 - 执行
microk8s reset重置节点,但Pod仍处于Terminating状态。
调试与解决步骤
1. 校验API Server缓存与etcd数据一致性
这种异常通常是API Server缓存和etcd实际数据不一致导致的,直接查询etcd中的Pod数据:
# 进入MicroK8s的etcd容器 microk8s kubectl exec -it -n kube-system etcd-$(hostname) -- sh # 在etcd中查询目标Pod的键值 ETCDCTL_API=3 etcdctl get /registry/pods/default/net-exporter --prefix --keys-only
- 如果etcd中存在该Pod的键值:说明API Server缓存异常
- 如果etcd中不存在:说明是kubectl本地缓存问题
2. 清理kubectl本地缓存
# 删除kubectl本地缓存目录 rm -rf ~/.kube/cache # 重新获取Pod列表 kubectl get pods
3. 强制清理etcd中的残留Pod数据(仅确认容器已停止时操作)
若etcd中存在该Pod的残留数据,直接删除对应条目:
# 在etcd容器内执行,替换default为Pod实际命名空间 ETCDCTL_API=3 etcdctl del /registry/pods/default/net-exporter
4. 重启kube-apiserver刷新缓存
# 重启MicroK8s集群 microk8s stop && microk8s start # 或单独重启kube-apiserver Pod microk8s kubectl delete pod -n kube-system kube-apiserver-$(hostname)
重启后API Server会重新从etcd加载数据,缓存将被刷新。
5. 清理kubelet残留状态数据
如果kubelet保留了Pod的状态记录,也会导致异常:
# 查看kubelet的Pod状态目录 ls /var/snap/microk8s/current/var/lib/kubelet/pods/ # 删除对应Pod的UUID目录(替换为实际UUID) sudo rm -rf /var/snap/microk8s/current/var/lib/kubelet/pods/<Pod-UUID> # 重启kubelet microk8s kubectl delete pod -n kube-system kubelet-$(hostname)
内容的提问来源于stack exchange,提问作者Alex Tjaarda
相关产品推荐
相关产品推荐

