根据官方文档https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/的“保留”策略,PV可以手动恢复。这实际上意味着什么,有没有工具可以让我从“保留的”PV中读取数据并将其写入到另一个PV中,或者这是否意味着您可以手动安装该卷以获得访问权限?
发布于 2019-04-08 15:33:27
手动恢复卷的过程如下所示。
即使在删除PVC后,您也可以使用相同的PV挂载到不同的pod和数据(PV必须存在,如果storageclass的回收策略为Retain,则通常会存在)
验证PV是否处于已释放状态。(即目前没有pvc声称拥有它)
➜ ~ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-eae6acda-59c7-11e9-ab12-06151ee9837e 16Gi RWO Retain Released default/dhanvi-test-pvc gp2 52m
编辑PV (kubectl edit pv pvc-eae6acda-59c7-11e9-ab12-06151ee9837e
)并删除spec.claimRef部件。PV声明将被取消,如下所示。
➜ ~ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-eae6acda-59c7-11e9-ab12-06151ee9837e 16Gi RWO Retain Available gp2 57m
然后使用PVC认领PV,如下所示。
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: dhanvi-test-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 16Gi
volumeName: "pvc-eae6acda-59c7-11e9-ab12-06151ee9837e"
可以在pods中使用,如下所示。
volumes:
- name: dhanvi-test-volume
persistentVolumeClaim:
claimName: dhanvi-test-pvc
更新:卷克隆可能会对https://kubernetes.io/blog/2019/06/21/introducing-volume-cloning-alpha-for-kubernetes/有所帮助
发布于 2018-04-17 22:37:55
有三种回收策略定义了删除绑定卷声明后对持久卷的处理情况
保留
的
删除是指删除外部基础架构中的持久卷和关联的存储资产。
Recycle将清理卷rm -rf / volume /*,之后它将可用于新的持久卷申请。
Retain使持久卷处于已释放状态,这不允许新的持久卷声明回收它。整个回收过程都是手动的。您需要自行删除持久卷。您可以备份存储资产中的数据,然后删除数据。然后,您可以删除存储资产或为此资产创建新的持久卷。
如果您想使用Kubernetes将数据写入另一个持久卷,则可以使用Job复制数据。
在这种情况下,请确保使用持久卷访问模式ROX - ReadOnlyMany或RWX - ReadWriteMany,并启动一个运行容器的作业,该容器声明使用选择器备份持久卷,并声明另一个目标备份卷。然后通过容器复制数据。
或者,您可以在Kubernetes之外进行备份。然后,您的方法取决于您使用的存储资产的类型。例如,如果您使用的是NFS,您可以通过命令行挂载源和目标并复制数据。
我提出的两种选择或多或少都是手动备份策略。如果您的目标是为生产工作负载制定更复杂的备份策略,则可以考虑使用Stash - Backup for your disks for production workloads in Kubernetes
发布于 2020-11-04 11:17:51
正如Tummala Dhanvi在回答中所述,必须处理spec.claimRef
部分。如果你只有一个PV,那么移除整个spec.claimRef
是很有用的,但如果你有多个PV要“拯救”,这将证明非常糟糕。
第一步是确保PV具有Retain
回收策略,然后再删除。您可以编辑或修补PV来实现这一点
kubectl edit pv pvc-73e9252b-67ed-4350-bed0-7f27c92ce826
spec.persistentVolumeReclaimPolicy
keyRetain
for value在一个命令kubectl patch pv pvc-73e9252b-67ed-4350-bed0-7f27c92ce826 -p "{\"spec\":{\"persistentVolumeReclaimPolicy\":\"Retain\"}}"
中使用
现在您可以删除PVC(使用helm
或其他方式),PV不会被删除。
要成功地将PV重新挂载到所需的pod,您必须再次编辑PV配置,这次是spec.claimRef
部分。但不要删除整个部分。而应仅删除resourceVersion
和uid
键。然后,生成的部分将如下所示
...
capacity:
storage: 16Gi
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: database
namespace: staging
nodeAffinity:
...
对您的所有PV重复此操作,然后它们在kubectl get pv
输出中的状态将为Available
。通过保持spec.claimRef.name
和spec.claimRef.namespace
密钥不变,我们确保了具有相应spec
(在我的例子中是staging/database
)的新PVC将被绑定到它应该绑定到的PV。
此外,请确保您的新声明没有指定比PV实际拥有的存储容量更大的存储容量(尽管新声明的容量可能小于现有PV的容量)。如果新的PVC需要更大的存储空间,则会创建一个新的PV。最好保持不变。
离题:如果您使用的storageClass
允许调整卷的大小,您可以稍后调整它的大小;这里解释了如何调整:https://kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/
我在这方面的经验是相当紧张的。我已经有6个PV了,完全处于Retain
模式。由于某些原因,新的部署部署被卡住了,两个pods就是不想终止。最后,我删除了整个部署(使用helm
),重新启动集群节点,然后重新部署。这导致创建了6个新的PV!
我找到了这个线程,然后删除了所有PV的spec.claimRef
。删除和部署安装再次导致PV被重用,但它们没有挂载到它们应该挂载的位置,数据不在那里。经过大量的挖掘,我发现database
卷被挂载到RabbitMQ pod,mongodb
被挂载到ElasticSearch等等。
我花了十几次才弄明白这一点。幸运的是,对我来说,混杂的卷挂载并没有破坏任何原始数据。pods初始化并没有清理卷,只是在那里写入了它们的内容。
希望这能省去一些严重的麻烦!
https://stackoverflow.com/questions/49859036
复制相似问题