因为从R86S升级到R2S,因为强迫症,将家里主网段的IP从192.168.86改为了192.168.2,忽略了对外提供服务网段里有一些PV是用192.168.86绑定的NAS,于是有了重建这些PV的过程。
以deployment.apps/rabbitmq-rabbitmq-pvc-rabbitmq-pv为例展开:
- 备份PVC:
kubectl get pvc -n test rabbitmq-pvc -oyaml >rabbitmq-pvc.yaml
- 备份PV:
kubectl get pv rabbitmq-pv -oyaml >rabbitmq-pv.yaml
- 检查一个PV的yaml中有没有
persistentVolumeReclaimPolicy
属性,是否为Retain
,如果没有,使用kubectl patch pv rabbitmq-pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
添加,防止删除PVC时PV被删除 - 将rabbitmq的副本数缩到0:
kubectl scale deployment rabbitmq -n test --replicas=0
- 尝试删除PVC:
kubectl delete pvc -n test rabbitmq-pvc
- 尝试删除PV:
kubectl delete pv rabbitmq-pv
- 修改备份的
rabbitmq-pv.yaml
,修改NFS地址 - 重建PV:
kubectl apply -f rabbitmq-pv.yaml
- 检查PV状态
kubectl get pv rabbitmq-pv
发现为Released
,使用kubectl patch pv rabbitmq-pv -p '{"spec":{"claimRef": null}}'
清除 claimRef 字段,告诉 Kubernetes:这个 PV 可以重新被绑定 - 重建PVC:
kubectl apply -f rabbitmq-pvc.yaml
- 拉起pod:
kubectl scale deployment rabbitmq -n test --replicas=1
重建另一个PV是删除PVC卡死,过程如下:
- 删除PVC
kubectl delete pvc -n test elasticsearch-data-pvc
卡死,检查状态变成Terminating
,查看elasticsearch-data-pvc.yaml
存在finalizers: kubernetes.io/pvc-protection
保护 - 强制移除 PVC 的 Finalizer:
kubectl patch pvc elasticsearch-data-pvc -n test -p '{"metadata":{"finalizers":[]}}' --type=merge
,移除后pvc自动删除
后续步骤同上,检查发现是因为存在podelasticsearch-5c6bc6ff78-lkjs9
状态为error,未删除,执行kubectl delete pod -n test elasticsearch-5c6bc6ff78-lkjs9 --force
强制删除
以上即完成修复。