我厌倦了删除一个带有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
答案 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
-> 这将显示哪个节点正在运行 podk 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)
除非容器已经退出,否则我不建议强行删除吊舱。
答案 14 :(得分:0)
最初的问题是“ 该问题的原因可能是什么?”,答案在https://github.com/kubernetes/kubernetes/issues/51835和https://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