对于k8s的pv与pvc应该都不陌生,但是对使用过程中,还是会对这两者的状态会有疑惑。删除pv时为何会被hang住?pv无缘无语failed?下面这图是状态的变化。
1、首先创建个pv,这里用的后端存储是nfs。当刚创建好的pv状态必然是Available的,表示可以被pvc绑定。
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /data/k8s # 指定nfs的挂载点
server: 10.151.30.1 # 指定nfs服务地址
kubectl get pv nfs-pv
2、新建pvc
刚添加的 PVC 状态是 Pending,如果有合适的 PV,这个 Pending 状态会立刻变为 Bound 状态,同时相应的 PVC 也会变为 Bound,PVC 和 PV 进行了绑定。 我们可以先添加 PVC,后添加 PV,这样就能保证看到 Pending 状态。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
(图1)新建pvc对象资源后,刚刚新建完成会是penidng状态。
(图2)如找到合适的pv绑定的话,则状态会变成bound,pv的状态也会跟着从Available变成bound。
3、删除PV
现在的pvc与pv是在绑定状态了,均为bound。如不小心删了pv会有什么反应?
删除pv的时候已经是hang住了,也就是说没有真正的删除pv,但这时pv的状态是Terminating,pvc的状态则是bound。也就是说,当时已绑定在一起的应该需要先删除pvc,在删除pv。这种对于pvc是没有任何影响的。但还是需要把问题处理下去。
我们可以通过编辑 PV,删除 PV 中的 finalizers 属性来强制删除 PV:
kubectl edit pv nfs-pv
删除掉finalizers 属性中的内容
删除完成后,Pv算是真正的删除了,而pvc的也是Lost状态。
当pvc是Lost时,说明之前已经绑定的pv已经没有了,但是pvc里还有着pv的绑定信息,可以导看看情况
kubectl get pvc nfs-pvc -o yaml
要解决这个问题,就把之前创建的pv重新创建出来即可。创建完成后,pv pvc的状态都恢复成bound状态了。
kubectl apply -f volume.yaml
persistentvolume/nfs-pv created
上面是误操作,删除pv的情况下会发生的错误。
原文:https://www.cnblogs.com/cutecatkk/p/13755701.html