Pods 卡在终止状态

Pods stuck in Terminating status

我试图删除一个 ReplicationController 和 12 pods,我可以看到一些 pods 卡在 Terminating 状态。

我的 Kubernetes 集群由安装在 Ubuntu 个虚拟机上的一个控制平面节点和三个工作节点组成。

出现此问题的原因可能是什么?

NAME        READY     STATUS        RESTARTS   AGE
pod-186o2   1/1       Terminating   0          2h
pod-4b6qc   1/1       Terminating   0          2h
pod-8xl86   1/1       Terminating   0          1h
pod-d6htc   1/1       Terminating   0          1h
pod-vlzov   1/1       Terminating   0          1h

实用答案——您始终可以通过 运行:

删除终止 pod
kubectl delete pod NAME --grace-period=0

历史答案 -- 在 1.1 版中存在一个问题,有时 pods 如果他们的节点被不干净地从集群中删除,就会陷入终止状态。

您可以使用以下命令强制删除POD。

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>

强制删除 pod:

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

--force 标志是强制性的。

从资源(pod、deployment、ds 等...)yaml 中删除终结器块:

"finalizers": [
  "foregroundDeletion"
]

如果 --grace-period=0 不起作用,那么您可以这样做:

kubectl delete pods <pod> --grace-period=0 --force

我最近在删除 rook ceph 命名空间时偶然发现了这个 - 它卡在了终止状态。

唯一有帮助的是通过按照建议 here.

使用 curl 直接调用 k8s api 来删除 kubernetes finalizer
  • kubectl get namespace rook-ceph -o json > tmp.json
  • 删除 tmp.json 中的 kubernetes 终结器(保留空数组 "finalizers": []
  • 运行 kubectl proxy 在另一个终端中用于身份验证目的,并且 运行 在 curl 请求之后返回端口
  • curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
  • 命名空间消失了

详细的 rook ceph 拆解 here

我最近偶然发现了这个来释放集群中的资源。这是将它们全部删除的命令。

kubectl get pods --all-namespaces | grep Terminating | while read line; do
  pod_name=$(echo $line | awk '{print }' ) \
  name_space=$(echo $line | awk '{print }' ); \
  kubectl delete pods $pod_name -n $name_space --grace-period=0 --force
done

希望这对阅读本文的人有所帮助

我发现这个命令更直接:

for p in $(kubectl get pods | grep Terminating | awk '{print }'); do kubectl delete pod $p --grace-period=0 --force;done

它将删除默认命名空间中所有处于终止状态的pods。

在我的例子中,--force 选项不太奏效。我仍然可以看到吊舱!它卡在 Terminating/Unknown 模式。所以在 运行

之后
kubectl delete pods <pod> -n redis --grace-period=0 --force

我运行

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'

最初的问题是“这个问题的原因是什么?”,答案在 https://github.com/kubernetes/kubernetes/issues/51835 & https://github.com/kubernetes/kubernetes/issues/65569 & see https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

中讨论

它是由 docker 挂载泄漏到其他命名空间引起的。

您可以登录 pod 主机进行调查。

minikube ssh
docker container ps | grep <id>
docker container stop <id> 

我不建议强制删除 pods 除非容器已经退出。

  1. 验证 kubelet 日志以查看导致问题“journalctl -u kubelet”的原因
  2. 验证 docker 日志:journalctl -u docker.service
  3. 检查 pod 的卷挂载点是否仍然存在以及是否有人持有它的锁。
  4. 验证主机是否内存或磁盘不足

在强制删除之前我会先做一些检查。 1-节点状态:获取你的节点所在的节点名称运行,可以通过以下命令查看:

"kubectl -n YOUR_NAMESPACE describe pod YOUR_PODNAME"

在“节点”标签下,您将看到节点名称。 你可以这样做:

kubectl describe node NODE_NAME

如果您发现任何异常情况,请检查“条件”字段。 如果没问题,那么您可以转到步骤,重做:

"kubectl -n YOUR_NAMESPACE describe pod YOUR_PODNAME"

检查它挂起的原因,您可以在“事件”部分下找到它。 我这样说是因为您可能需要在强制删除 pod 之前采取初步措施,强制删除 pod 只会删除 pod 本身而不是底层资源(例如卡住的 docker 容器)。

你可以使用 awk :

kubectl get pods --all-namespaces | awk '{if (=="Terminating") print "oc delete pod "  " -n "  " --force --grace-period=0 ";}' | sh

请尝试以下命令: kubectl patch pod -p '{"metadata":{"finalizers":null}}'

就我而言,我不喜欢解决方法。 所以有步骤:

  • k get pod -o wide -> 这将显示哪个节点正在 运行 连接 pod
  • k get nodes -> 检查那个节点的状态...我明白了 NotReady

我去修复了那个节点.. 就我而言,它只是重新启动 kubelet :

  • ssh that-node -> 运行 swapoff -a && systemctl restart kubelet

现在删除 pod 应该可以在不强制 Poor pod 的情况下工作。

发生这种情况的一个原因可能是关闭节点(不耗尽它)。在这种情况下修复是再次打开节点;那么终止应该会成功。

强制删除命名空间中的所有 pods:

kubectl delete pods --all -n <namespace> --grace-period 0 --force

以下带有 awkxargs 的命令可以与 --grace-period=0 --force 一起使用以删除 all Pods in 正在终止状态。

kubectl get pods|grep -i terminating | awk '{print }' | xargs kubectl delete --grace-period=0 --force pod

我用这个命令删除了 pods

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

但是当我尝试 运行 另一个 pod 时,它没有工作,它卡在“Pending”状态,看起来节点本身被卡住了。

对我来说,解决方案是重新创建节点。我只是去了 GKE 控制台并从集群中删除了节点,因此 GKE 启动了另一个节点。

之后一切又恢复正常了。

我在生产 Kubernetes 集群中遇到了同样的问题。

一个 pod 卡在 Terminating 阶段一段时间:

pod-issuing   mypod-issuing-0   1/1     Terminating   0  27h

我尝试使用以下命令检查日志和事件:

kubectl describe pod mypod-issuing-0 --namespace pod-issuing
kubectl logs mypod-issuing-0 --namespace pod-issuing

但 none 可以查看

我是如何修复的:

我运行下面的命令强制删除pod:

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>

这会立即删除 pod 并开始创建新的 pod。但是,我 运行 在创建另一个 pod 时出现以下错误:

Unable to attach or mount volumes: unmounted volumes=[data], unattached volumes=[data mypod-issuing-token-5swgg aws-iam-token]: timed out waiting for the condition

我不得不等待 7 到 10 分钟 以便该卷与我删除的前一个 pod 分离,以便它可用于我正在创建的这个新 pod。

go 模板可以在没有 awk 的情况下工作,对我来说它可以在没有 awk 的情况下工作 --grace-period=0 --force 但是,如果你愿意,可以添加它

这将输出删除 Terminated pods 的命令。

kubectl get pods --all-namespaces -otemplate='{{ range .items }}{{ if eq .status.reason  "Terminated" }}{{printf "kubectl delete pod -n %v %v\n" .metadata.namespace .metadata.name}}{{end}}{{end}}'

如果您对输出满意,您可以 cat add | sh - 来执行它。 如下:

kubectl get pods --all-namespaces -otemplate='{{ range .items }}{{ if eq .status.reason  "Terminated" }}{{printf "kubectl delete pod -n %v %v\n" .metadata.namespace .metadata.name}}{{end}}{{end}}' |sh -