Pod陷入终止状态

时间:2016-02-17 10:18:00

标签: kubernetes rook-storage

我厌倦了删除一个带有12个pod的复制控制器,我可以看到一些pod停留在终止状态。我的Kubernetes设置包括在ubuntu vms中安装的一个主机和三个minons。这个问题可能是什么原因?

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

17 个答案:

答案 0 :(得分:294)

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

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

答案 1 :(得分:47)

强制删除pod:

ob_start();
include("path/to/file.txt");
$file_content = ob_get_clean();

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME> 标志是强制性的。

答案 2 :(得分:16)

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

"finalizers": [
  "foregroundDeletion"
]

答案 3 :(得分:11)

实际答案 - 您始终可以通过以下方式删除终止广告连播:

kubectl delete pod NAME --grace-period=0

历史回答 - 版本1.1中存在一个问题,如果从群集中不正确地删除了节点,则有时pod会陷入Terminating状态。

答案 4 :(得分:3)

我发现此命令更简单:

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

它将删除默认名称空间中处于“终止”状态的所有Pod。

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

在强制删除之前,我首先要进行一些检查。 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容器)。

答案 8 :(得分:1)

In my case the --force option didn't quite work. I could still see the pod ! It was stuck in Terminating/Unknown mode. So after running

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

I ran

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

答案 9 :(得分:1)

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

  • k get pod -o wide -> 这将显示哪个节点正在运行 pod
  • k get nodes -> 检查该节点的状态...我知道了 NotReady

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

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

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

答案 10 :(得分:1)

最近我偶然发现了这个问题,以释放集群中的资源。这是删除所有命令的命令。

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

希望这对阅读此书的人有所帮助

答案 11 :(得分:1)

我最近在删除rook ceph名称空间时偶然发现了这一点-它陷入了终止状态。

唯一有用的方法是按照建议的here,通过使用curl直接调用k8s api来删除kubernetes终结器。

  • 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

答案 12 :(得分:1)

如果--grace-period=0无效,那么你可以这样做:

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

答案 13 :(得分:0)

除非容器已经退出,否则我不建议强行删除吊舱。

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

答案 14 :(得分:0)

最初的问题是“ 该问题的原因可能是什么?”,答案在https://github.com/kubernetes/kubernetes/issues/51835https://github.com/kubernetes/kubernetes/issues/65569上讨论,请参见https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy < / p>

它是由docker mount泄漏到其他名称空间引起的。

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

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

答案 15 :(得分:0)

您可以使用 awk :

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

答案 16 :(得分:0)

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

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