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 除非容器已经退出。
- 验证 kubelet 日志以查看导致问题“journalctl -u kubelet”的原因
- 验证 docker 日志:journalctl -u docker.service
- 检查 pod 的卷挂载点是否仍然存在以及是否有人持有它的锁。
- 验证主机是否内存或磁盘不足
在强制删除之前我会先做一些检查。
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
以下带有 awk
和 xargs
的命令可以与 --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 -
我试图删除一个 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
实用答案——您始终可以通过 运行:
删除终止 podkubectl 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 finalizerkubectl 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 除非容器已经退出。
- 验证 kubelet 日志以查看导致问题“journalctl -u kubelet”的原因
- 验证 docker 日志:journalctl -u docker.service
- 检查 pod 的卷挂载点是否仍然存在以及是否有人持有它的锁。
- 验证主机是否内存或磁盘不足
在强制删除之前我会先做一些检查。 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
-> 这将显示哪个节点正在 运行 连接 podk 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
以下带有 awk
和 xargs
的命令可以与 --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 -