删除Cassandra StatefulSet Pod后重新创建遇Pending状态,如何释放已分配资源?
首先,咱们先明确Pod卡在Pending状态的核心原因——这个状态通常意味着Kubernetes没办法把Pod调度到任何节点上,除了你怀疑的资源占用,存储卷的问题在StatefulSet场景下更常见,毕竟StatefulSet的PersistentVolumeClaim(PVC)是和Pod绑定的,而且不会随Pod删除而自动删除。
我给你一步步梳理排查和解决的方法:
第一步:定位Pending的具体原因
先拿到最直接的线索,运行以下命令查看第一个待启动的Cassandra Pod(StatefulSet是按顺序启动的,第一个是cassandra-0)的详细事件:
kubectl describe pod cassandra-0
重点看输出里的Events部分,这里会明确告诉你为什么Pod无法调度,比如“PersistentVolumeClaim is not bound”(PVC未绑定)、“no nodes available to schedule pods”(没有可用节点)或者磁盘空间不足之类的信息。
第二步:检查存储资源状态
StatefulSet的PVC不会随Pod删除而消失,你可以查看现有的PVC:
kubectl get pvc
你会发现之前三个Pod对应的PVC(比如cassandra-data-cassandra-0、cassandra-data-cassandra-1、cassandra-data-cassandra-2)还存在,状态是Bound。当你重建Pod时,K8s会尝试复用这些已存在的PVC,如果这些PVC对应的存储卷(PV)在Kind节点上出现了损坏、空间不足的情况,新Pod就无法挂载,进而卡在Pending。
第三步:释放旧存储资源
如果你不需要保留旧的Cassandra数据,可以直接删除这些旧的PVC,让StatefulSet重新创建新的存储卷:
kubectl delete pvc -l app=cassandra
执行这个命令后,StatefulSet会自动根据你YAML里的volumeClaimTemplates重新生成PVC,对应的存储卷也会被重新分配,新Pod应该就能正常启动了。
补充排查点
如果删除PVC后还是不行,可以试试这几个方向:
- 检查节点磁盘空间:
kubectl top nodes不会显示磁盘使用情况,你可以进入Kind的worker节点查看:
看看存储卷所在的目录(通常是docker exec -it kind-worker df -h/var/lib/docker/volumes/下的相关目录)是不是已经满了,如果是,清理节点上的无用数据即可。 - 验证StorageClass有效性:运行以下命令确认你的
fast存储类状态正常:
如果状态异常,可以先删除再重新创建:kubectl get storageclass fastkubectl delete storageclass fast kubectl apply -f <你的Cassandra YAML文件路径>
总的来说,你遇到的问题大概率是旧PVC没有被清理导致的,删除旧PVC就能解决。如果还是有问题,kubectl describe pod的Events信息是你定位问题的核心依据。
备注:内容来源于stack exchange,提问作者best_of_man

