Kubernetes集群卡在删除PV/PVC上。

45
我一直在努力让我的简单的3节点Kubernetes集群运行起来。
$ kubectl get nodes                                                                                    NAME   STATUS   ROLES         AGE   VERSION
ubu1   Ready    master        31d   v1.13.4
ubu2   Ready    master,node   31d   v1.13.4
ubu3   Ready    node          31d   v1.13.4

我试着创建一个PVC,但它一直卡在待处理状态。所以我删除了它,但现在它卡在终止状态。
$ kubectl get pvc
NAME                        STATUS        VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS      AGE
task-pv-claim               Terminating   task-pv-volume   100Gi      RWO            manual            26d

如何创建一个适用于官方Kubernetes网站上描述的演示的正确创建和可用的PV?
附注:我使用kubespray来启动和运行。
在我的Ubuntu 16.04虚拟机上,安装的Docker版本是:
ubu1:~$ docker version
Client:
 Version:           18.06.2-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        6d37f41
 Built:             Sun Feb 10 03:47:56 2019
 OS/Arch:           linux/amd64
 Experimental:      false

提前感谢。

1
你尝试过先从你的PV/PVC中删除.metadata.finalizers,然后再删除PV/PVC吗? - Shudipta Sharma
@ShudiptaSharma,我在哪里找到它以删除?我在YAML部署文件中没有找到它。 - farhany
1
您可以使用 $ kubectl edit pvc <pvc_name> 命令。然后,yaml 配置将在终端上显示默认编辑器(由 $KUBE_EDITOR 环境变量指定)。如果它是用 vimvi 打开的,则运行适当的命令以删除这些行或按照您对编辑器的要求进行操作。 - Shudipta Sharma
6个回答

79

kubectl edit pv (持久卷名称)

在清单文件中找到以下内容

finalizers:
  -  kubernetes.io/pv-protection

...然后删除它。

然后退出,并运行此命令以删除pv

kubectl delete pv (pv name) --grace-period=0 --force

1
我在删除PV和PVC时遇到了问题。这个解决方案也适用于删除 PVC。 - jsuen
谢谢!完美运行。 - RicHincapie
确认代码正常运行。 - Vladimir Titkov
2
即使使用了宽限期和强制选项,对我来说仍然卡住了。 - Draemon
4
现在是2023年,为什么我还要做这个? - Jan Martin
显示剩余2条评论

47
kubectl patch pvc {PVC_NAME} -p '{"metadata":{"finalizers":null}}'
你需要修补PVC以将“finalizers”设置为null,这允许来自节点的最终卸载,并且可以删除PVC。

2
可以使用 pv 进行相同的操作。 - Vishrant
2
在Windows上,您需要转义引号,但是您已经知道了吧?kubectl patch pvc {PVC_NAME} -p '{\"metadata\":{\"finalizers\":null}}' - BikerP
1
如何批量处理所有的 PVC,而不是一个一个地处理?我有很多处于终止状态的 PVC。 - anandhu
1
这个解决方案与顶部答案相同,我认为只是更好,因为它还删除了阻止您的任何其他终结器,并且不需要手动编辑。 - Noumenon

14

您可以使用以下命令强制删除 PV 或 PVC。

#kubectl delete pvc <PVC_NAME> --grace-period=0 --force 

在你的情况下

#kubectl delete pvc task-pv-claim  --grace-period=0 --force 

我已将其标记为正确答案。谢谢!那个运行得非常完美。现在我可以开始尝试在所有2个节点(ubu2和ubu3)上共享本地目录了。有什么提示吗? - farhany
你想将一个方向在一个主机上分享给两个Ubuntu吗? - yasin lachini
@yasin_lachini,我现在只需要一个单向或双向的来启动这个项目。:( 感谢你的帮助! - farhany
1
我的理解是:您的设置是一个运行3个Ubuntu集群节点的虚拟机服务器。为了共享本地目录,您需要将本地目录挂载到虚拟机上(具体方法取决于您的虚拟机引擎),然后创建PV,卷类型为“hostPath”,访问模式为“ReadWriteMany”,以便多个Pod可以声明它。 - MWZ

12

快速了解:

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

kubectl delete pvc <pvc_name> --grace-period=0 --force 

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

kubectl delete pv <pv_name> --grace-period=0 --force 

3
如果您的PV或PVC卡住了,那么删除相关的pod,您的终止状态PV或PVC将不再存在。

-1
如果你执行一个描述命令
kubectl describe pvc <pvcname>

你可以看到正在使用和阻止删除的资源。
Used By: <podname>

删除资源后,相关的 PVC 也将被删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接